溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中Struts2處理流程是怎樣的

發布時間:2022-01-06 17:37:30 來源:億速云 閱讀:150 作者:iii 欄目:編程語言

本篇內容介紹了“Java中Struts2處理流程是怎樣的”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

看看Struts-2的處理流程:

1) Browser產生一個請求并提交框架來處理:根據配置決定使用哪些攔截器、action類和結果等。

2) 請求經過一系列攔截器:根據請求的級別不同攔截器做不同的處理。這和Struts-1的RequestProcessor類很相似。

3) 調用Action: 產生一個新的action實例,調用業務邏輯方法。

4) 調用產生結果:匹配result class并調用產生實例。

5) 請求再次經過一系列攔截器返回:過程也可配置減少攔截器數量

6) 請求返回用戶:從control返回servlet,生成Html。

這里很明顯的一點是不存在FormBean的作用域封裝,直接可以從Action中取得數據。 這里有一個Strut-2配置的web.xml文件:

<filter>     <filter-name>   controller   </filter-name>            <filter-class>   org.apache.struts.action2.dispatcher.FilterDispatcher    </filter-class>     </filter>     <filter-mapping>             <filter-name>   cotroller   </filter-name>             <url-pattern>   /*   </url-pattern>     </filter-mapping>

注意到以往的servlet變成了filter,ActionServlet變成了FilterDispatcher,*.do變成了/*。filter配置定義了名稱(供關聯)和filter的類。filter mapping讓URI匹配成功的的請求調用該filter。默認情況下,擴展名為 ".action "。這個是在default.properties文件里的 "struts.action.extension "屬性定義的。

default.properties是屬性定義文件,通過在項目classpath路徑中包含一個名為“struts.properties”的文件來設置不同的屬性值。而Struts-2的默認配置文件名為struts.xml。由于1和2的action擴展名分別為.do和.action,所以很方便能共存。我們再來看一個Struts-2的action代碼:

public class MyAction {  public String execute() throws Exception {  //do the work    return "success ";  }  }

很明顯的區別是不用再繼承任何類和接口,返回的只是一個String,無參數。實際上在Struts-2中任何返回String的無參數方法都可以通過配置來調用action。所有的參數從哪里來獲得呢?答案就是Inversion of Control技術(控制反轉)。筆者盡量以最通俗的方式來解釋,我們先試圖讓這個Action獲得reuqest對象,這樣可以提取頁面提交的任何參數。那么我們把request設為一個成員變量,然后需要一個對它的set方法。由于大部分的action都需要這么做,我們把這個set方法作為接口來實現。

public interface ServletRequestAware {  public void setServletRequest(HttpServletRequest request);  }  public class MyAction implements ServletRequestAware {  private HttpServletRequest request;  public void setServletRequest(HttpServletRequest request) {  this.request = request;  }  public String execute() throws Exception {  // do the work directly using the request  return Action.SUCCESS;  }  }

那么誰來調用這個set方法呢?也就是說誰來控制這個action的行為,以往我們都是自己在適當的地方寫上一句action.setServletRequest(&hellip;),也就是控制權在程序員這邊。然而控制反轉的思想是在哪里調用交給正在運行的容器來決定,只要利用Java反射機制來獲得Method對象然后調用它的invoke方法傳入參數就能做到,這樣控制權就從程序員這邊轉移到了容器那邊。程序員可以減輕很多繁瑣的工作更多的關注業務邏輯。Request可以這樣注入到action中,其他任何對象也都可以。為了保證action的成員變量線程安全,Struts-2的action不是單例的,每一個新的請求都會產生一個新的action實例。

那么有人會問,到底誰來做這個對象的注入工作呢?答案就是攔截器。攔截器又是什么東西?筆者再來盡量通俗的解釋攔截器的概念。大家要理解攔截器的話,首先一定要理解GOF23種設計模式中的Proxy模式。

A對象要調用f(),它希望代理給B來做,那么B就要獲得A對象的引用,然后在B的f()中通過A對象引用調用A對象的f()方法,最終達到A的f()被調用的目的。有沒有人會覺得這樣很麻煩,為什么明明只要A.f()就可以完成的一定要封裝到B的f()方法中去?有哪些好處呢?

1) 這里我們只有一個A,當我們有很多個A的時候,只需要監視B一個對象的f()方法就可以從全局上控制所有被調用的f()方法。

2) 另外,既然代理人B能獲得A對象的引用,那么B可以決定在真正調A對象的f()方法之前可以做哪些前置工作,調完返回前可有做哪些后置工作。

講到這里,大家看出來一點攔截器的概念了么?它攔截下一調f()方法的請求,然后統一的做處理(處理每個的方式還可以不同,解析A對象就可以辨別),處理完畢再放行。這樣像不像對流動的河水橫切了一刀,對所有想通過的水分子進行搜身,然后再放行?這也就是AOP(Aspect of Programming面向切面編程)的思想。

Anyway,Struts-2只是利用了AOP和IoC技術來減輕action和框架的耦合關系,力圖到***程度重用action的目的。在這樣的技術促動下,Struts-2的action成了一個簡單被框架使用的POJO(Plain Old Java Object)罷了。實事上AOP和IoC的思想已經遍布新出來的每一個框架上,他們并不是多么新的技術,利用的也都是JDK早已可以最到的事情,它們代表的是更加面向接口編程,提高重用,增加擴展性的一種思想。

“Java中Struts2處理流程是怎樣的”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女