众所周知,默认条件下,在浏览器输入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,都显示错误页面。      
 

Struts2理解--动态方法和method属性及通配符_默认Action的更多相关文章

  1. [转]Struts2理解--动态方法和method属性及通配符_默认Action

    众所周知,默认条件下,在浏览器输入indexAction!execute.action,便会执行indexAction类里的execute方法,这样虽然方便,但可能带来安全隐患,通过url可以执行Ac ...

  2. Struts2 | struts.xml文件中使用method属性和通配符简化action标签和Action处理类的编写

    转自:https://www.jianshu.com/p/310e89ee762d 在Struts2框架中,我们知道基本的Action标签只能实现一个url请求对应一个Action处理类.那么我们如果 ...

  3. 函数的apply、call方法和length属性

    函数的apply.call方法和length属性JavaScript为函数对象定义了两个方法:apply和call,它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数的方式有所区别:Fu ...

  4. Struts2学习笔记:DMI,多个配置文件,默认Action,后缀

    动态方法调用有三种方法: 1.同一Action多次映射,每个action标签的method对应要调用的方法. 当要调用的方法多了就会增加struts.xml文件的复杂性. 2.struts.Dynam ...

  5. Python中的常见特殊方法或属性—— dir方法和dict属性

    一.__dir__方法 对象的__dir__()方法的作用是列出对象内部所有的属性名和方法名,该方法将会返回包含所有属性或方法名的序列. 如果程序对某个对象执行dir(obj)函数,实际上就是将该对象 ...

  6. Thread类的常用方法_获取线程名称的方法和Thread类的常用方法_设置线程名称的方法

    构造方法: public Thread();分配一个新的线程对象 public Thread(String name);分配一个指定名字的新的线程对象 public Thread(Runnable t ...

  7. 第五篇——Struts2的默认Action

    默认Action 1.当访问action不存在时,可以通过制定默认action的方式避免出现错误代码页面: 2.使用default-action-ref 指定默认 action. 项目实例 1.项目结 ...

  8. Struts2学习六----------默认Action

    © 版权声明:本文为博主原创文章,转载请注明出处 默认Action - 当访问action不存在时,可通过指定默认action的方式避免出现错误代码页面 - 使用default-action-ref指 ...

  9. (Struts2学习系列二)Struts2动态方法调用:指定method属性

    紧接着上一篇,在HelloWorldAction.java中添加add和update方法: public class HelloWorldAction extends ActionSupport{ p ...

随机推荐

  1. fw: webdriver 那些坑

    http://www.cnblogs.com/huang0925/p/3384596.html 使用WebDriver遇到的那些坑   在做web项目的自动化端到端测试时主要使用的是Selenium ...

  2. bottlepy template

    bottle template usage 1 example 使用bottle模板,最简单的方法是使用template函数或view装饰器 1.1 template 函数 例子如下: from bo ...

  3. Linux 网络基本配置

    一.Linux网络配置文件 1.  /etc/sysconfig/network-scripts/ifcfg-eth0 文件 在Red Hat系统中,系统网络设备的配置文件保存在/etc/syscon ...

  4. .net网站能走多远

    刚写好了学校网站,请大家帮忙测试一下.不知道怎么sql注入,或者DDoS攻击,我也是大四什么都是摸索阶段,不过这个网站 做了好长时间了,现在终于可以上架了,希望大家能指点一二,谢谢! 地址:http: ...

  5. Windows Azure初体验

    目前在IT界,云这个概念的第一意思不再是词典里的解释了.不过它们还是有相同点的——也许确实会酝酿出一块大蛋糕,可也是飘在天上,众神分食之,与我等P民无关.所谓云,不过是网络时代发展到一定阶段的必然产物 ...

  6. 关于MAC

    以太LAN网中发送的分组称做帧,包含7个字段 MAC帧格式 前同步码 SFD DA SA 长度或类型 数据域 CRC 7字节,物理层加入 帧首定界符,1字节 目的地址,6字节 源地址,6字节 2字节 ...

  7. 拒绝访问 temp 目录。用来运行 XmlSerializer 的标识“IIS APPPOOL\UGAS”没有访问 temp 目录的足够权限

    在部署IIS时候会出现下图错误,拒绝访问 temp 目录.用来运行 XmlSerializer 的标识“IIS APPPOOL\UGAS”没有访问 temp 目录的足够权限 解决方法: 在IIS信息管 ...

  8. 一些对数学领域及数学研究的个人看法(转载自博士论坛wcboy)

    转自:http://www.math.org.cn/forum.php?mod=viewthread&tid=14819&extra=&page=1 原作者: wcboy 现在 ...

  9. apache日志轮询技术

    1.首先先下载安装apache的日志轮询工具cronolog: wget http://cronolog.org/download/cronolog-1.6.2.tar.gz .tar.gz cd c ...

  10. java的for循环冒号

    背景:有一个小伙纸问我 下面的java代码是什么意思. for (final RouterInterface routeIface : curNode.getRouteInterfaces()){ … ...