这里主要以案例演示:涵盖以下知识点

1、动态方法调用:使用关键 符号 ! 进行操作   例如:/命名空间 ! 方法名

2、动态结果集:就是说,通过后台返回的结果 ${} 获取,重定向到符合预期的页面。

3、万能通配符:*_*  :第一个 * 为 类名、第二个 * 为方法名;{1}是第一个 *

4、内部方法的调用:就是说 Action 类中的 A()  调用 B()  A方法返回B()的结果集

5、跳转Action:就是说访问一个方法,根据返回的结果匹配 result中的 name 值 跳入下一个action (result type=chain)

 6、OGNL:(不过多讲述相关概念,这里以代码为核心)

值栈的内部结构分为两部分:

  第一部分:root,结构是 list 集合一般操作的都是 root 里面的数据

  第二部分:context,结构为 Map 集合

使用经历:

root 单列集合下的 前台获取的时候不需要写 #

context 双列集合  前台获取的时候需要写 #

1、往 单列集合中推送 集合类型的数据时,不能触碰到集合的引用名称。

将泛型集合推送到值栈中:

使用 <s:debug/> 标签查看 值栈的信息:

2、值栈的访问顺序为 从上往下 寻址。如有同名的属性名,则寻址离值栈顶端最近的

核心代码截取:推送到root 也就是单列集合下

使用 <s:debug/> 标签查看 值栈的信息:

3、在我们实现 Action 接口 或 继承ActionSupport 的类中的成员属性都是放在 root 单列集合下的

4、往值栈 context 推送 key那一列会有我们指定的引用名称(需要获取的时候需要 #)

 以上为可能会遇到的问题。

完整Demo展示:

 点我下载案例Demo:

 案例结构:

为演示通配符需要方法名与jsp名称一致,add.jsp 与 list.jsp 创建在 CoordinAction文件下 

POM:

  1. <properties>
  2. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  3. <maven.compiler.source>1.7</maven.compiler.source>
  4. <maven.compiler.target>1.7</maven.compiler.target>
  5. </properties>
  6.  
  7. <dependencies>
  8.  
  9. <!--测试JAR-->
  10. <dependency>
  11. <groupId>junit</groupId>
  12. <artifactId>junit</artifactId>
  13. <version>4.11</version>
  14. </dependency>
  15. <!--javaee.jar包是支持javaweb编程的基础jar包,跟javase编程需要jre一样!-->
  16. <dependency>
  17. <groupId>javaee</groupId>
  18. <artifactId>javaee-api</artifactId>
  19. <version>5</version>
  20. </dependency>
  21. <!--Struts2-core核心-->
  22. <dependency>
  23. <groupId>org.apache.struts</groupId>
  24. <artifactId>struts2-core</artifactId>
  25. <version>2.3.4.1</version>
  26. </dependency>
  27. <!--xwork 的核心包,最主要的功能是 支持了过滤器(interceptor)。-->
  28. <dependency>
  29. <groupId>org.apache.struts.xwork</groupId>
  30. <artifactId>xwork-core</artifactId>
  31. <version>2.3.4.1</version>
  32. </dependency>
  33.  
  34. </dependencies>

CoordinAction:

  1. package com.gdbd.action;
  2.  
  3. import com.opensymphony.xwork2.ActionContext;
  4. import com.opensymphony.xwork2.ActionSupport;
  5.  
  6. import java.util.Map;
  7.  
  8. /**
  9. * @author asus
  10. */
  11. public class CoordinAction extends ActionSupport {
  12.  
  13. private String message;
  14. private String mess;
  15.   ...省略 Get Set
  16.  
  17. /***
  18. * 动态方法的调用
  19. * @return
  20. */
  21. public String list() {
  22. this.setMessage("通过调用 add 方法拿到返回的name寻址,再次调度 Action 中的list");
  23. return "list";
  24. }
  25.  
  26. public String add() {
  27. this.setMessage("动态方法调度!!!!");
  28. return "add";
  29. }
  30.  
  31. public String get() {
  32. Map<String, Object> session = ActionContext.getContext().getSession();
  33. if (this.message != null) {
  34. session.put("message", "动态结果集调用成功!!!");
  35. this.setMess("demo2");
  36. } else {
  37. session.put("message", "动态结果集调用失败!!!");
  38. this.setMess("error");
  39. }
  40. return "get";
  41. }
  42.  
  43. /***
  44. * 内部方法的调用
  45. * @return
  46. */
  47. public String demo1() {
  48. Map request = (Map) ActionContext.getContext().get("request");
  49. request.put("message", "测试数据Action内部调度!!!");
  50. return "demo2";
  51. }
  52.  
  53. public String demo2() {
  54. return demo1();
  55. }
  56.  
  57. }

OgnlAction:

  1. package com.gdbd.action;
  2.  
  3. import com.gdbd.bean.UserInfo;
  4. import com.opensymphony.xwork2.ActionContext;
  5. import com.opensymphony.xwork2.ActionSupport;
  6. import com.opensymphony.xwork2.util.ValueStack;
  7. import java.util.List;
  8. import java.util.ArrayList;
  9.  
  10. /**
  11. * @author asus
  12. */
  13. public class OgnlAction extends ActionSupport {
  14.  
  15. private List<UserInfo> List;
  16.   ...省略 Get Set
  17.  
  18. /***
  19. * OGNL:存储到单列集合
  20. */
  21. public String demo1() {
  22. ActionContext context = ActionContext.getContext();
  23. //获取值栈
  24. ValueStack valueStack = context.getValueStack();
  25. //伪造数据
  26. UserInfo userInfo=new UserInfo();
  27. userInfo.setUserName("MLQ");
  28. userInfo.setUserPwd("MLQ");
  29. UserInfo userInfo1=new UserInfo();
  30. userInfo1.setUserName("FKX");
  31. userInfo1.setUserPwd("FKX");
  32. List<UserInfo> infoList=new ArrayList<UserInfo>();
  33. infoList.add(userInfo);
  34. infoList.add(userInfo1);
  35. /***
  36. * 将数据推送到单列集合中
  37. * 缺点:对集合类型进行操作的时候,没有办法触碰到集合的引用名称
  38. * 例如:添加一个 泛型List<UserInfo> 集合 没有
  39. */
  40. valueStack.push(userInfo);
  41. valueStack.push(userInfo1);
  42. valueStack.push(infoList);
  43. return "demo1";
  44. }
  45. /***
  46. * OGNL:存储到双列集合
  47. */
  48. public String demo2() {
  49. ActionContext context = ActionContext.getContext();
  50. //获取值栈
  51. ValueStack valueStack = context.getValueStack();
  52. //伪造数据
  53. UserInfo userInfo=new UserInfo();
  54. userInfo.setUserName("MLQ");
  55. userInfo.setUserPwd("MLQ");
  56. UserInfo userInfo1=new UserInfo();
  57. userInfo1.setUserName("FKX");
  58. userInfo1.setUserPwd("FKX");
  59. List<UserInfo> infoList=new ArrayList<UserInfo>();
  60. infoList.add(userInfo);
  61. infoList.add(userInfo1);
  62. /***
  63. * 将数据推送到双列集合中
  64. */
  65. //valueStack.push(infoList);将泛型集合推送到值栈中,没有引用地址
  66. this.List=infoList;
  67. valueStack.getContext().put("infoList",infoList);
  68.  
  69. return "demo1";
  70. }
  71.  
  72. }

UserInfo:

  1. package com.gdbd.bean;
  2.  
  3. import java.io.Serializable;
  4.  
  5. /**
  6. * user 实体类
  7. * @author asus
  8. */
  9. public class UserInfo implements Serializable {
  10.  
  11. private String userName;
  12. private String userPwd;
  13.  
  14. ...省略 Get Set
  15. }

struts.xml:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  3. "http://struts.apache.org/dtds/struts-2.0.dtd">
  4. <struts>
  5.  
  6. <!-- 是否开启动态方法调用 -->
  7. <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
  8. <!--更改 Struts.xml的 节点不需要重启-->
  9. <constant name="struts.devMode" value="true"></constant>
  10.  
  11. <!--动态-->
  12. <package name="default" namespace="/" extends="struts-default">
  13.  
  14. <!--动态方法调度 使用( ! ) -->
  15. <action name="demo" class="com.gdbd.action.CoordinAction">
  16. <result name="add">/error.jsp</result>
  17. </action>
  18. <!--
  19. *_*:
  20. 第一个 * 为 类名
  21. 第二个 * 为 方法名
  22. -->
  23. <!--万能通配符-->
  24. <action name="*_*" class="com.gdbd.action.{1}" method="{2}">
  25. <result name="{2}">{1}/{2}.jsp</result>
  26. </action>
  27.  
  28. </package>
  29.  
  30. <!--内部方法的调用-->
  31. <package name="demo" namespace="/demo1" extends="struts-default">
  32.  
  33. <!--
  34. action 内部方法调度
  35. -->
  36. <action name="mo" class="com.gdbd.action.CoordinAction" method="demo1">
  37. <result name="demo2">/demo2.jsp</result>
  38. </action>
  39. <!--
  40. action 内部方法调度 重定向页面
  41. -->
  42. <action name="mo1" class="com.gdbd.action.CoordinAction" method="demo1">
  43. <result name="demo2" type="redirect">/demo2.jsp</result>
  44. </action>
  45.  
  46. </package>
  47.  
  48. <!--调度 action 中的方法,在根据结果集再次跳转到 action 方法 -->
  49. <package name="demo2" namespace="/demo2" extends="struts-default">
  50.  
  51. <action name="listdemo" class="com.gdbd.action.CoordinAction" method="list">
  52. <result name="list">/demo2.jsp</result>
  53. </action>
  54.  
  55. <action name="mo" class="com.gdbd.action.CoordinAction" method="add">
  56. <result name="add" type="chain">
  57. <!--默认是转发-->
  58. <param name="actionName">listdemo</param>
  59. <param name="namespace">/demo2</param>
  60. </result>
  61. </action>
  62.  
  63. </package>
  64.  
  65. <!--动态结果:重定向页面(转发无效)-->
  66. <package name="demo3" namespace="/demo3" extends="struts-default">
  67.  
  68. <action name="mo" class="com.gdbd.action.CoordinAction" method="get">
  69. <result name="get" type="redirect">${mess}</result>
  70. </action>
  71. <action name="demo2">
  72. <result>/demo2.jsp</result>
  73. </action>
  74. <action name="error">
  75. <result>/error.jsp</result>
  76. </action>
  77.  
  78. </package>
  79.  
  80. <!--OGNL 测试-->
  81. <package name="demo4" namespace="/demo4" extends="struts-default">
  82.  
  83. <!--推送到单列集合中-->
  84. <action name="mo" class="com.gdbd.action.OgnlAction" method="demo1">
  85. <result name="demo1">/demo1.jsp</result>
  86. </action>
  87. <!--推送到双列集合中-->
  88. <action name="mo1" class="com.gdbd.action.OgnlAction" method="demo2">
  89. <result name="demo1">/demo1.jsp</result>
  90. </action>
  91. </package>
  92.  
  93. </struts>

add.jsp:

  1. <%--
  2. Created by IntelliJ IDEA.
  3. User: asus
  4. Date: 2018/11/17
  5. Time: 9:33
  6. To change this template use File | Settings | File Templates.
  7. --%>
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  9. <html>
  10. <head>
  11. <title>Title</title>
  12. </head>
  13. <body>
  14. <h1>add==========</h1>
  15. </body>
  16. </html>

list.jsp:

  1. <%--
  2. Created by IntelliJ IDEA.
  3. User: asus
  4. Date: 2018/11/17
  5. Time: 9:33
  6. To change this template use File | Settings | File Templates.
  7. --%>
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  9. <html>
  10. <head>
  11. <title>Title</title>
  12. </head>
  13. <body>
  14. <h1>list==========</h1>
  15. </body>
  16. </html>

demo1.jsp:

  1. <%@ taglib prefix="s" uri="/struts-tags" %>
  2. <%--
  3. Created by IntelliJ IDEA.
  4. User: asus
  5. Date: 2018/11/17
  6. Time: 9:33
  7. To change this template use File | Settings | File Templates.
  8. --%>
  9. <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
  10. <html>
  11. <head>
  12. <title>Title</title>
  13. </head>
  14. <body>
  15. <fieldset>
  16. <legend>OGNL:获取的结果(值栈单列集合)</legend>
  17. 姓名为:<s:property value="userName"></s:property>
  18. <br/>
  19. 密码为:<s:property value="userPwd"></s:property>
  20. </fieldset>
  21. <br/><br/>
  22. <fieldset>
  23. <legend>OGNL:获取的结果(值栈Root 单列集合)</legend>
  24. 姓名为:<s:property value="List[0].userName"></s:property>
  25. <br/>
  26. 密码为:<s:property value="List[1].userPwd"></s:property>
  27. </fieldset>
  28. <br/><br/>
  29. <fieldset>
  30. <legend>OGNL:获取的结果(值栈双列集合)</legend>
  31. 姓名为:<s:property value="#infoList[0].userName"></s:property>
  32. <br/>
  33. 密码为:<s:property value="#infoList[1].userPwd"></s:property>
  34. </fieldset>
  35. <br/><br/>
  36. <fieldset>
  37. <legend>OGNL:获取的结果(值栈双列集合,便利读取)</legend>
  38. <s:iterator value="infoList" id="info">
  39. <s:property value="#info.userName"/>
  40. </s:iterator>
  41. </fieldset>
  42. <br/><br/>
  43. <s:debug/>
  44. </body>
  45. </html>

demo2.jsp:

  1. <%--
  2. Created by IntelliJ IDEA.
  3. User: asus
  4. Date: 2018/11/17
  5. Time: 9:33
  6. To change this template use File | Settings | File Templates.
  7. --%>
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
  9. <html>
  10. <head>
  11. <title>Title</title>
  12. </head>
  13. <body>
  14. <h1>${message}</h1>
  15. </body>
  16. </html>

error.jsp:

  1. <%--
  2. Created by IntelliJ IDEA.
  3. User: asus
  4. Date: 2018/11/17
  5. Time: 9:33
  6. To change this template use File | Settings | File Templates.
  7. --%>
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
  9. <html>
  10. <head>
  11. <title>Title</title>
  12. </head>
  13. <body>
  14. <h1>${message}</h1>
  15. </body>
  16. </html>

index.jsp:

  1. <%--
  2. Created by IntelliJ IDEA.
  3. User: asus
  4. Date: 2018/11/17
  5. Time: 10:34
  6. To change this template use File | Settings | File Templates.
  7. --%>
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  9. <html>
  10. <head>
  11. <title>Title</title>
  12. </head>
  13. <body>
  14. <fieldset>
  15. <legend>动态方法调度</legend>
  16. <a href="/demo!add">动态方法调度</a>
  17. </fieldset>
  18. <br/><br/>
  19. <fieldset>
  20. <legend>万能通配符</legend>
  21. <a href="/CoordinAction_list">万能通配符</a>
  22. &nbsp;&nbsp;&nbsp;
  23. <a href="/CoordinAction_add">万能通配符</a>
  24. </fieldset>
  25. <br/><br/>
  26. <fieldset>
  27. <legend>内部方法调度返回的信息</legend>
  28. <a href="/demo1/mo">内部方法调度返回的信息:默认是转发</a>
  29. &nbsp;&nbsp;&nbsp;
  30. <a href="/demo1/mo1">内部方法调度返回的信息:使用重定向</a>
  31. </fieldset>
  32. <br/><br/>
  33. <fieldset>
  34. <legend>调度 action 中的方法,在根据结果集再次跳转到 action 方法</legend>
  35. <a href="/demo2/mo">跳转 add 方法 根据结果再次 指向list:转发操作</a>
  36. &nbsp;&nbsp;&nbsp;
  37. <a href="#">###</a>
  38. </fieldset>
  39. <br/><br/>
  40. <fieldset>
  41. <legend>动态结果调度</legend>
  42. <a href="/demo3/mo?message=123">动态结果调度:重定向</a>
  43. &nbsp;&nbsp;&nbsp;
  44. <a href="#">###</a>
  45. </fieldset>
  46. <br/><br/>
  47. <fieldset>
  48. <legend>OGNL</legend>
  49. <a href="/demo4/mo">OGNL:存储到值栈的单列集合</a>
  50. &nbsp;&nbsp;&nbsp;
  51. <a href="/demo4/mo1">OGNL:存储到值栈的单列集合</a>
  52. &nbsp;&nbsp;&nbsp;
  53. </fieldset>
  54. <br/><br/>
  55. </body>
  56. </html>

web.xml:

  1. <!DOCTYPE web-app PUBLIC
  2. "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  3. "http://java.sun.com/dtd/web-app_2_3.dtd" >
  4.  
  5. <web-app>
  6. <display-name>Archetype Created Web Application</display-name>
  7.  
  8. <!--核心过滤器-->
  9. <filter>
  10. <filter-name>struts2</filter-name>
  11. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  12. </filter>
  13. <filter-mapping>
  14. <filter-name>struts2</filter-name>
  15. <url-pattern>/*</url-pattern>
  16. </filter-mapping>
  17.  
  18. </web-app>

分享知识-快乐自己:Struts2(动态方法、动态结果、通配符、方法内部跳转、action跳转、OGNL 的使用及注意事项)的更多相关文章

  1. 分享知识-快乐自己:Mybatis 基础动态语句

    目录: User: package mlq.bean; /** * 用户实体类 */ public class User { private Integer uId; private String u ...

  2. 分享知识-快乐自己:List 集合去重合并 , 多种方法演示

    最近空闲时间去面试 , 被问了一个问题list如何去重合并 , 想了半天只想到了最繁琐的循环方法 , 顿觉丢人. 整理一下资料供大家参考: List<String> a = new Arr ...

  3. Struts2学习四----------动态方法调用

    © 版权声明:本文为博主原创文章,转载请注明出处 Struts2动态方法调用 - 默认:默认执行方法中的execute方法,若指定类中没有该方法,默认返回success <package nam ...

  4. Struts2的多方法动态Action

    原创 一个简单的Action里面的核心方法只有一个execute(); 定义多个核心方法的Action,有如下3种方式: 为Action配置method属性 动态方法调用 使用通配符映射方式 动态方法 ...

  5. Struts2深入之动态调用Action

    使用过Struts2的小伙伴们应该知道当我们的action的方法过多是如果需要通过Struts2框架进行运行,我们就必须在Struts2的配置文件Struts2.xml文件中配置多个action属性标 ...

  6. 10、一个action中处理多个方法的调用第一种方法动态调用

    我们新建一个用户的action package com.weiyuan.test; import com.opensymphony.xwork2.ActionSupport; /** * * 这里不用 ...

  7. 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间

    [源码下载] 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间 作者:webabcd 介绍速战速决 之 PHP 动态地创 ...

  8. Delphi动态事件深入分析(对象方法在调用的时候会传递一个隐含的Self指针,而该指针的值在EAX中。即左边第一个参数)

    Delphi动态事件深入分析 2009-2-7 作者:不得闲核心提示:本实验证明了在类中方法的调用时候,所有的方法都隐含了一个Self参数,并且该参数作为对象方法的第一个参数传递... 首先做一个空窗 ...

  9. select 下拉菜单Option对象使用add(elements,index)方法动态添加

    原生js 的add函数为下拉菜单增加选项 1.object.add(oElement [, iIndex]) index 可选参数:指定元素放置所在的索引号,整形值.如果没有指定值,将添加到集合的最后 ...

随机推荐

  1. vue2.X computed 计算属性

    需求:数据msg值为12345,我们现在需要反向显示成54321. 1.在模板中绑定表达式是非常便利的,但是它们实际上只用于简单的操作.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <! ...

  2. Codeforces 223C Partial Sums 数论+组合数学

    题意非常easy,求不是那么好求的,k非常大 要操作非常多次,所以不可能直接来的.印象中解决操作比較多无非线段树 循环节 矩阵 组合数等等吧,这道题目 也就仅仅能多画画什么 的了 就以第一个案例为主吧 ...

  3. 如何利用Require.Js管理多页面站点文件(译)

    英文版地址 最近使用 Require.Js 的时候我发现它确实是一个改善代码管理的一个好方法.我以前发表Backbone类的文章时曾提到过 Require,但此前,我从未在传统的多页面网站内使用到 R ...

  4. AWR元数据的迁移或导入到其它数据库

    我们能够将AWR元数据迁移(导入)到其它数据库.低版本号的导入到高版本号,再用高版本号的数据库生成AWR报告,也能使用一些新特性,如 SQL ordered by Physical Reads (Un ...

  5. 图像检测之sift and surf---sift中的DOG图 surf hessian

    http://www.cnblogs.com/tornadomeet/archive/2012/08/17/2644903.html http://www.cnblogs.com/slysky/arc ...

  6. 抽钻石vs中奖门 概率问题

    在概率问题中,假设跟着日常经验与感觉走.常常会得到错误的答案.以下"抽钻石"的故事非常可以说明这一点. 题目一:某天电视台举办了这种一个游戏节目.主持人首先拿出三个盒子.已知这三个 ...

  7. Python常用变量处理手记(拼接数字,转json)

    1.拼接字符串和数字时,应先把数字做转换 如,bytes(page) 再做拼接:str+page 或者 s = 'abc' print s + str(1) #abc1 使用list和tuple 参考 ...

  8. 怎么用cookie解决选项卡问题刷新后怎么保持原来的选项?

    什么是cookie? Cookies虽然一般都以英文名呈现,但是它还是有一个可爱的中文名“小甜饼”.Cookies是指服务器暂存放在你的电脑里的txt格式的文本文件资料,主要用于网络服务器辨别电脑使用 ...

  9. Centos7重新安装yum

    Centos7重新安装yum rpm -qa|grep yum 然后用下面的命令删除出现的xxx包: rpm -e --nodeps xxx 下载 python-urlgrabber-3.10-8.e ...

  10. ES mapping映射及优化

    mapping映射 主要类型: 同一index下,不同type中如果有相同filed:es进行mapping映射的时候,按照先写进去的指定类型:比如同一index,包含的type中都有key1字段,如 ...