基本介绍

Struts 2

       Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts
2的体系结构与Struts 1的体系结构区别巨大。Struts 2以WebWork为核心,採用拦截器的机制来处理用户的请求,这种设计也使得业务逻辑控制器能够与ServletAPI全然脱离开,所以Struts 2能够理解为WebWork的更新产品。尽管从Struts 1到Struts 2有着太大的变化,可是相对于WebWork。Struts 2的变化非常小。【本文的演示项目以Struts 2.3.16 版本号为例】

【转载使用。请注明出处:http://blog.csdn.net/mahoking/article/details/35984507

Struts 2 IOC

           对于IoC来说。常见的就是Spring框架的了。而且在眼下Java EE开发中,使用SSH框架时,也主要依赖于Spring框架所提供的IoC功能。

但Struts2框架本身也提供了IoC的功能。

IoC(Inversion of Control)。随着Java社区中轻量级容器(Lightweight
Contianer)的推广而越来越为大家耳熟能详。

值得一提的是,Spring确实是一个值得学习的框架,由于有越来越多的开源组件,如iBATIS(新版本号为Mybatis)等。都放弃与Spring重叠的功能的开发。因此,Struts 2推荐大家通过Spring实现控制反转。

       控制反转(Inversion of Control。IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题。也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(DependencyInjection,简称DI)和依赖查找。依赖注入应用比較广泛。

         1、依赖查找(Dependency Lookup):容器提供回调接口和上下文环境给组件。EJB和Apache Avalon都使用这种方式。

         2、依赖注入(Dependency Injection):组件不做定位查询,仅仅提供普通的Java方法让容器去决定依赖关系。

后者是时下最流行的IoC类型。其又有接口注入(Interface Injection)。设值注入(Setter Injection)和构造子(器)注入(ConstructorInjection)三种方式。

【如想深入了解。须要读者自行拓展阅读】

Struts 2 ValueStack(值栈)与OGNL

        值栈ValueStack是Struts2框架核心组件,它提供对上下文信息和运行环境中元素的訪问机制。

其在底层实现了一个栈,但与传统栈的实现有所不同。

        值栈由下面4个层级对象组成:

        (1) 暂时对象:这些对象在请求处理过程中须要暂时保存。比方集合中当前正在迭代的元素;

        (2) 模型对象:当Action实现了ModelDriven接口时,模型对象就会被存放在栈中被运行的Action前面;否则不存在这个级别的内容;

        (3) Action对象:此对象为当前正在运行的action。

        (4) 命名对象:不论什么对象都能够被赋予一个标志符而成为命名对象。比方与HTTP同等作用域的对象集合相应的Struts2命名对象,#application、#session、#request、#attr和#parameters等。

        值栈的使用方式:

        栈的传统使用方式是压栈和出栈。

对于值栈则是通过使用OGNL(ObjectGraph Navigational Language对象导航语言)语法编写的特定表达式来查找,或者是在该表达式之上求值。

        OGNL表达式【该部分的应用。会在演示Demo中涉及】

  •  使用圆点符号和表达式求值
  •  调用被检索对象的方法
  •  结合自己定义标签使用

      常见使用方法:

      (1) person.name  调用getPerson().getName()

      (2) #session.user从会话对象中获取user属性对象

      (3) #session.shopcart.size()获取会话中购物车的数量

      (4) top
获取值栈最顶层对象 【该部分须要读者,自行拓展阅读】

       【转载使用。请注明出处:http://blog.csdn.net/mahoking/article/details/35984507

參考案例

第一步:创建Web项目 StrutsDemo
第二步:加入所需的jar文件(包)   參见【相关Jar文件】
项目完整结构截图例如以下:

第三步:加入并编辑struts.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4. "http://struts.apache.org/dtds/struts-2.3.dtd">
  5. <struts>
  6. <constant name="struts.i18n.encoding" value="UTF-8" />
  7. <!-- 启动开发模式 -->
  8. <constant name="struts.devMode" value="true"/>
  9. <!-- <constant name="struts.objectFactory" value="spring" /> bean交spring管理 -->
  10. <!-- 为true可使用感叹号调用方法,官网不推荐 -->
  11. <constant name="struts.enable.DynamicMethodInvocation" value="false" />
  12. <!-- 载入src/config/struts2/ 文件夹下全部struts文件 注意命名格式 -->
  13. <!-- <include file="config/struts2/struts-*.xml"></include> -->
  14. <include file="config/struts2/struts-test.xml"></include>
  15. </struts>

第四步:编写Action 对象【本例涉及IOC与非IOC两种方式】

1、 非IOC方式Action

  1. /**
  2. * 非IoC方式Action
  3. * @author Mahc
  4. */
  5. public class UnIOCmode {
  6. private String message;
  7. private ArrayList<Person> persons = new ArrayList<Person>();
  8. public String method() {
  9. // 获得ActionContext实例,以便訪问Servlet API
  10. ActionContext ctx = ActionContext.getContext();
  11.  
  12. // 获取Parameter
  13. // Map paramMap = ctx.getParameters(); 获取的对象为String[]
  14. if(null!=ctx.getParameters().get("msg")){
  15. String[] msg = (String[])ctx.getParameters().get("msg");
  16. System.out.println(msg[0]);
  17. }
  18.  
  19. // Java Servlet HttpServletRequest 对象操作
  20. String servletMsg = ServletActionContext.getRequest().getParameter("msg");
  21. System.out.println(servletMsg);
  22. //
  23. // ctx.getParameters().put("msg", "parameter信息"); 待检測
  24.  
  25. // 向application域存入数据
  26. // Map<String, Object> applicationMap = ctx.getApplication();
  27. ctx.getApplication().put("msg", "application信息");
  28.  
  29. // 向session域存入数据
  30. // Map<String, Object> sessionMap = ctx.getSession();
  31. ctx.getSession().put("msg", "seesion信息");
  32.  
  33. // 向request域存入数据
  34. HttpServletRequest request = ServletActionContext.getRequest();
  35. request.setAttribute("msg", "request信息");
  36.  
  37. //////////////////////////////////////////
  38. System.out.println("Struts2 非IOC 配置成功!
  39.  
  40. ");
  41. message = "Success";
  42. //////////////////////////////////////////
  43.  
  44. Person p = new Person();
  45. p.setAge(25);
  46. p.setBirthday(new Date());
  47. p.setName("pla1");
  48. persons.add(p);
  49. // 为persons赋值
  50. for(int i=1;i<4;i++){
  51. Person person = new Person();
  52. person.setAge(19+i);
  53. person.setBirthday(new Date());
  54. person.setName("pla"+i);
  55. persons.add(person);
  56. }
  57. return "msg";
  58. }
  59.  
  60. public String getMessage() {
  61. return message;
  62. }
  63.  
  64. public void setMessage(String message) {
  65. this.message = message;
  66. }
  67.  
  68. public ArrayList<Person> getPersons() {
  69. return persons;
  70. }
  71.  
  72. public void setPersons(ArrayList<Person> persons) {
  73. this.persons = persons;
  74. }
  75. }

2、 IOC方式Action

  1. /**
  2. * IOC方式Action
  3. * @author Mahc
  4. */
  5. public class IOCmode extends ActionSupport implements ServletRequestAware ,SessionAware,ApplicationAware,ParameterAware{
  6.  
  7. private HttpServletRequest request;
  8. private Map<String,Object> sessionMap;
  9. private Map<String,Object> applicationMap;
  10. private Map parameterMap;
  11.  
  12. private ArrayList<Person> persons = new ArrayList<Person>();
  13. private String message;
  14.  
  15. public String getMessage() {
  16. return message;
  17. }
  18.  
  19. public void setMessage(String message) {
  20. this.message = message;
  21. }
  22.  
  23. public void setServletRequest(HttpServletRequest request) {
  24. this.request = request;
  25. }
  26.  
  27. public void setSession(Map<String, Object> session) {
  28. sessionMap = session;
  29. }
  30.  
  31. public void setApplication(Map<String, Object> application) {
  32. applicationMap = application;
  33. }
  34.  
  35. public void setParameters(Map<String, String[]> parameter) {
  36. parameterMap = parameter;
  37. if(null!=parameterMap.get("ioc_msg")){
  38. String[] ioc_msgs = (String[]) parameterMap.get("ioc_msg");
  39. System.out.println("ioc_msg========="+ioc_msgs[0]);
  40. }
  41. }
  42.  
  43. public String method(){
  44.  
  45. // 向application域存入数据
  46. applicationMap.put("ioc_msg", "application信息_ioc");
  47.  
  48. // 向session域存入数据
  49. sessionMap.put("ioc_msg", "session信息_ioc");
  50.  
  51. // 向request域存入数据
  52. request.setAttribute("ioc_msg", "request信息_ioc");
  53.  
  54. //////////////////////////////////////////
  55. System.out.println("Struts2 IOC 配置成功。");
  56. message = "IOC_SUCCESS";
  57. //////////////////////////////////////////
  58.  
  59. //□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
  60. Person p = new Person();
  61. p.setAge(25);
  62. p.setBirthday(new Date());
  63. p.setName("pla1");
  64. persons.add(p);
  65. // 为persons赋值
  66. for(int i=1;i<4;i++){
  67. Person person = new Person();
  68. person.setAge(19+i);
  69. person.setBirthday(new Date());
  70. person.setName("pla"+i);
  71. persons.add(person);
  72. }
  73. //□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
  74.  
  75. return "IOC_SUCCESS";
  76. }
  77.  
  78. public ArrayList<Person> getPersons() {
  79. return persons;
  80. }
  81.  
  82. public void setPersons(ArrayList<Person> persons) {
  83. this.persons = persons;
  84. }
  85. }

第五步:编写相关JSP页面 

【IOC.jsp相应IOC方式。unIOC.jsp相应非IOC方式】

1、 unIOC.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%@ taglib prefix="s" uri="/struts-tags"%>
  3.  
  4. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  5. <html>
  6. <head>
  7.  
  8. <title>首页</title>
  9. <meta http-equiv="pragma" content="no-cache">
  10. <meta http-equiv="cache-control" content="no-cache">
  11. <meta http-equiv="expires" content="0">
  12. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  13. <meta http-equiv="description" content="This is my page">
  14. </head>
  15.  
  16. <body>
  17. <p>
  18. parameters:
  19. <s:property value="#parameters.msg" />
  20. </p>
  21. <p>
  22. request.msg:
  23. <s:property value="#request.msg" />
  24. </p>
  25. <p>
  26. session.msg:
  27. <s:property value="#session.msg" />
  28. </p>
  29. <p>
  30. application.msg:
  31. <s:property value="#application.msg" />
  32. </p>
  33. <p>
  34. attr.msg:
  35. <s:property value="#attr.msg" />
  36. </p>
  37. <hr />
  38. <%=request.getAttribute("msg")%>
  39. ${message}
  40.  
  41. <h3>
  42. 用于过滤和投影(projecting)集合
  43. </h3>
  44.  
  45. <p>
  46. 年龄大于20
  47. </p>
  48.  
  49. <ul>
  50. <!-推断年龄-->
  51.  
  52. <s:iterator value="persons.{?#this.age>20}">
  53.  
  54. <li>
  55. <s:property value="name" />
  56. - 年龄:
  57. <s:property value="age" />
  58. </li>
  59.  
  60. </s:iterator>
  61.  
  62. </ul>
  63.  
  64. <p>
  65. 姓名为pla1的年龄:
  66. <s:property value="persons.{?#this.name=='pla1'}.{age}[0]" />
  67. </p>
  68.  
  69. <hr />
  70.  
  71. <h3>
  72. 构造Map
  73. </h3>
  74.  
  75. <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />
  76.  
  77. <p>
  78. The value of key "foo1" is
  79. <s:property value="#foobar['foo1']" />
  80. </p>
  81.  
  82. <hr />
  83.  
  84. <h4>
  85. %符号的使用方法
  86. </h4>
  87.  
  88. <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />
  89.  
  90. <p>
  91. The value of key "foo1" is
  92. <s:property value="#foobar['foo1']" />
  93. </p>
  94.  
  95. <p>
  96. 不使用%:
  97. <s:url value="#foobar['foo1']" />
  98. </p>
  99.  
  100. <p>
  101. 使用%:
  102. <s:url value="%{#foobar['foo1']}" />
  103. </p>
  104. </body>
  105. </html>

2、 IOC.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%@ taglib prefix="s" uri="/struts-tags"%>
  3.  
  4. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  5. <html>
  6. <head>
  7. <title>首页</title>
  8. <meta http-equiv="pragma" content="no-cache">
  9. <meta http-equiv="cache-control" content="no-cache">
  10. <meta http-equiv="expires" content="0">
  11. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  12. <meta http-equiv="description" content="This is my page">
  13. </head>
  14.  
  15. <body>
  16. <p>
  17. parameters:
  18. <s:property value="#parameters.ioc_msg" />
  19. </p>
  20. <p>
  21. request.ioc_msg:
  22. <s:property value="#request.ioc_msg" />
  23. </p>
  24. <p>
  25. session.ioc_msg:
  26. <s:property value="#session.ioc_msg" />
  27. </p>
  28. <p>
  29. application.ioc_msg:
  30. <s:property value="#application.ioc_msg" />
  31. </p>
  32. <p>
  33. attr.msg:
  34. <s:property value="#attr.ioc_msg" />
  35. </p>
  36. <hr />
  37. <%=request.getAttribute("ioc_msg")%>
  38. ${message}
  39.  
  40. <h3>
  41. 用于过滤和投影(projecting)集合
  42. </h3>
  43.  
  44. <p>
  45. 年龄大于20
  46. </p>
  47.  
  48. <ul>
  49. <!-推断年龄-->
  50.  
  51. <s:iterator value="persons.{?
  52.  
  53. #this.age>20}">
  54.  
  55. <li>
  56. <s:property value="name" />
  57. - 年龄:
  58. <s:property value="age" />
  59. </li>
  60.  
  61. </s:iterator>
  62.  
  63. </ul>
  64.  
  65. <p>
  66. 姓名为pla1的年龄:
  67. <s:property value="persons.{?
  68.  
  69. #this.name=='pla1'}.{age}[0]" />
  70. </p>
  71.  
  72. <hr />
  73.  
  74. <h3>
  75. 构造Map
  76. </h3>
  77.  
  78. <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />
  79.  
  80. <p>
  81. The value of key "foo1" is
  82. <s:property value="#foobar['foo1']" />
  83. </p>
  84.  
  85. <hr />
  86.  
  87. <h4>
  88. %符号的使用方法
  89. </h4>
  90.  
  91. <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />
  92.  
  93. <p>
  94. The value of key "foo1" is
  95. <s:property value="#foobar['foo1']" />
  96. </p>
  97.  
  98. <p>
  99. 不使用%:
  100. <s:url value="#foobar['foo1']" />
  101. </p>
  102.  
  103. <p>
  104. 使用%:
  105. <s:url value="%{#foobar['foo1']}" />
  106. </p>
  107. </body>
  108. </html>

第六步:编辑Action相应XML文件(struts-test.xml)

struts-test.xml文件位于src/ config/struts2文件夹下

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.3.dtd">
  5.  
  6. <struts>
  7. <package name="test1" namespace="/test" extends="struts-default">
  8. <action name="ioc_*" class="cn.mahaochen.web.IOCmode" method="{1}">
  9. <result name="IOC_SUCCESS">/IOC.jsp</result>
  10. </action>
  11. <action name="unioc_*" class="cn.mahaochen.web.UnIOCmode"
  12.  
  13. method="{1}">
  14. <result name="msg">/unIOC.jsp</result>
  15. </action>
  16. </package>
  17. </struts>

第七步:測试操作
编辑index.jsp页面

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%@ taglib prefix="s" uri="/struts-tags"%>
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  4. <html>
  5. <head>
  6. <title>Struts2.3.16 高速使用</title>
  7. <meta http-equiv="pragma" content="no-cache">
  8. <meta http-equiv="cache-control" content="no-cache">
  9. <meta http-equiv="expires" content="0">
  10. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  11. <meta http-equiv="description" content="This is my page">
  12. <style type="text/css">
  13. body {
  14. text-align:center;
  15. }
  16. </style>
  17. </head>
  18. <body >
  19. <p><h3>Struts2.3.16 高速使用</h3></p>
  20. <hr />
  21. <p><a href="test/unioc_method.action" >Struts2 非IOC方式</a></p>
  22. <p><a href="test/unioc_method.action?msg=123message321" >Struts2 非
  23.  
  24. IOC方式[含请求參数]</a></p>
  25. <p><a href="test/ioc_method.action" >Struts2   IOC方式
  26.  
  27. </a></p>
  28. <p><a href="test/ioc_method.action?ioc_msg=123message321" >Struts2
  29.  
  30.   IOC方式[含请求參数]</a></p>
  31. <hr />
  32. </body>
  33. </html>

測试用URL

        http://127.0.0.1/StrutsDemo/test/unioc_method.action    非IOC方式測试
        http://127.0.0.1/StrutsDemo/test/ioc_method.action       IOC方式測试

界面截图

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWFob2tpbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

相关Jar文件

  • struts2-core-2.3.16.jar
  • xwork-core-2.3.16.jar
  • commons-logging-1.1.3.jar
  • ognl-3.0.6.jar
  • commons-fileupload-1.3.jar
  • freemarker-2.3.19.jar
  • commons-io-2.2.jar
  • javassist-3.11.0.GA.jar
  • commons-lang-2.4.jar
  • commons-lang3-3.1.jar

下载地址

下载演示项目 http://download.csdn.net/detail/ma_hoking/7561727

參考文献

1、 http://www.java3z.com/cwbwebhome/article/article2/2938.html?id=1631
2、 http://blog.163.com/neu_lxb/blog/static/179417010201145104245861/
【转载使用,请注明出处:http://blog.csdn.net/mahoking/article/details/35984507

Struts 2相关配置与基本操作演示(案例Demo)的更多相关文章

  1. Struts2中struts.multipart.maxSize配置

    今天使用Struts2的文件上传控件时,在struts.xml中,将处理上传的action中的fileUpload拦截器的maximumSize参数设置为5000000,上传了一个3M的文件后发现控制 ...

  2. WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例

    最近出于工作需要,了解了一下微服务架构(Microservice Architecture,MSA).我经过两周业余时间的努力,凭着自己对微服务架构的理解,从无到有,基于.NET打造了一个演示微服务架 ...

  3. phonegap环境配置与基本操作

    一.开发环境配置: 1.工具环境安装: 安装java sdk 1.6以上版本号,Android Development Tools.ant,系统变量 Path后面加入 新增名稱 JAVA_HOME 值 ...

  4. Mysql中主从复制的原理、配置过程以及实际案例

    Mysql中主从复制的原理.配置过程以及实际案例1.什么是主从复制?原理:主从分离,什么意思呢?我们不妨画个图看看.如图1所示: 2.准备工作:预备两台服务器,我这里使用虚拟机安装了两个Centos6 ...

  5. vi代码智能提示功能及相关配置

    vim是一款支持插件.功能无比强大的编辑器,无论你的系统是linux.unix.mac还是windows,都能够选择他来编辑文件或是进行工程级别 的coding.如果能把vim用好了,不仅编程效率能得 ...

  6. SpringCloudConfig相关配置简介、使用、整合Eureka

    目的: 1.SpringCloud Config简介 2.Config Server基本使用 3.Config Client基本使用 4.Config整合Eureka 5.Config配置搜索路径 S ...

  7. JavaWeb_(Struts2框架)struts.xml核心配置、动态方法调用、结果集的处理

    此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...

  8. zookeeper集群的搭建以及hadoop ha的相关配置

    1.环境 centos7 hadoop2.6.5 zookeeper3.4.9 jdk1.8 master作为active主机,data1作为standby备用机,三台机器均作为数据节点,yarn资源 ...

  9. Linux网络相关配置

    一.修改网卡相关配置 Linux网络参数是在/etc/sysconfig/network-scripts/ifcfg-eth0中设置,其中ifcfg-eth0表示是第一个网卡,如果还有另外一块网卡,则 ...

随机推荐

  1. TextKit简单示例

    TextKit简单示例 效果 源码 https://github.com/YouXianMing/Animations // // TextKitLoadImageController.m // An ...

  2. Easyui 页面设置加载完成之后,满屏

    js文件: if(top.location!=self.location){ top.location.href=self.location; }

  3. 安卓之上传文件,即HTTP提交表单

    获取文件: public void Init()    {        noScrollgridview = (GridView) findViewById(R.id.noScrollgridvie ...

  4. swift:简单使用翻页控制器UIPageViewController

    一.小叙 UIPageViewController是一个实现图书阅读的控制器,使用它可以设置书脊位置.单双页.过渡效果等,它是通过代理的方式来实现翻页,也即上一页.下一页.最终这个UIPageView ...

  5. 如何mount一个Isilon的NFS的file share?

    命令如下: mount -o vers=3,proto=tcp 172.16.200.41:/ifs/nfsshare1 /mnt/localfolder1 简单版的 mount 192.168.1. ...

  6. RxJava RxBinding RxView 控件事件 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. JavaScript类的写法

    js类的基本含义 我们知道,在js中,是没有类的概念的.类的所有实例对象都从同一个原型对象上继承属性,因此,原型对象是类的核心. 类是对象的抽象,而对象是类的具体实例.类是抽象的,不占用内存,而对象是 ...

  8. 求通俗讲解下tensorflow的embedding_lookup接口的意思

    https://www.zhihu.com/question/48107602 作者:王凯链接:https://www.zhihu.com/question/48107602/answer/15980 ...

  9. WPF 动态改变窗口大小

    1.删除 Width 和 Height 属性:2.将 Windows.SizeToContent 属性设置为 WidthAndHeight这时窗口就能自动调整自身大小,从而容纳所包含的内容. 通过将 ...

  10. 四轴自适应控制算法的一些尝试开源我的山猫飞控和梯度在线辨识自适应等算法—(转)

    本文的最主要目的在于抛砖引玉,阿莫论坛真的是非常好的一个论坛,没有这个论坛,没有那么多这个论坛上的前人无私的奉献和热烈的讨论,我想我是怎么也无法入门四轴的控制的.只是论坛上已经很多年都没有看到过新东西 ...