Struts2框架使用及原理及其攔截器解析

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> 

注意:如果自己手動引用了其它攔截器藍,則默認攔截器棧就不會調用,所以建議在自己引用的攔截器前添加上默認的攔截器棧

以上便是個人見解,歡迎討論




發佈了78 篇原創文章 · 獲贊 26 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章