Struts是當前非常流行且穩定的基於MVC設計模式的Web應用程序框架,使用它的目的就是幫助我們更加靈活開發Web應用,以及節省開發時間。
Struts2並不是一個全新的框架,早在2001年就已經出現了Struts1,然後又基於WebWork框架開發出了Struts2,所以Struts的穩定性,成熟度都是相當可靠的,並且結合了Struts1及WebWork的優點
Struts2使用了Annotation(註解)方面的知識
下載Struts2的jar包網站:http://struts.apache.org/ 歷史版本下載地址:http://archive.apache.org/dist/
使用Struts2步驟:
1.創建了web項目之後,導入相應的Struts2的jar包後,就要對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>
MVC框架都需要與web應用整合,這就不得不藉助於web.xml配置文件,只有在web.xml文件中Servlet纔會被應用加載。
通常,所有的MVC框架都需要web應用加載一個核心控制器,那麼在Struts2中,需要加載StrutsPrepareAndExecuteFilter,只要web應用加載,StrutsPrepareAndExecuteFilter,StrutsPrepareAndExecuteFilter將會加載Struts2框架
因爲Struts2將核心控制器設置成Filter而不是Servlet
2.創建Struts2的配置文件,struts.xml 在這裏配置相應的映射 如:
要定義相應的包
<package name="adminBasePkg" namespace="/admin" extends="json-default">
<!--包裏的action及result可在代碼用使用註解實現-->
</package>
比如:在類名稱上加上註解:
@Namespace("/admin/adminclassManager")
@ParentPackage("adminBasePkg")
在具體的action方法上加上註解:
@Action(value="classManager",results={
@Result(name="classManager",location="/admin/adminclassManager/classManager.jsp")})
action方法返回字符串爲:return "classManager"
result屬性裏還有location屬性,用來定位該視圖資源的位置,上面也已經給出了例子
同是result還可以用多個result來表達多種不同的返回結果,如:
@Results({
@Result(name="0_index",location = "/admin/adminIndex.jsp"),
@Result(name="1_index",location = "/teacher/teacherIndex.jsp"),
@Result(name="2_index",location = "/student/studentIndex.jsp"),
@Result(name="input",location = "/login.jsp"),
//驗證賬號密碼
@Result(name=com.opensymphony.xwork2.Action.ERROR,location = "/500.jsp")
})
上面的Namespace及Action及Result命名視具體情況而定
各種攔截器的配置也是在這裏配置
還有以下配置可按具體情況添加:
<!-- 請求參數的編碼方式-->
<constant name="struts.i18n.encoding" value="UTF-8"/>
<!-- 指定被struts2處理的請求後綴類型。多個用逗號隔開-->
<constant name="struts.action.extension" value="action,do,htm"/>
<!-- 當struts.xml改動後,是否重新加載。默認值爲false(生產環境下使用),開發階段最好打開 -->
<constant name="struts.configuration.xml.reload" value="true"/>
<!-- 是否使用struts的開發模式。開發模式會有更多的調試信息。默認值爲false(生產環境下使用),開發階段最好打開 -->
<constant name="struts.devMode" value="true"/>
<!-- 設置瀏覽器是否緩存靜態內容。默認值爲true(生產環境下使用),開發階段最好關閉 -->
<constant name="struts.serve.static.browserCache" value="false" />
<!-- 是否開啓動態方法調用-->
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
3.struts.properties文件:是Struts的全局 屬性文件,自動加載。該文件包含很多key-value對,該文件完全可以配置在struts.xml中,使用constant元素
4.設計一個所有Action的父類,繼承ActionSupport
Struts2工作原理圖:
通過文字來表述該過程就是:用戶通過頁面發送HttpServletRequest向Servlet容器即Tomacat(或者使用其它)提交一個請求,這個請求會經過一系列的過濾器,可以是自定義也可以使用Struts2的,最終會被著名的Struts2過濾器StrutsPrepareAndExecuteFilter核心控制器攔截,核心控制器會訪問ActionMapper來決定是否要調用某一個Action,如果用戶請求的是jsp頁面或其它與action無關的資源,則不會訪問action,如果判斷用戶要訪問Action,則ActionMapper會告訴核心控制器,然後核心控制器會將控制器委派爲ActionProxy,然後該代理會通過Configuration Manager來加載配置文件即Struts.xml來找到需要調用的Action,找到之後ActionProxy會創建Action Invocation實例,裏面包括了所需要創建的Action實例,以及一系列的攔截器,在調用Action之前,會按順序執行一系列攔截器,再調用Action中的業務處理,然後方法返回一個結果,通常是字符串,該字符串根據result與某一jsp頁面對應或者再調用某個Action,這時還需要按逆序來重新執行一遍攔截器,纔會進行最後的通過HttpServletResponse來響應用戶。
Struts2提供了三種方式去訪問Servlet API
1.ActionContext
2.實現ServletRequestAware, ServletResponseAware, ServletContextAware接口
3.ServletActionContext
動態方法調用
1.指定method(不常用)
2.感嘆號方式(不常用)
3.通配符方式(常用)
通過註解來實現action的配置更爲方便
後臺獲取jsp參數的方法:
1.使用Action的屬性接收參數
2.使用DomainModel接收參數
3.使用Model Driven接收參數(常用)
表單驗證
通過validate()方法可以對登錄等請求進行驗證,然後在jsp頁面通過
<div>
<s:fielderror/> <!-- 顯示錶單驗證的出錯信息 -->
</div>
Struts2處理流程
Struts2的攔截器:
Struts2的很多核心功能都是通過攔截器實現的,例如數據轉移、數據校驗、數據轉換等
攔截器方法在Action執行之前和之後都會涉及
通過攔截器棧可以將過個攔截器組合在一起
定義攔截器的方法
1.創建一個攔截器類實現Interceptor接口(少用)
2.創建一個攔截器類繼承AbstractInterceptor類(常用),提供了init()和destroy()方法空實現,只需實現intercept()即可
在Struts.xml文件中配置攔截器,如:
<interceptors>
<interceptor name="systemInterceptor" class="packageName.SystemInterceptor"></interceptor>
</interceptors>
然後在需要用到攔截器的Action中,添加註解
@Action(interceptorRefs={@InterceptorRef("systemInterceptor")})
Struts2的內建攔截器:
1.params:負責將請求參數轉化爲Action的屬性值
2.staticParams:將配置文件中Action的子元素params參數設置爲Action屬性
3.ServletConfig:將源於Servlet API各種對象注入到Action中,必須實現對應接口(ServletRequestAware, ServletResponseAware, ServletContextAware)
4.fileUpload攔截器:實現文件上傳,將文件及其元數據設置到Action中
5.exception攔截器:將異常信息映射到用戶自定義的頁面
6.validation攔截器:數據驗證
如果不定義攔截器,則會默認調用默認攔截器棧:
<interceptors-ref name = "defaultStact"></interceptors-ref>
注意:如果自己手動引用了其它攔截器藍,則默認攔截器棧就不會調用,所以建議在自己引用的攔截器前添加上默認的攔截器棧
以上便是個人見解,歡迎討論