一、使用Action的动态方法调用

    如果一个页面包含多个按钮,系统分别提交给Action的不同方法处理.此时可以采用DMI(Dynamic Method Invocation,动态方法调用)来处理这种请求。动态方法调用是指表单元素的Action并不是直接等于某个Action名字,而且以如下形式指定表单的Action属性:

<!-- action属性为actionNmae!methodName的形式
其中ActionName指定提交到哪个Action,而methodName指定提交到指定方法-->
action="ActionName!methodName"

 

其中一个按钮的代码如下:

<input type="submit" value="注册" onclick="regist();" />

上述代码中指定“注册”按钮被单击时触发regist函数,该函数的代码如下:

<script type="text/javascript">
function regist(){
targetForm = document.forms[0];
targetForm.action = "login!regist";
}
</script>

 

上述JavaScript代码改变了表单元素的Action属性,修改后的属性为login!regist,其实质就是将该表单提交给login Action的regist方法处理。

struts.xm中的配置:

<package name="lee" extends="struts-default">
<action name="login" class="org.crazyit.app.action.LoginAction">
<!-- 定义三个逻辑视图和物理资源之间的映射 -->
<result name="error">/error.jsp</result>
<result name="success">/welcome.jsp</result>
</action>
</package>

 

注意:使用动态方法调用前,必须设置Struts2允许动态方法调用,需要设置struts.enable.DyanmicMethodInvocation常量为true。

二、指定method属性及使用通配符

    1)使用method属性

<action name="login" class="org.crazyit.app.action.LoginAction" method="execute">
<result name="error">/error.jsp</result>
<result name="success">/welcome.jsp</result>
</action>
<action name="regist" class="org.crazyit.app.action.LoginAction" method="regist">
<result name="error">/error.jsp</result>
<result name="success">/welcome.jsp</result>
</action>

 

     对应的javaScript代码为:

 

function regist(){
targetForm = document.forms[0];
targetForm.action = "regist";
}

 

    2)使用通配符

在上述的struts.xml文件中,两个Action定义绝大部分相同,可见这种定义相当冗余,为了解决这个问题,Struts2可以使用通配符。

在配置<action ../>时,允许在指定name属性时使用通配符,然后在class、method属性及<result…/>子元素中使用{N}的形式来代表前面第N个星号所匹配的子串。

示例一:

<action name="*Action" class="org.crazyit.app.action.LoginAction" method="{1}">
<result name="error">/error.jsp</result>
<result name="success">/welcome.jsp</result>
</action>

 

例如,如果请求URL为loginAction.action,则调用LoginAction类的login方法,如果请求URL为registAction.action,则调用LoginAction类的regist方法。

示例二:

<action name="*_*" class="org.crazyit.app.action.{1}Action" method="{2}">
<result name="error">/error.jsp</result>
<result name="success">/welcome.jsp</result>
</action>

 

例如,如果请求URL为Book_save.action,则对应的处理类为BookAction,处理方法为save方法。

    3)对子元素使用通配符

Struts2不仅允许在class属性、name属性中使用表达式,还可以在<result…/>子元素中使用{N}表达式。

<action name="*" >
<result>/{1}.jsp</result>
</action>

 

上面的Action的定义可以匹配任意的Action,所用的用户请求都可通过Action来处理,因为没有指定class属性,该Action使用ActionSupport来作为处理类,而且因为该ActionSupport类的execute方法返回success字符串, 即该Action总是直接返回result中指定的JSP资源,JSP资源使用表达式来生成资源名。上面Action定义的含义是如果请求a.aciton,则进入a.jsp页面;如果请求b.action,则进入b.jsp页面……

通过这种方式,可以避免让浏览者直接访问系统的JSP页面,而是让Struts2框架来管理所有用户请求。

对于使用Struts2框架的应用而言,尽量不要让超级链接直接连接到某个视图资源,因为这种方式增加了额外的风险。推荐将所有请求都发送给Struts2框架,让框架来处理用户请求,即使只是简单的超级链接。

    4)关于因通配符带来的优先级的问题。

假设有URL为abcAction.action的请求,在struts.xml文件中配置了如下三个Action,它们的name的值分别为:abcAction、*Action和*,则这个请求将会被名为abcAction的Action处理。

假设有URL为defAction.action的请求,在struts.xml文件中配置了如下三个Action,它们的name的值分别为:abcAction、*Action和*,则*Action不会比*更优先匹配defAction.action的请求,而是先找到那个Action,就会由那个Action来处理用户请求。

【学习笔记】Struts2之一个Action包含多个控制处理逻辑的更多相关文章

  1. Struts2 从一个Action跳至另一个Action

    Struts2  从一个Action跳至另一个Action 一.注解的 @Result(name=SUCCESS,type="chain", params={"actio ...

  2. C#.NET学习笔记2---C#.第一个C#程序

    C#.NET学习笔记2---C#.第一个C#程序 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com 6.第一个C#程序:   ...

  3. Spark学习笔记1——第一个Spark程序:单词数统计

    Spark学习笔记1--第一个Spark程序:单词数统计 笔记摘抄自 [美] Holden Karau 等著的<Spark快速大数据分析> 添加依赖 通过 Maven 添加 Spark-c ...

  4. Unity3D学习笔记2——绘制一个带纹理的面

    目录 1. 概述 2. 详论 2.1. 网格(Mesh) 2.1.1. 顶点 2.1.2. 顶点索引 2.2. 材质(Material) 2.2.1. 创建材质 2.2.2. 使用材质 2.3. 光照 ...

  5. 【转】Pro Android学习笔记(二五):用户界面和控制(13):LinearLayout和TableLayout

    目录(?)[-] 布局Layout 线性布局LinearLayout 表格布局TableLayout 布局Layout Layout是容器,用于对所包含的view进行布局.layout是view的子类 ...

  6. 【转】 Pro Android学习笔记(二二):用户界面和控制(10):自定义Adapter

    目录(?)[-] 设计Adapter的布局 代码部分 Activity的代码 MyAdapter的代码数据源和构造函数 MyAdapter的代码实现自定义的adapter MyAdapter的代码继续 ...

  7. 【转】 Pro Android学习笔记(十九):用户界面和控制(7):ListView

    目录(?)[-] 点击List的item触发 添加其他控件以及获取item数据 ListView控件以垂直布局方式显示子view.系统的android.app.ListActivity已经实现了一个只 ...

  8. Struts2学习笔记(二):第一个Struts2应用

    一.创建Action类. 创建工程Struts2Demo struts 2中的Action类并不需要继承struts 2中的某个父类,普遍的java类就可以. 在org.sunny.user.acti ...

  9. Struts2学习笔记三:深入Action

    一:Action中获取参数值 在Servlet中,我们通过doGet()/doPost()方法中的参数,获取request/response对象,然后提取参数值: 处理请求结束后,有数据需要携带返回客 ...

随机推荐

  1. WPF 自定义窗口关闭按钮

    关闭图标设计主要涉及主要知识点: 1.Path,通过Path来画线.当然一般水平.竖直也是可以用Rectangle/Border之类的替代 一些简单的线条图标用Path来做,还是很方便的. 2.简单的 ...

  2. ubuntu中用户使用的shell如何指定

    在机器上给同事开了一个账号,结果ssh登陆后,补全,高亮都没有,但是我自己的账号都可以.首先怀疑是.bashrc文件设置有问题,对比2个用户目录的这个文件并未发现可以的地方.搜索得知可能是所使用的sh ...

  3. 表单元素——checkbox样式美化

    一.背景 设计狮童鞋总是会设计各种高大上的效果图,比如下面这个土豪金的效果. 该图中“已阅读并同意相关服务条款”前面的复选框有一个金色的边框,打钩时是一个金色的对勾.接下来说说怎样实现该效果. 二.解 ...

  4. liunx关闭防火墙

    Redirecting to /bin/systemctl stop iptables.service systemctl stop iptables.service ?????? centos从7开 ...

  5. win10+vs2013+cuda8.0+caffe

    1,首先说下环境和配置 配置: 环境:windows10,vs2013 community,cuda8.0,caffe,cudnn4 注意:先要安装好显卡驱动(我的显卡是1070),这里的例子只开通了 ...

  6. JavaScript中实现extend()方法

    var male = { sex: "male" }; var xiaoming = { name: "xiaoming", school: "xin ...

  7. 讲座:Modeling User Engagement for Ad and Search

    讲座:http://bdai.ruc.edu.cn/?p=118 Modeling User Engagement for Ad and Search ppt 链接: Dr. Ke(Adam) Zho ...

  8. Not Hello World

    通常对于一门语言的学习,一般都是以"Hello,World!"开始的.但对于汇编语言的学习,输出这句话并不容易,首先得了解寄存器等硬件知识. 汇编语言要得以运行,首先要讲源文件编译 ...

  9. [转] eclipse SVN中文件修改后图标不变黑星解决

    原文地址:http://blog.csdn.net/luwei42768/article/details/39225641 版权声明:本文为博主原创文章,未经博主允许不得转载. 如上图, 如果文件修改 ...

  10. centos 6.5 redis 安装

    安装教程有用的地址 https://my.oschina.net/u/2478188/blog/726984: 错误1 Redis: You need tcl 8.5 or newer in orde ...