建立一個struts2 web應用程序
1. 創建一個基本的web應用程序
2. 添加struts2的jar文件到Class Path
將struts2的最小jar包拷到WEB-INF/lib目錄,包括以下文件:
1 asm-x.x.jar 2 asm-commons-x.x.jar 3 asm-tree-x.x.jar 4 commons-fileupload-X.X.X.jar 5 commons-io-X.X.X.jar 6 commons-lang3-X.X.X.jar 7 commons-fileupload-X.X.X.jar 8 freemarker-X.X.X.jar 9 javassist-X.X.X.jar 10 ognl-X.X.X.jar 11 struts2-core-X.X.X.X.jar 12 xwork-core-X.X.X.jar
3. 為struts2添加Servlet Filter
只有在WEB-INF/web.xml中添加了struts2的Servlet Filter和filter-mapping后stuts2才能運行。
<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>
4. 添加struts.xml
如果不顯示指定,運行時struts.xml的默認位置為Source Folder on Build Path(源文件默認src目錄)的編譯輸出位置(默認WEB-INF/lib/classes)。如果要更改struts.xml的位置,需要在web.xml中更改struts2 Servlet Filter的初始化屬性。
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <init-param> <param-name>config</param-name> <!-- 指定struts.xml位置為WEB-INF/classes/struts/struts.xml,也就是對應源文件位置src/struts/struts.xml --> <param-value>struts/struts.xml</param-value> </init-param> </filter>
struts.xml常用基本配置
1. 常用的基本標簽
- <const name="....." value="..." />。 設置常量值
- <include file="包含的其它struts配置文件.xml" />
- <package name="package名稱" extends="該package繼承自" namespace="命名空間(請求地址action的父級)"></package>
- <action name="action名(請求地址中action名)或者帶通配符*" class="處理該請求的Action類的全限定名" method="處理該請求的Action類的中的方法名(如前前面有通配符,用{1}指代第1個通配符)"></action>
- <global-results></global-results>。放在某個package里,里面存放全局的<result>,如果局部沒有對應的<result>標簽則查找全局<result>
- <result name="Action類中方法處理的返回結果" type="">要轉向的頁面或action</result>。局部<result>標簽可以作為<action>的子元素,也可以作為<global-results>的子元素
- <interceptors></interceptors>。放在某個package里,里面存放所有的<interceptor>和<interceptor-stack>
- <interceptor name="inteceptor名稱" class="該inteceptor對應的類(繼承MethodFilterInterceptor或AbstractInterceptor等)全限定名" />
- <interceptor-stack name="攔截器棧的名稱">。
- <interceptor-ref name="被引用的interceptor名" />。存放一個interceptor的引用,如果該標簽定義在<action></action>內,表示攔截指向該action的請求。繼承自struct-default的package里的action都會調用名為defaultStack的interceptor,除非在<action>內定義有interceptor-ref,或者重新定義一個名為defaultStack的interceptor-stack,或者設置<default-interceptor-ref>。
另外,<interceptor-ref>標簽內可以設置參數:<param name="excludeMethods">不需要攔截的地址(可以用逗號隔開不同地址、帶通配符*)</param>。 - <default-interceptor-ref name="interceptor-stack名"/>。用來設置該package中的默認攔截器
2. Action類的實現
struts2中不要求Action類需要繼承自哪些struts2的某些基類或實現struts2的某些接口,因此是低侵入性的。但一般為了設計的方便都會讓它繼承ActionSupport類並重載execute方法。struts2中Action的參數傳遞一般分為兩種方式:屬性驅動和模型驅動;Action中訪問Servlet API是通過ActionContext實現的;一個Action通過不同方法處理多個請求時可以通過設置請求url="action!|方法名"或設置<action>標簽的method屬性實現。
2.1 Action參數傳遞方式
屬性驅動:即是通過Action封閉請求的參數,Action中需要有傳遞的參數(以及返回結果)屬性且都必須有getter和setter方法。如此一來,用戶向Servlet發送的請求數據就需要是這種格式:name:....,pwd:....。而Action就要用name、pwd屬性以及兩者的getter和setter方法。
模型驅動:也就是通過javaBean實現參數的傳遞。需要有一個傳遞的參數的類,另外Action必須實現ModelDriven<傳遞參數的類型>。假設我們要向Action傳遞一個User類對象(包含name和pwd),那么用戶發送請求時,參數的格式就是usr.name:....,usr.pwd:....;同時Action里有一個usr屬性和usr的getter和setter方法。
2.3 ActionContext
ActionContext里存儲了當前Action的上下文信息。每一個由於用戶請求而創建的線程都對應一個有效的ActionContext對象。靜態方法ActionContext.getContext()返回當前線程的ActionContext。常用的方法有get/set, getParameters, get/setSession等。另外可以用Action.getContextMap獲取ActionContext中存儲的Map數據。
2.4 一個Action處理多個請求
如果要實現動態方法調用,需要在struts.xml中設置常量struts.enable.DynamicMethodInvocation為true
第一種方式:struts.xml中action的配置如下,調用時只須直接userlogin即可。
<action name="userlogin" class="com.nics.action.LoginAction" method="doNotNeedInterceptor_userLogin">
第二種方式:struts.xml中的配置如下,調用時則需要userlogin!|loginFunction。其中loginFunction是LoginAction里的一個方法
<action name="userlogin" class="com.nics.action.LoginAction">