一、Struts2概述
Struts2是一個基于MVC設計模式的Web應用框架,它本質上相當于一個servlet,在MVC設計模式中,Struts2作為控制器(Controller)來建立模型與視圖的數據交互。Struts 2是Struts的下一代產品,是在 struts 1和WebWork的技術基礎上進行了合并的全新的Struts 2框架。
二、Struts2主要功能
1.允許POJO(Plain Old Java Objects)對象 作為Action,
2.Action的execute 方法不再與Servlet API耦合,
3.更易測試,支持更多視圖技術(JSP、FreeMarker、Velocity),
4.基于Spring AOP思想的攔截器機制,更易擴展,
5.更強大、更易用輸入校驗功能
6.整合Ajax支持
三、Struts2的下載與安裝
http://struts.apache.org/download.cgi 去下載Struts2 最新版
struts2目錄結構
apps 該文件夾包含了基于struts2 的示例應用,這些示例應用對于學習者是非常有用的
docs 該文件夾下包含了struts2 相關文檔,包括struts2 快速入門、struts2的文檔以及API文檔等
lib 該文件夾下包含了Struts2框架和核心類庫,以及struts2第三方插件類庫
src 該文件夾下包含了Struts2框架的全部源代碼
開發時沒必要將lib目錄下jar文件全部復制到項目中
三、Struts2的的執行流程
四、Struts2的HelloWorld
1.創建WEB工程
asm-3.3.jar 【操作java字節碼的類庫】
asm-commons-3.3.jar 【提供了基于事件的表現形式】
asm-tree-3.3.jar 【提供了基于對象的表現形式】
commons-fileupload-1.2.2.jar 【文件上傳相關包】
commons-io-2.0.1.jar 【流相關包】
commons-lang3-3.1.jar 【struts對java.lang包的擴展】
freemarker-2.3.19.jar 【struts的標簽模板庫jar文件】
javassist-3.11.0.GA.jar 【struts對字節碼的處理相關jar】
ognl-3.0.5.jar 【Ognl表達式功能支持表】
struts2-core-2.3.4.1.jar 【struts2核心功能包】
xwork-core-2.3.4.1.jar 【Xwork核心包】
2.編寫JSP頁面
helloword.jsp (發起請求頁面)
<a href="${pageContext.request.contextPath}/hello.action"> helloworld</a>
添加對Struts2 框架的訪問鏈接,默認情況下框架接受以.action請求,并進行處理
success.jsp (結果頁面)
<h1>Struts2 Hello</h1>
結果頁面顯示 struts2框架訪問成功
3.編寫Action處理訪問Struts2框架請求
public class HelloAction {
public String execute(){
System.out.println("hello world");
return "success"; // 結果頁面命名
}
}
struts2 的Action類似以前編寫的Servlet程序,可以處理用戶提交請求,但是Struts2的Action可以POJO對象
4.配置Struts2核心控制器
web.xml
<filter>
<filter-name>struts2</filter-name>
<filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
過濾器配置/* , 但是struts2 默認處理.action結尾請求,分發到相應Action類
5.在struts.xml配置action
<struts>
<!-- name 隨便寫 extends 固定寫法 -->
<package name="default" extends="struts-default" >
<action name="hello" class="com.lanou.action.HelloAction" method="execute">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
- package,用于定義一個包,用于管理action
name屬性必需的并且唯一
extends屬性用于指定要擴展的包 - action元素用于配置Struts2的Action類
name屬性是請求的的路徑
class屬性是要調用的action類
method屬性是要執行類中的方法 - result元素用于設定Action結束后,系統下一步將要做什么
name屬性為 action中method執行方法的返回值
type屬性為跳轉的結果類型
dispatcher 轉發 (默認)
redirect 重定向
redirectAction 重定向到action資源
執行說明:
瀏覽器發出xxx.action請求至服務器;
服務器接收后,根據web.xml的配置,將請求發送給指定的Struts2的過濾器;
過濾器根據struts.xml的配置內容,將請求發送給xxAction類的對象,并調用默認的execute()方法;
根據execute()方法的返回結果,在struts.xml文件中根據匹配的處理果,完成向success.jsp頁面跳轉;
頁面根據上下文中的內容,借助Struts2的OGNL表達式和Struts2標簽將內容現在在頁面中。(注意:在使用Struts2標簽的時,首先導入Struts2的標簽)
詳細請求流程
Struts2請求流程
- 客戶端發送請求
- StrutsPrepareAndExecute通過ActionMapper來決定這個Request需要調用哪個Action
- 如果ActionMapper決定調用某個Action,FilterDispatcher把請求的處理交給ActionProxy,這兒已經轉到它的Delegate--Dispatcher來執行
- ActionProxy根據ActionMapping和ConfigurationManager找到需要調用的Action類
- ActionProxy創建一個ActionInvocation的實例
- ActionInvocation調用真正的Action,當然這涉及到相關攔截器的調用
- Action執行完畢,ActionInvocation創建Result并返回,當然,如果要在返回之前做些什么,可以實現PreResultListener
五、Struts2常用配置
1. 配置文件的加載順序
struts2框架要能執行,必須先加載StrutsPrepareAndExecuteFilter.
在StrutsPrepareAndExecuteFilter的init方法中對Dispatcher進行了初始化.
在Dispatcher類中定義的init方法內就描述了struts2配置文件加載的順序
init_DefaultProperties(); // [1] ---------- org/apache/struts2/default.properties
init_TraditionalXmlConfigurations(); // [2] --- struts-default.xml,struts-plugin.xml,struts.xml
init_LegacyStrutsProperties(); // [3] --- 自定義struts.properties init_CustomConfigurationProviders(); // [5] ----- 自定義配置提供
init_FilterInitParameters() ; // [6] ----- web.xml
init_AliasStandardObjects() ; // [7] ---- Bean加載
1. default.properties文件
作用:定義了struts2框架中所有常量
位置: org/apache/struts2/default.properties
2. struts-default.xml
作用:配置了bean, interceptor, result等。
位置:在struts的core核心jar包.
struts-plugin.xml
它是struts2框架中所使用的插件的配置文件。
struts.xml
我們使struts2所使用的配置文件。
3. 自定義的struts.properties
就是可以自定義常量。
4. web.xml
在開發中,后加載文件中的配置會將先加載文件中的配置覆蓋。
default.properties
struts-default.xml
struts.xml
2. 關于Action的配置
- <package> 作用:是用于聲明一個包。用于管理action。
- name 它用于聲明一個包名,包名不能重復,也就是它是唯一的。
- namespace 它與action標簽的name屬性合并確定了一個唯一訪問action的路徑。
- extends 它代表繼承的包名。
- abstrace 它可以取值為true/false,如果為true,代表這個包是用于被繼承的。
- <action> 用于聲明 一個action
- name 就是action的一個名稱,它是唯一的(在同包內) 它與package中的namespace確定了訪問action的路徑。
- class Action類的全名
- method 要訪問的Action類中的方法的名稱,方法無參數 ,返回值為String.
- <result> 用于確定返回結果類型
- name 它與action中的方法返回值做對比,確定跳轉路徑。
- type 跳轉的結果類型
關于action配置其它細節:
- 關于默認值問題
<package namespace="默認值"> namespace的默認值是""
<action class="默認值" method="默認值">
class的默認值是 com.opensymphony.xwork2.ActionSupport
method的默認值是 execute
<result name="默認值"> name的默認值是 "success"
- 關于訪問action的路徑問題
Action的訪問路徑 = 包名稱空間 namespace + Action name屬性
現在的action的配置是:
<package name="default" namespace="/" extends="struts-default">
<action name="hello" class="cn.lanou.action.DefaultAction">
<result>/hello.jsp</result>
</action>
</package>
當我們輸入:
http://localhost/struts2_day01_2/a/b/c/hello
也訪問到了action。
原因:struts2中的action被訪問時,它會首先查找
1.namespace="/a/b/c" action的name=hello 沒有.
2.namespace="/a/b action的name=hello 沒有
3.namespace="/a" action的name=hello 沒有
4.namespace="/" action的name=hello 查找到了.
如果最后也查找不到,會報404錯誤.
- 默認的action。
作用:處理其它action處理不了的路徑。
<default-action-ref name="action的名稱" />
配置了這個,當訪問的路徑,其它的action處理不了時,就會執行name指定的名稱的action。
- action的默認處理類
在action配置時,如果class不寫。默認情況下是 com.opensymphony.xwork2.ActionSupport。
<default-class-ref class="cn.lanou.action.DefaultAction"/>
如果設置了,那么在當前包下,默認處理action請的的處理類就為class指定的類。
3. Struts常量的配置
default.properties定義了struts2 框架的大量常量,開發者可以通過改變這些常量來滿足應用的需求
修改struts2 的配置常量,可以通過以下三種方式配置
- 配置src/struts.xml
<constant name="struts.devMode" value="true" />
- 配置src/struts.properties
struts.devMode = false
- 配置web.xml
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.devMode</param-name>
<param-value>false</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
常用的常量介紹
指定默認編碼集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的輸出
<constant name="struts.i18n.encoding" value="UTF-8"/>
該屬性指定需要Struts 2處理的請求后綴,該屬性的默認值是action,即所有匹配*.action的請求都由Struts2處理。
如果用戶需要指定多個請求后綴,則多個后綴之間以英文逗號(,)隔開
<constant name="struts.action.extension" value="action"/>
設置瀏覽器是否緩存靜態內容,默認值為true(生產環境下使用),開發階段最好關閉
<constant name="struts.serve.static.browserCache" value="false"/>
當struts的配置文件修改后,系統是否自動重新加載該文件,默認值為false(生產環境下使用),開發階段最好打開
<constant name="struts.configuration.xml.reload" value="true"/>
開發模式下使用,這樣可以打印出更詳細的錯誤信息
<constant name="struts.devMode" value="true" />
默認的視圖主題
<constant name="struts.ui.theme" value="simple" />
與spring集成時,指定由spring負責action對象的創建
<constant name="struts.objectFactory" value="spring" />
該屬性設置Struts 2是否支持動態方法調用,該屬性的默認值是true。如果需要關閉動態方法調用,則可設置該屬性
為 false
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
上傳文件的大小限制
<constant name="struts.multipart.maxSize" value=“10701096"/>
4. 指定多個Struts配置文件
在大部分應用里,隨著應用規模的增加,系統中Action的數量也會大量增加,導致struts.xml配置文件變得非常臃腫。為了避免struts.xml文件過于龐大、臃腫,提高struts.xml文件的可讀性,我們可以將一個struts.xml配置文件分解成多個配置文件,然后在struts.xml文件中包含其他配置文件。下面的struts.xml通過<include>元素指定多個配置文件:
<struts>
<include file="struts-part1.xml"/>
<include file="struts-part2.xml"/>
</struts>
通過這種方式,我們就可以將Struts 2的Action按模塊添加在多個配置文件中。