strut2_struts.xml文件配置知識點匯集
1、Struts2的基本流程
Struts2框架大致分為三部分:
。核心控制器StrutsPerpareAndExecuteFilter,Struts2框架提供
。業務控制器 ,用戶自己實現
。用戶實現的業務邏輯組建,用戶自己實現
Struts2應用中的Action用於處理用戶請求的Action實例,並不是用戶自己實現業務控制器,而是Action代理。因為用戶實現的業務控制器並沒有ServletAPI耦合,顯然無法處理用戶請求。而Stuts2框架提供了系列攔截器,該攔截器負責將HttpServletRequest請求中的請求參數解析出來,傳入Action中,並調用execute方法來處理用戶請求。
struts.xml文件知識點講解
1、默認情況下,Struts2框架會自動加載放在WEB-INF/classes路徑下的struts.xml文件。但由於隨著應用程序的擴大,系統中Action數量也大量增多,導致struts.xml配置臃腫。此時我們可以將struts.xml配置文件分解成多個配置文件,然後在struts.xml文件包含這些文件就可以了。使用<include />元素完成。
<struts>
<include file="struts1.xml"></include>
...
</struts>
應該避免兩個文件中有相同的Package設置,後者會覆蓋前者。我就是這樣,報nasmespace....錯誤。
2、struts-default.xml是Struts2框架的默認配置文件,Struts2框架每次都會自動加載該文件。
<package name="default" namespace="/" extends="struts-default"> <action name="login" class="org.crazyit.action.LoginAction"> <result name="success">/detils.jsp</result> <result name="error">/error.jsp</result> </action> </package>
3、struts.xml和struts.properties是Struts2兩個核心配置文件。
struts.xml主要負責管理Action映射以及該Action包含的result定義。
struts.propertites主要定義Struts2框架的一些常量,采用鍵值對的方式,就是一種properties文件。在項目的src目錄下添加。
在Struts2中有三種配置常量的方式
①.在struts.properties中配置。例如: struts.devMode = false
②.在web.xml中配置核心Filter時通過初始化參數來配置常量。
例如:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.custom.i18n.resources</param-name>
<param-value>mess</param-value>
</init-param>
</filter>
③.在struts.xml中通過<constant />元素來配置常量。
<constant name="struts.custom.i18n.resources" value="mess"></constant>
對此Struts2對常量的加載順序如下
1、struts-default.xml 2、struts-plugin.xml 3、struts.xml 4、struts.properties 5、web.xml
4、包配置package元素
package中有以下屬性:name:包的唯一標識
extends:可選屬性,指定繼承其他包
namespace:可選屬性,該包的命名空間
abstract:定義是否是抽象包,抽象包中不能包含Action的定義。例如:abstract=“true”
----------命名空間 namespace
Struts2允許以命名空間來管理Action。統一命名空間不能有相同的Action,不同的命名空間可以有同名的Action。Struts2不能單獨為一個Action提供命名空間,而是通過為包指定命名空間。
當某個包指定了命名空間之後,該包下Action處理的URL應該是命名空間+Action
默認命名空間 namespace=“” :可以處理任何模塊下的Action
根命名空間 namespace=“/”
5、Struts2的Action
· Struts2通常直接用Action來封裝HTTP請求參數,因此Action應該包含與參數相對的屬性,並為屬性提供getter和setter方法。
· 由於系統是通過getter和setter方法來處理請求參數的,因此也可以不包含屬性。
· Action既可以封裝請求參數,也可以封裝處理結果的屬性。
· 為了讓用戶開發Action更規範,Struts2提供了一個Action接口。
public interface Action { /** * The action execution was successful. Show result * view to the end user. */ public static final String SUCCESS = "success"; /** * The action execution was successful but do not * show a view. This is useful for actions that are * handling the view in another fashion like redirect. */ public static final String NONE = "none"; /** * The action execution was a failure. * Show an error view, possibly asking the * user to retry entering data. */ public static final String ERROR = "error"; /** * The action execution require more input * in order to succeed. * This result is typically used if a form * handling action has been executed so as * to provide defaults for a form. The * form associated with the handler should be * shown to the end user. * <p/> * This result is also used if the given input * params are invalid, meaning the user * should try providing input again. */ public static final String INPUT = "input"; /** * The action could not execute, since the * user most was not logged in. The login view * should be shown. */ public static final String LOGIN = "login"; /** * Where the logic of the action is executed. * * @return a string representing the logical result of the execution. * See constants in this interface for a list of standard result values. * @throws Exception thrown if a system level exception occurs. * <b>Note:</b> Application level exceptions should be handled by returning * an error value, such as <code>Action.ERROR</code>. */ public String execute() throws Exception; }
另外Struts2還為Action提供了實現類ActionSupport。若Action中沒有配置class時,默認ActionSupport作為處理類。
6、Action訪問Servlet Api
ActionContext 是 Action 執行的上下文對象, 在 ActionContext 中保存了 Action 執行所需要的所有對象, 包括 parameters, request, session, application 等.
獲取系統的ActionContext實例 : ActionContext.getContext()
獲取 HttpSession 對應的 Map 對象: public Map getSession() 。與之對應的是setSession(Map session)方法
獲取 ServletContext 對應的 Map 對象:public Map getApplication()。與之對應的是setApplication(map Application)方法
獲取請求參數對應的 Map 對象:public Map getParameters()
獲取 HttpServletRequest 對應的 Map 對象:public Object get(Object key):。與之對應還有put()方法
ActionContext 類中沒有提供類似 getRequest() 這樣的方法來獲取 HttpServletRequest 對應的 Map 對象. 要得到 HttpServletRequest 對應的 Map 對象, 可以通過為 get() 方法傳遞 “request” 參數實現。
public String execute() throws Exception{ ActionContext act=ActionContext.getContext(); Integer counter=(Integer) act.getApplication().get("counter"); if(counter==null ){ counter=1; }else{ counter=counter+1; } act.getApplication().put("counter", counter); act.getSession().put("username", getUsername()); if(getUsername().equals("wangning")&& getPassword().equals("123456")){ act.put("tip", "你已經成功登陸!"); return "success"; }else{ act.put("tip", "登陸失敗!"); return "error"; } }
<s:property value="tip"/>
${applicationScope.counter }人在線
${sessionScope.username }登陸
7、雖然ActionContext可以用來訪問Servlet Api 。但不能直接訪問Servlet Api實例。因此Struts2提供了如下接口:
①、ServletContextAware:實現該接口的Action可以訪問Web應用的ServletContext實例。
②、ServletRequestAware:實現該接口的Action可以訪問用戶請求的HttpServletRequest實例。
③、ServletResponseAware:實現該接口的Action可以訪問服務器相應的HttpServletResponse實例。
8、配置邏輯試圖與物理師徒之間的映射關系是通過<result />元素來定義的。
9、Struts2的Action默認處理類是ActionSupport。我們也可以在struts.xml中手動修改
<package name="default1" namespace="/" extends="struts-default">
<default-class-ref class="org.crazyit.action.LoginAction"></default-class-ref>
<action name="login" class="org.crazyit.action.LoginAction">
<result name="success">/detils.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
10、動態方法調用(DMI)
形式: action=“action!methodName.action”
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <script type="text/javascript"> function regist(){ targetForm=document.forms[0]; targetForm.action="login!regist"; targetForm.submit(); } </script> <body> <!-- <form action="login" method="post"> 用戶名:<input type="text" name="username"><br> 密碼:<input type="password" name="password"><br> <input type="submit" value="登陸"> <input type="reset" value="重置"> </form> --> <s:form action="login"> <s:textfield name="username" label="用戶名"></s:textfield> <s:password name="password" label="密 碼"></s:password> <s:submit value="登陸"></s:submit> <s:submit value="註冊" type="button" onclick="regist()"></s:submit> <s:reset value="重置"></s:reset> </s:form> </body> </html>jsp
<action name="login" class="org.crazyit.action.LoginAction"> <result name="success">/detils.jsp</result> <result name="error">/error.jsp</result> </action> <action name="regist" class="org.crazyit.action.LoginAction" method="regist"> <result name="success">/detils.jsp</result> <result name="error">/error.jsp</result> </action>
使用動態方法之前,應該開啟Struts2的動態方法調用設置:<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>,否則nasmespace....錯誤。
11、使用通配符是另外一種動態方法調用。
<package name="sports" namespace="/" extends="struts-default"> <action name="runAction" class="org.sports.action.SportsAction" method="{1}"> <result>/sportDetils.jsp</result> </action> <action name="*Action" class="org.sports.action.SportsAction" method="{1}"> <result>/sportDetils.jsp</result> </action> <action name="*" class="org.sports.action.SportsAction" method="{1}"> <result>/sportDetils.jsp</result> </action> </package>
通配符可以在name屬性中使用,然後再class和method屬性中使用表達式。
以上代碼如果是runAction,則調用runAction請求。如果是danceAction,則調用*Action處理。*Action和*都匹配,二者誰在前,調用誰。
12、Struts2中允許定義了一個默認的Action,在用戶的URL請求找不到匹配的Action時,則調用默認的Action來處理用戶請求。
<default-action-ref name="runAction"></default-action-ref>
13、配置結果
Struts2根據<result/>所在的位置不同,提供了兩種結果
局部結果:<result />元素作為<action/>子元素來配置
全局結果:<result />元素作為<global-results/>子元素來配置
<package name="sports" namespace="/" extends="struts-default"> <default-action-ref name="runAction"></default-action-ref> <global-results> <result>/error.jsp</result> </global-results> <action name="runAction" class="org.sports.action.SportsAction" method="{1}"> <result>/sportDetils.jsp</result> </action> <action name="*Action" class="org.sports.action.SportsAction" method="{1}"> <result>/sportDetils.jsp</result> </action> <action name="*" class="org.sports.action.SportsAction" method="{1}"> <result>/sportDetils.jsp</result> </action> </package>
14、幾種結果類型
<action name="resultAction" class="org.crazyit.action.ResultAction"> <!-- 結果類型: dispatcher 1.dispatcher 結果類型是最常用的結果類型, 也是 struts 框架默認的結果類型 2.該結果類型有一個 location 參數, 它是一個默認參數 等同於 <result name="result1" type="dispatcher"> <param name="location">/content/login.jsp</param></result> 3.dispatcher 結果類型將把控制權轉發給應用程序裏的指定資源. 4.dispatcher 結果類型不能把控制權轉發給一個外部資源. 若需要把控制權重定向到一個外部資源, 應該使用 redirect 結果類型 實際請求地址不變 --> <result name="result0" type="dispatcher">/login.jsp</result> <!-- 結果類型: redirect 1.redirect 結果類型將把響應重定向到另一個資源, 而不是轉發給該資源. 2.redirect 結果類型接受下面這些參數: -location: 用來給出重定向的目的地.它是默認屬性 -parse: 用來表明是否把 location 參數的值視為一個 OGNL 表達式來解釋. 默認值為 true 3.redirect 結果類型可以把響應重定向到一個外部資源 實際請求地址發生轉變。 --> <result name="result1" type="redirect"> <param name="location">/error.jsp</param> </result> <!-- 結果類型: redirectAction 1.redirectAction 結果類型把響應重定向到另一個 Action 2.redirectAction 結果類型接受下面這些參數: -actionName: 指定 “目的地” action 的名字. 它是默認屬性 -namespace: 用來指定 “目的地” action 的命名空間. 如果沒有配置該參數, Struts 會把當前 Action 所在的命名空間作為 “目的地” 的命名空間 --> <result name="result2" type="redirectAction"> <param name="actionName">testAction</param> <param name="namespace">/</param> </result> <!-- 結果類型: chain 1.chain 結果類型的基本用途是構成一個 action 鏈: 前一個 action 把控制權轉發給後一個 action, 而前一個 action 的狀態在後一個 action 中依然保持 2.chain 結果類型接受下面這些參數: -actionName: 指定目標 action 的名字. 它是默認屬性 -namespace: 用來指定 “目的地” action 的命名空間. 如果沒有配置該參數, Struts 會把當前 action 所在的命名空間作為 “目的地” 的命名空間 -method: 指定目標 action 方法. 默認值為 execute --> <result name="result3" type="chain"> <param name="actionName">testAction</param> <param name="namespace">/</param> </result> </action> </package> <package name="testPackage" namespace="/" extends="struts-default"> <action name="testAction" class="org.crazyit.action.TestAction"> <result>/error.jsp</result> </action> </package>
15、Struts2的異常機制
execute()方法可以拋出全部的異常,這意味著我們重寫該方法時,完全無需進行任何異常處理,而是將異常交給Struts2框架處理。Struts2框架接受到異常之後,根據struts.xml文件配置的異常映射,轉入指定的視圖資源。
可以在struts.xml文件中通過<exception-mapping/>元素配置。
指定兩個屬性:
①exception:指明異常類型 ② result :異常映射結果配置
根據<exception-mapping/>所處的位置不同又可以分為兩種。
局部異常映射:<exception-mapping/>作為<action/>子元素
全局異常映射:<exception-mapping/>作為<global-exception-mappings>元素的子元素
strut2_struts.xml文件配置知識點匯集