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


  眾所周知,默認條件下,在瀏覽器輸入indexAction!execute.action,便會執行indexAction類里的execute方法,這樣雖然方便,但可能帶來安全隱患,通過url可以執行Action中的任意方法。
   想要禁止調用動態方法,則要在struts.xml中通過constant元素將屬性strutsenableDynamicMethodInvocation設置為false,來禁止調用動態方法。
               <constant name="strutsenableDynamicMethodInvocation" value="false"/>

method屬性:
這時我們需要通過其他安全的方式來實現動態方法的調用
一、通過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方法並執行。
Struts2根據method屬性查找方法有兩種途徑:
      1、查找與method屬性值完全一致的方法
      2、查找doMethod形式的方法

使用動態方法調用和method屬性的區別:
    <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有兩種形式:
    1、配置每個包的默認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>

   2、在根目錄下配置默認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,都顯示錯誤頁面。      





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM