zoukankan      html  css  js  c++  java
  • [转]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,都显示错误页面。      



  • 相关阅读:
    三个心态做人做学问 沧海
    成功走职场要找准自己的"快捷键" 沧海
    免费离线下载 拂晓风起
    Hibernate 获取某个表全部记录时 奇怪现象 (重复出现某个记录) 拂晓风起
    无法读取mdb 如果连接不了ACCESS mdb文件,就尝试安装MDAC 拂晓风起
    Netbeans 使用 Hibernate 逆向工程 生成hbm和pojo 拂晓风起
    如何点击单选框 radio 后面的文字,选中单选框 拂晓风起
    Java 连接access 使用access文件 不用配置 拂晓风起
    mysql下如何执行sql脚本 拂晓风起
    Hibernate配置access Hibernate 连接 access 拂晓风起
  • 原文地址:https://www.cnblogs.com/dirgo/p/5291561.html
Copyright © 2011-2022 走看看