Struts2框架幾乎是目前最優秀的MVC框架之一。Struts2框架是WebWork框架和Struts1框架的結合體。java
Struts2結構體系web
注:如今StrutsPrepareAndExecuteFilter過濾器已經代替了FilterDispatcher過濾器。apache
工做原理:當客戶端發送一個HTTP請求時,須要通過一個過濾器鏈,這個過濾器鏈包括ActionContextClearUp過濾器,其餘WEB應用過濾器及StrutsPrepareAndExecuteFilter過濾器,其中StrutsPrepareAndExecuteFilter過濾器是必需要配置的。編程
當StrutsPrepareAndExecuteFilter過濾器被調用時,ActionMapper將查找須要調用的Action對象,並返回該對象的代理ActionProxy。而後ActionProxy將從配置管理器ConfigurationManager中讀取Struts2的相關配置(struts.xml)。Action容器ActionInvocation調用指定的Action對象,在調用以前須要通過Struts2的一系列攔截器。瀏覽器
當Action處理請求後,將返回相應的結果視圖,在這些視圖中可使用Struts2標籤顯示數據並控制數據邏輯。而後HTTP請求迴應給瀏覽器,在迴應的過程當中一樣通過過濾器。session
Struts2的用法app
①添加jar包框架
struts2-core,xwork-core,ognl,freemarker,commons-io,commons-fileupload,javassist-GA,asm-commons,asm,commons-langjsp
②Struts2框架主要經過一個過濾器將Struts2集成到Web應用中,這個過濾器對象就是org.apache.Struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter。經過它Struts2便可攔截Web應用中的http請求,並將這個http請求轉發到指定的Action進行處理,Action根據處理的結果返回給客戶端相應的頁面。所以在Struts2中,過濾器StrutsPrepareAndExecuteFilter是web應用與struts2 API的入口。this
在web.xml中聲明struts2提供的過濾器
<filter> <filter-name>struts</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filetr.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts</filter-name> <url-pattern>/*</url-pattern> <filter-pattern>
③在web應用的src文件夾下,建立struts.xml,在其中定義Struts2中的Action對象
<struts> <package name="myPackage" extends="struts-default" method=""> <action name="first" class=""> <result name="" type="">/first.jsp</result> </action> </package> </struts>
Action對象
Action對象主要用來處理http 請求。在struts2 API中,Action對象是一個接口com.opensynphony.xwork.xwork2.Action。在此接口中,定義了五個常量(SUCCESS,NONE,ERROR,INPUT,LOGIN)和一個方法(execute())。
①請求參數的注入原理
在struts2框架中,表單提交的數據會自動注入到與Action對象中相對應的屬性中去,它與Spring IOC注入原理一致,經過Action對象爲屬性提供setter方法進行注入。
②Action的基本流程
當瀏覽器向web容器發送一個HTTP請求時,Web容器就要調用Struts2過濾器的doFilter()方法。此時Struts2接收到HTTP請求,經過Struts2的內部處理機制會判斷這個請求是否與某個Action對象相匹配。若是找到匹配的Action,就會調用Action對象的execute方法,並根據處理結果返回相應的值。而後Struts2經過Action的返回值查找返回值所映射的頁面,最後通過必定的視圖處理後將頁面迴應給瀏覽器。
Struts2的標籤庫
首先要引入標籤<%@ taglib prefix="s" url="/struts-tags" %>
①property 屬性 default value escape
②set 屬性 scope value var
<s:set var="username" value="kaka" scope="request"/>
<s:property default="none" value="#request.username"/>
③a 屬性 action href id method namespace
④param 屬性 name value
⑤action
⑥push 將值推入值棧 value
⑦include 屬性 file
⑧url 屬性 action method namespace value var
⑨if elseif else 屬性 test
10,iterator 屬性var value
傳遞參數
①直接在Action類中定義屬性和屬性的setter方法。
②定義一個對象引用,但在請求參數中必須指定參數鎖對應的實體對象。
public class UserAction extends ActionSupport { private User user; public User getUser(){ return user; } public void setUser(User user){ this.user = user; } public String execute(){ return SUCCESS; } } <input type="text" name="user.username"/> <input type="text" name="user.password"/>
③採用ModelDriven模式傳遞參數
public class UserAction extends ActionSupport implements<User> { private User user = new User(); public User getModel(){ return this.user; } public String execute(){ return SUCCESS; } } <input type="text" name="username"/> <input type="text" name="password"/>
ModelDriven過程:Struts2首先實例化Action對象,而後判斷該對象是否實現了ModelDriven接口,如果,則調用getModel方法來獲取實體對象模型,在以後的操做中對此實體對象進行賦值。
爲何要使用struts2代替struts1.x
(1)struts2的execute方法中的參數不會依賴於servletAPI,實現了也servlet解耦,是一種無侵入式的設計。
(2)struts2提供了攔截器,利用攔截器能夠進行AOP編程,實現權限攔截等功能。
(3)struts2提供了類型轉換器,咱們能夠很容易地對請求參數轉換成須要的類型。
(4)提供了同種表現層技術支持,如JSP、freeMarker、velocity等
(5)能夠對指定的方法進行校驗,能夠輕鬆地實現表單校驗功能
(6)提供了全局範圍、包範圍和action範圍的國際化資源文件管理實現。
Struts2的攔截器
攔截器是實現AOP的一種,經過它能夠在Action執行先後進行一些相應的操做。攔截器能在action被調用以前和被調用以後執行一些「代碼」。Struts2框架的大部分核心功能都是經過攔截器來實現的,如防止重複提交、類型轉換、對象封裝、校驗、文件上傳、頁面預裝載等等,都是在攔截器的幫助下實現的。每個攔截器都是獨立裝載的(pluggable),咱們能夠根據實際的須要爲每個action配置它所須要的攔截器。
<package name="myFirst" namespace="/" extends="struts-default"> <interceptors> <interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor" /> <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor" /> </interceptors> <action name="login" class="com.asm.LoginAction"> <interceptor-ref name="timer"></interceptor-ref> <interceptor-ref name="params"></interceptor-ref> <result name="loginSuccess">/success.jsp</result> <result name="loginFailure">/failure.jsp</result> </action> </package>
注意:雖然extends繼承的strust-default自帶有params攔截器,可是當咱們本身引用了攔截器時,繼承struts-default將不會再爲咱們分配默認的攔截器(有點相似構造器),可是咱們仍然能夠經過<interceptor-ref name="defaultStack"/>來繼續使用struts-defalut的攔截器。
獲取Servlet API
public class Login2Action extends ActionSupport implements RequestAware,SessionAware,ApplicationAware { private String username; Map request; Map session; Map application; public String execute() throws Exception { request.put("req", "requst屬性"); session.put("ses", "sesion屬性"); application.put("app", "application屬性"); return SUCCESS; } public void setRequest(Map<String, Object> request) { this.request=request; } public void setSession(Map<String, Object> session) { this.session=session; } public void setApplication(Map<String, Object> application) { this.application=application; } ...省略username的get/set方法 }