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,都显示错误页面。

时间: 2024-08-08 06:51:55

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

getElementByName()方法和getter属性,及与getElementById()的区别

可以使用document.getElementByName()方法根据元素的name属性来获得元素.定义name属性的元素包括button.fieldset.input.keygen.output.select.textarea.form.iframe.object.map.meta.param. getElementByName()获取的是具有相同name属性及值的集合,返回值类型是NodeList.由于ID通常具有唯一性,所以getElementById()通常获得的是对元素对象的引用,而且

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

? 版权声明:本文为博主原创文章,转载请注明出处 默认Action - 当访问action不存在时,可通过指定默认action的方式避免出现错误代码页面 - 使用default-action-ref指定默认action 实例 1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&quo

细说python类2——类动态添加方法和slots(转)

先说一下类添加属性方法和实例添加属性和方法的区别, 类添加属性属于加了一个以类为全局的属性(据说叫静态属性),那么以后类的每一个实例化,都具有这个属性.给类加一个方法也如此,以后类的每一个实例化都具备这个方法(但是据说叫动态方法.)但是给实例加一个属性,作用域就是这个实例,是与类没关系的(据说这种属性叫动态属性). Python类的实例可以动态的添加属性.举个例子,声明一个类A >>> class A(object):...   def __init__(self):...     pr

彻底理解了call()方法,apply()方法和bind()方法

javascript中的每一个作用域中都有一个this对象,它代表的是调用函数的对象.在全局作用域中,this代表的是全局对象(在web浏览器中指的是window).如果包含this的函数是一个对象的方法,this指向的就是这个对象.因此在上面例子中就不用直接写对象的名字,而是使用this代替它,例如: var human = { name: '霍林林', sayName: function(){ console.log(this.name); } } human.sayName(); 下面这个

学习ASP .NET MVC5官方教程总结(七)Edit方法和Edit视图详解

学习ASP .NET MVC5官方教程总结(七)Edit方法和Edit视图详解 在本章中,我们研究生成的Edit方法和视图.但在研究之前,我们先将 release date 弄得好看一点.打开Models\Movie.cs 文件.先添加一个引用: <span style="font-size:14px;">using System.ComponentModel.DataAnnotations;</span> 然后在Movie类中添加以下代码: [Display(

jquery中attr方法和prop方法的区别

关于checked的属性,最重要的概念就是你要记住,它跟checked的状态值是毫无关系的,设置checked = "checked"或者checked = "true"等属性设置,和它的状态值true/false是无关的.,而这里的属性值,事实上只是和defaultChecked的状态值有关,并且只能用来设置checkbox的初始的值.checked的属性值并不会随着checkbox的的状态变化而变化,可是checkbox的状态值却会.因此,为了能更好的跨浏览器的

【MVC5】7.检查Edit方法和Edit视图

在本节中,您将检查所生成的Edit操作方法和movie controller的视图.但首先需要采取一个简短的更改,使发布日期看起来更好.打开Models\Movie.cs文件并修改为下面代码: using System; using System.ComponentModel.DataAnnotations; using System.Data.Entity; namespace MvcMovie.Models { public class Movie { public int ID { get

HTML &lt;form&gt; 标签的 method 属性

定义和用法 method 属性规定如何发送表单数据(表单数据发送到 action 属性所规定的页面). 表单数据可以作为 URL 变量(method="get")或者 HTTP post (method="post")的方式来发送. method 属性 浏览器使用 method 属性设置的方法将表单中的数据传送给服务器进行处理.共有两种方法:POST 方法和 GET 方法. 如果采用 POST 方法,浏览器将会按照下面两步来发送数据.首先,浏览器将与 action

上传图片HTML &lt;form&gt; 标签的 method 属性

<!DOCTYPE HTML><html><body> <form action="/example/html5/demo_form.asp" method="get">选择图片:<input type="file" name="img" multiple="multiple" /><input type="submit"