Struts2的动态Action实现
在Struts2中动态方法调用有三种方式,动态方法调用就是为了解决一个Action对应多个请求的处理,以免Action太多。
一、指定method属性
在struts.xml中指定action的method属性,这样可以让Action类调用指定方法,而不是默认的execute方法来处理请求。示例:
struts.xml
……
<package name=”demo1” extends=”struts-default”>
<action name=”Login” class=”com.demo.LoginAction” />
<result name=”input”>/input.jsp</result>
<result name=”error”>/error.jsp</result>
<result name=”success”>/success.jsp</result>
</action>
<action name=”Registry” class=”com.demo.LoginAction” method=”registry” />
<result name=”input”>/input.jsp</result>
<result name=”error”>/error.jsp</result>
<result name=”success”>/success.jsp</result>
</action>
</package>
上述配置中两个action的实现类均为com.demo.LoginAction,他们的实现类虽然相同,但处理逻辑却不同,处理逻辑通过method方法指定,其中名为Login的Action对应的处理逻辑为默认的execute方法,而名为Registry的Action对应的处理逻辑则为method指定的registry方法。
二、感叹号方式(需要开启),官网不推荐使用这种方式,建议大家不要使用。
用这种方式需要先开启一个开关
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
将此常量设置为true,这种方式才能使用,使用见示例
Action定义如下:
package chapter3.action;
public class Chapter3Action {
public String result1(){
return "result1";
}
public String result2(){
return "result2";
}
}
Jsp中关键代码:
<body>
<a href="basePath/chapter3/chapter3Action!result1">result1</a>
<br>
<a href="basePath/chapter3/chapter3Action!result2">result2</a>
<br>
<a href="basePath/chapter3/chapter3Action!result3">result3</a>
<br>
</body>
如果配置了后缀.action,必须这样写:
/chapter4/chapter4Action!create.action
XML中配置方式
<package name="chapter3" namespace="/chapter3" extends="struts-default">
<action name="chapter3Action" class="chapter3.action.Chapter3Action">
<result name="result1">/WEB-INF/JspPage/chapter3/result1.jsp</result>
<result name="result2">/WEB-INF/JspPage/chapter3/result2.jsp</result>
<result name="result3">/WEB-INF/JspPage/chapter3/result3.jsp</result>
</action>
</package>
三、通配符方式(官网推荐使用)
仔细看第一种方法的struts.xml中两个action的定义,可以发现他们除了name和method属性不同以外,其余的都一样,这种定义相当的冗余,为了解决这种类型的问题,Struts2提供了通配符定义方式。
在配置<action>元素时,需要指定name、class、method等属性,这3个属性都支持通配符,在使用通配符定义Action的name属性时,相当于一个元素action定义多个逻辑Action。第一种方法中的action配置可以更改为:
<package name=”demo” extends=”struts-default”>
<action name=”*Action” class=”com.demo.LoginAction” method=”{1}”>
<result name=”input”>/input.jsp</result>
<result name=”error”>/error.jsp</result>
<result name=”success”>/success.jsp</result>
</action>
</package>
上述定义不是定义了一个普通的action,而是定义一系列的action,只要用户请求的URL满足*Action的模式,都可通过该Action进行处理,而method属性使用了一个表达式{1},该表达式的值就是name属性中第一个*的所代表的值,例如,用户请求的URL为LoginAction,则*所代表的是Login字符串,故调用com.demo.LoginAction类的Login方法来处理。如果请示的URL为RegistryAction的话,则调用com.demo.LoginAction的Registry方法进行处理。
以下配置在class属性中使用通配符:
<package name=”demo” extends=”struts-default”>
<action name=”*Action” class=”com.demo.{1}Action”>
<result name=”input”>/input.jsp</result>
<result name=”error”>/error.jsp</result>
<result name=”success”>/success.jsp</result>
</action>
</package>
此配置中没有指定method属性,所以请示由默认的execute方式来执行,但class中使用了通配符,它的含义与上面一样,例如,当用户请求的为LoginAction时,其中*的值为Login,该值传入class属性,即该Action的处理类为com.demo.LoginAction;而如果请求为RegistryAction时,则该Action的处理类将变为com.demo.RegistryAction。
Struts2允许在class属性和method属性中同时使用表达式,示例如下:
<action name=”*_*” class=”com.demo.{1} method=”{2}” />
不难看出,只要满足*_*模式的Action都会被其处理,例如有Order_Booking请求到来,由于第一个*的值为Order,第二个*的值为Booking,那么意味着将会调用com.demo.Order处理类中的Booking方法来处理用户请求。
Struts2除了允许在name、class、method中使用表达式外,在<result>元素中也可以使用表达式,如下:
<action name=”*Action” class=”com.demo.{1}Action method=”{1}” >
<result name=”success”>/{1}.jsp</result>
</action>
当请求为LoginAction时,将调用com.demo.LoginAction处理类中的Login方法处理用户的请求,当返回为success时,显示/Login.jsp页面。
注意:在使用通配符后,除非请求的URL与Action的name属性绝对相同,否则将按Action在struts.xml中定义的先后顺序来决定由哪个Action来处理用户请求。
转载于:https://www.cnblogs.com/kangsir/p/6653269.html
Struts2的动态Action实现相关推荐
- web10 动态action的应用
电影网站:www.aikan66.com 项目网站:www.aikan66.com 游戏网站:www.aikan66.com 图片网站:www.aikan66.com 书籍网站:www.aika ...
- Struts2之一个Action包含多个控制处理逻辑
http://www.cnblogs.com/freeabyss/p/3290297.html 一.使用Action的动态方法调用 如果一个页面包含多个按钮,系统分别提交给Action的不同方 ...
- struts2的动态方法调用(DMI)和通配符映射
动态方法调用 1.Struts2默认关闭DMI功能,需要使用需要手动打开,配置常量 [html] view plaincopy struts.enable.DynamicMethodInvocatio ...
- Struts2中XXX.Action类中方法的访问(三种方式)
第一种:使用action标签的method属性(常规方法) Action类: package cn.tedu.web;import org.springframework.context.annota ...
- struts2 的一个action中配置多个result input
主题:struts2 的一个action中配置多个result input 讨论下 本文来自: 浪曦视频在线 作者: hoojo 发表于: 2009-6-4 19:05 阅读: 2005 人 收藏 看 ...
- Struts2框架学习Action命名空间创建方式
Struts2框架中Action类时一个单独的javabean对象,相比struts1来说,不需要去继承任何类型或实现任何借口,表单数据包含在Action中,而Struts1则必须继承org ...
- Struts2中的action类
Struts2中的action类 action类在Struts2中承担了Model(模型)的角色,主要用于处理业务逻辑并存放HTTP请求处理过程中各个变量的值. 在Struts2里面,Action充当 ...
- struts2中把action中的值传递到jsp页面的例子
例子: RegistAction的代码: package com.wss.action;import javax.servlet.http.HttpServletRequest;import org. ...
- Struts2里的Action返回Json数据
hibernateTemplate和hibernateDaoSupport的注意问题! 正则表达式入门30分钟 Struts2里的Action返回Json数据 2010-08-03 22:46:46| ...
最新文章
- HttpURLConnection与HttpClient浅析---转
- 如何控制订单发料后不能删除组件
- pmp每日三题(2022年2月17日)
- java 哈希一致算法_一致哈希算法Java实现
- Oracle 11g 新特性 -- Invisible Indexes(不可见的索引) 说明
- AS3编码规范(转)
- 智能行业热点速览(2019.7.15)
- 2020版Java视频教程|java零基础到就业全套视频教程线上免费观看,java免费教程直接看
- \t\t[生活小妙招]脚气 脚臭 损人不利己之疾病
- VMware虚拟机下Ubuntu系统安装VMware Tools
- 【知识蒸馏】Deep Mutual Learning
- 微信开发与应用实验一、创建微信公众号
- fla文件中切记不能使用TLF文本
- python容器类型-字典
- SPSS教程之生存分析的Cox回归模型(比例风险模型)
- 一文读懂机智云物联网APP开发
- 创造习惯 — 如何科学地养成习惯
- 如何在iPhone和iPad上的Safari中在后台打开链接
- seo如何快速有效的引流
- 计算机开机错误62,【电脑开机error】电脑开机error no boot_电脑开机error1962
热门文章
- 三流Java搞技术,二流Java搞框架,一流Java…
- Spring Boot+JWT+Shiro+MyBatisPlus实现Restful快速开发后端脚手架
- 图灵奖得主Jeff Ullman直言:机器学习不是数据科学的全部!统计学也不是
- Kaggle神器LightGBM最全解读!
- 机器学习中的优化算法!
- 超全!CS 顶会历届最佳论文大列表,机器学习、深度学习一应俱全!
- 机器学习组队【计划及安排】
- 谷歌让NLP模型也能debug,只要给一张「草稿纸」就行
- 日读论文100+,AI都替代不了!辞去医药研发总监后,她成为了一名全职学术警察...
- 一首凉凉送给这些学校硕博生!本学期不必返校!这些高校已经发布通知了