Struts2理解--動態方法和method屬性及通配符_默認Action

 

衆所周知,默認條件下,在瀏覽器輸入indexAction!execute.action,便會執行indexAction類裏的execute方法,這樣雖然方便,但可能帶來安全隱患,經過url能夠執行Action中的任意方法。html

   想要禁止調用動態方法,則要在struts.xml中經過constant元素將屬性strutsenableDynamicMethodInvocation設置爲false,來禁止調用動態方法。java

         

  <constant name="strutsenableDynamicMethodInvocation" value="false"/>

 

method屬性:瀏覽器

這時咱們須要經過其餘安全的方式來實現動態方法的調用安全

1、經過action元素的method屬性來指定Action執行時調用的方法框架

    <action name="empAction_register" class="com.syaccp.erp.action.emp.EmpAction" method="register">

            <result name="success">/WEB-INF/jsp/basic/emp_list.jsp</result>

            <result name="input_edit">/WEB-INF/jsp/basic/emp_edit.jsp</result>

            <result name="input_add">/WEB-INF/jsp/basic/emp_add.jsp</result>

            <result name="reload" type="redirect">empAction.action</result>

   </action>

以上一個配置片斷便用到了method屬性,當請求/empAction_register.action時,Struts2框架會在EmpAction中查找register方法並執行。jsp

Struts2根據method屬性查找方法有兩種途徑:網站

      一、查找與method屬性值徹底一致的方法url

      二、查找doMethod形式的方法spa

 

使用動態方法調用和method屬性的區別:code

   <action name="empAction" class="com.syaccp.erp.action.emp.EmpAction">

            <result name="success">/WEB-INF/jsp/basic/emp_list.jsp</result>

             <result name="reload" type="redirect">empAction.action</result>

   </action>


   

 <action name="empAction_register" class="com.syaccp.erp.action.emp.EmpAction" method="register">

            <result name="success">/WEB-INF/jsp/basic/emp_register.jsp</result>

    </action>     

    <action name="empAction_login" class="com.syaccp.erp.action.emp.EmpAction" method="login">

            <result name="success">/WEB-INF/jsp/basic/emp_login.jsp</result>

    </action>

 經過以上三個配置來敘說,這三個配置實質是操做同一個Action。

    第一個動態方法模式,經過請求/empAction!register.action或者/empAction!login.action、或者/empAction.action。若是

register方法、login方法、execute方法返回值都是是"success",則都會進入emp_list.jsp頁面。

    第二三個經過指定method屬性,動態訪問。這裏register和login方法假設返回都是"success",但它們不會進入同一個頁面,而是分別進入各自result指定的頁面中。

由上咱們分析出:

  若是同一個Action的不一樣方法的響應使用相同的的配置(result等),則使用動態方法調用

  若是同一個Action的不一樣方法的響應分別使用不一樣的配置,則使用action元素的method屬性,爲同一個Action配置多個名稱。

 

通配符:

在使用method屬性來實現同一個Action的不一樣方法處理不一樣的請求時,會發現,隨着方法的增多,從而致使大量的Action配置,這時咱們就須要經過使用通配符來解決Action配置過多的方法。

在配置<action.../>元素時,須要指定name、class、method屬性。其中name屬性可支持通配符,而後能夠在class、method屬性中使用表達式。通配符用星號 * 表示。 

  <action name="empAction_*" class="com.syaccp.erp.action.emp.EmpAction" method="{1}">

            <result name="success">/WEB-INF/jsp/basic/emp_{1}.jsp</result>

    </action> 

以上配置代表,當請求/empAction_login時,通配符匹配的是login,這個值將替換{1},最終執行EmpAction的login方法,若是方法返回值爲success,跳轉到emp_login.jsp頁面。

 

默認Action:

在瀏覽器輸入一個不存在的Action,頁面將呈現404錯誤,爲了網站更友好,咱們能夠設置一個默認的Action。

設置默認Action有兩種形式:

    一、配置每一個包的默認Action,若是在相應的namespace下沒有一個Action匹配請求,那麼將執行該namespace默認的Action,不一樣的包,可配置不一樣的默認Action,配置以下:defaultAction爲默認Action的name屬性值,default語句必須寫在首行。

<package name="default" namespace="/emp" extends="struts-default">

         <default-action-ref name="defaultAction"></default-action-ref>

        <action name="defaultAction">

            <result>/error.jsp</result>

        </action>

</package>

   二、在根目錄下配置默認Action,不用填寫namespace屬性

<package name="default" extends="struts-default">

         <default-action-ref name="defaultAction"></default-action-ref>

        <action name="defaultAction">

            <result>/error.jsp</result>

        </action>

</package> 

若是聲明瞭第一種,Struts2將會調用當前包下聲明的默認Action。忽視全局的默認Action。

通常用第二種,統一默認的Action,不論在url中輸入哪一個目錄或包下沒有的Action,都顯示錯誤頁面。      

相關文章
相關標籤/搜索