在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实现相关推荐

  1. web10 动态action的应用

    电影网站:www.aikan66.com 项目网站:www.aikan66.com  游戏网站:www.aikan66.com  图片网站:www.aikan66.com  书籍网站:www.aika ...

  2. Struts2之一个Action包含多个控制处理逻辑

    http://www.cnblogs.com/freeabyss/p/3290297.html 一.使用Action的动态方法调用     如果一个页面包含多个按钮,系统分别提交给Action的不同方 ...

  3. struts2的动态方法调用(DMI)和通配符映射

    动态方法调用 1.Struts2默认关闭DMI功能,需要使用需要手动打开,配置常量 [html] view plaincopy struts.enable.DynamicMethodInvocatio ...

  4. Struts2中XXX.Action类中方法的访问(三种方式)

    第一种:使用action标签的method属性(常规方法) Action类: package cn.tedu.web;import org.springframework.context.annota ...

  5. struts2 的一个action中配置多个result input

    主题:struts2 的一个action中配置多个result input 讨论下 本文来自: 浪曦视频在线 作者: hoojo 发表于: 2009-6-4 19:05 阅读: 2005 人 收藏 看 ...

  6. Struts2框架学习Action命名空间创建方式

         Struts2框架中Action类时一个单独的javabean对象,相比struts1来说,不需要去继承任何类型或实现任何借口,表单数据包含在Action中,而Struts1则必须继承org ...

  7. Struts2中的action类

    Struts2中的action类 action类在Struts2中承担了Model(模型)的角色,主要用于处理业务逻辑并存放HTTP请求处理过程中各个变量的值. 在Struts2里面,Action充当 ...

  8. struts2中把action中的值传递到jsp页面的例子

    例子: RegistAction的代码: package com.wss.action;import javax.servlet.http.HttpServletRequest;import org. ...

  9. Struts2里的Action返回Json数据

    hibernateTemplate和hibernateDaoSupport的注意问题! 正则表达式入门30分钟 Struts2里的Action返回Json数据 2010-08-03 22:46:46| ...

最新文章

  1. HttpURLConnection与HttpClient浅析---转
  2. 如何控制订单发料后不能删除组件
  3. pmp每日三题(2022年2月17日)
  4. java 哈希一致算法_一致哈希算法Java实现
  5. Oracle 11g 新特性 -- Invisible Indexes(不可见的索引) 说明
  6. AS3编码规范(转)
  7. 智能行业热点速览(2019.7.15)
  8. 2020版Java视频教程|java零基础到就业全套视频教程线上免费观看,java免费教程直接看
  9. \t\t[生活小妙招]脚气 脚臭 损人不利己之疾病
  10. VMware虚拟机下Ubuntu系统安装VMware Tools
  11. 【知识蒸馏】Deep Mutual Learning
  12. 微信开发与应用实验一、创建微信公众号
  13. fla文件中切记不能使用TLF文本
  14. python容器类型-字典
  15. SPSS教程之生存分析的Cox回归模型(比例风险模型)
  16. 一文读懂机智云物联网APP开发
  17. 创造习惯 — 如何科学地养成习惯
  18. 如何在iPhone和iPad上的Safari中在后台打开链接
  19. seo如何快速有效的引流
  20. 计算机开机错误62,【电脑开机error】电脑开机error no boot_电脑开机error1962

热门文章

  1. 三流Java搞技术,二流Java搞框架,一流Java…
  2. Spring Boot+JWT+Shiro+MyBatisPlus实现Restful快速开发后端脚手架
  3. 图灵奖得主Jeff Ullman直言:机器学习不是数据科学的全部!统计学也不是
  4. Kaggle神器LightGBM最全解读!
  5. 机器学习中的优化算法!
  6. 超全!CS 顶会历届最佳论文大列表,机器学习、深度学习一应俱全!
  7. 机器学习组队【计划及安排】
  8. 谷歌让NLP模型也能debug,只要给一张「草稿纸」就行
  9. 日读论文100+,AI都替代不了!辞去医药研发总监后,她成为了一名全职学术警察...
  10. 一首凉凉送给这些学校硕博生!本学期不必返校!这些高校已经发布通知了