1. 程式人生 > >strut2_struts.xml文件配置知識點匯集

strut2_struts.xml文件配置知識點匯集

url erro see function get() quest 管理 word 業務

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文件配置知識點匯集