Struts2是一个基于MVC设计模式的Web应用框架。在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。

  接下来,我们先看下Struts2与SpringMVC的比较,然后再通过一个案例演示Struts2框架的使用。

  Struts2与SpringMVC的区别:

  1.框架机制

  (1)Struts2采用Filter(StrutsPrepareAndExecuteFilter)实现,SpringMVC(DispatcherServlet)则采用Servlet实现。
  (2)Filter在容器启动之后即初始化;服务停止以后坠毁,晚于Servlet。Servlet在是在调用时初始化,先于Filter调用,服务停止后销毁。

  2.拦截机制

  (1)Struts2
  a、Struts2框架是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype(否则会出现线程并发问题),然后通过setter,getter把request数据注入到属性。
  b、Struts2中,一个Action对应一个request,response上下文,在接收参数时,可以通过属性接收,这说明属性参数是让多个方法共享的。
  c、Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。
  (2)SpringMVC
  a、SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法基本上是独立的,独享request,response数据。而每个方法同时又和一个url对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过ModeMap返回给框架。
  b、在Spring整合时,SpringMVC的Controller Bean默认采用单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope注解修改。

  3.性能方面  
  SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,加载一次单例模式bean注入即可。而Struts2是类级别的拦截,每次请求对应实例化一个新的Action,需要加载所有的属性值注入,所以,SpringMVC开发效率和性能高于Struts2。

  4.拦截机制

  Struts2有自己的拦截Interceptor机制,SpringMVC是用独立的Aop方式,这样导致Struts2的配置文件量比SpringMVC要大。

  5.配置方面

  spring MVC和Spring是无缝的。从项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要进行较多的xml配置)。SpringMVC基本上可以认为已经100%零配置。

  6.设计思想

  Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,是在servlet上扩展。

  7.集成方面

  SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器虽然也集成了Ajax,但在Action中处理时,一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。

  好了,接下来写一个采用Struts2框架的web案例。

  项目案例架构如下:

  引入Struts2的jar包如下所示:

  

  1. //A.java
  2.  
  3. package com.itszt.web;
  4. import org.apache.struts2.ServletActionContext;
  5. import javax.servlet.ServletContext;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import javax.servlet.http.HttpSession;
  9. /**
  10. * 演示通过Struts2框架获取Response响应对象,
  11. * Request请求对象,
  12. * ServletContext上下文,
  13. * Session会话对象
  14. */
  15. public class A {
  16. public void go() {
  17. HttpServletResponse response = ServletActionContext.getResponse();
  18. HttpServletRequest request = ServletActionContext.getRequest();
  19. ServletContext servletContext = ServletActionContext.getServletContext();
  20. HttpSession session = request.getSession();
  21. }
  22. }

  struts2.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. <!--映射访问路径配置,还配置了返回的结果页-->
  7. <package name="test" extends="struts-default" >
  8. <action name="TestAction1" class="com.itszt.web.TestAction1" method="execute">
  9. <result name="success" >/success.jsp</result>
  10. </action>
  11. </package>
  12. <!--namespace为该Action路径的前导位置-->
  13. <package name="userCenter" extends="struts-default" namespace="/userCenter">
  14. <!--type 结果类型 默认是dispatcher 即转发到指定结果页-->
  15. <!--type: redirect 重定向到指定结果页-->
  16. <!--type: chain 转发到指定Action-->
  17. <!--type: redirectAction 重定向到指定Action-->
  18. <action name="login" class="com.itszt.web.UserCenterAction" method="doLogin">
  19. <result name="success" type="redirect">/success.jsp</result>
  20. <result name="error">/error.jsp</result>
  21. </action>
  22. <action name="reg" class="com.itszt.web.UserCenterAction" method="doReg">
  23. <result name="success">/success.jsp</result>
  24. <result name="error">/error.jsp</result>
  25. </action>
  26. </package>
  27. </struts>

  web.xml配置文件:

  

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  5. version="3.1">
  6. <!--配置Struts2过滤器-->
  7. <filter>
  8. <filter-name>struts2</filter-name>
  9. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  10. <init-param>
  11. <param-name>config</param-name>
  12. <param-value>struts-default.xml,struts-plugin.xml,../struts2.xml</param-value>
  13. </init-param>
  14. </filter>
  15. <filter-mapping>
  16. <filter-name>struts2</filter-name>
  17. <!--过滤的后缀名-->
  18. <url-pattern>*.action</url-pattern>
  19. <url-pattern>*.do</url-pattern>
  20. </filter-mapping>
  21. </web-app>

  前端页面如下:

  1. <%--index.jsp文件--%>
  2. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  3. <html>
  4. <head>
  5. <title>Struts2测试</title>
  6. </head>
  7. <body>
  8. <a href="/TestAction1.action?data=我是data">找一个后台的Action,Action是什么呢?就是以前的controller</a>
  9. <hr>
  10. <a href="/userCenter/login.action?username=1">测试login。。。success</a> <hr>
  11. <a href="/userCenter/login.action?username=2">测试login。。。error</a> <hr>
  12. <a href="/userCenter/reg.action">测试reg。。。</a> <hr>
  13. </body>
  14. </html>
  15.  
  16. -------------------------------------------------------------------------------
  17. <%--success.jsp文件--%>
  18. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  19. <html>
  20. <head>
  21. <title>Struts2测试</title>
  22. </head>
  23. <body>
  24. success.jsp...............
  25. </body>
  26. </html>
  27.  
  28. --------------------------------------------------------------------------------
  29. <%--error.jsp文件--%>
  30. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  31. <html>
  32. <head>
  33. <title>Struts2测试</title>
  34. </head>
  35. <body>
  36. error.jsp................
  37. </body>
  38. </html>

  服务器端的Action如下:

  1. //TestAction1.java文件
  2. package com.itszt.web;
  3. import com.opensymphony.xwork2.ActionSupport;
  4. import org.apache.struts2.ServletActionContext;
  5. import javax.servlet.http.HttpServletRequest;
  6. /**
  7. * 相当于springmvc里的controller,继承ActionSupport
  8. */
  9. public class TestAction1 extends ActionSupport {
  10. @Override
  11. public String execute() throws Exception {
  12. // HttpServletResponse response = ServletActionContext.getResponse();
  13. HttpServletRequest request = ServletActionContext.getRequest();
  14. String data = request.getParameter("data");
  15. // ServletContext servletContext = ServletActionContext.getServletContext();
  16.  
  17. System.out.println("TestAction1.execute -----> "+data);
  18.  
  19. return "success";
  20. }
  21. }
  22.  
  23. ---------------------------------------------------------
  24. //UserCenterAction.java文件
  25. package com.itszt.web;
  26. import org.apache.struts2.ServletActionContext;
  27. import javax.servlet.http.HttpServletRequest;
  28. /**
  29. * 服务器端的Action
  30. */
  31. public class UserCenterAction {
  32. public String doLogin(){
  33. HttpServletRequest request = ServletActionContext.getRequest();
  34. String username1 = request.getParameter("username");
  35. System.out.println("username1 = " + username1);
  36. System.out.println("UserCenterAction.doLogin");
  37. if ("1".equals(username1)) {
  38. return "success";
  39. }else {
  40. return "error";
  41. }
  42. }
  43.  
  44. public String doReg(){
  45. System.out.println("UserCenterAction.doReg");
  46. return "success";
  47. }
  48. }

  上述项目案例运行在tomcat服务器上,可以实现正常的访问。如有问题请留言联系。

Struts2使用的更多相关文章

  1. 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?

    今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...

  2. 菜鸟学Struts2——Interceptors

    昨天学习Struts2的Convention plugin,今天利用Convention plugin进行Interceptor学习,虽然是使用Convention plugin进行零配置开发,这只是 ...

  3. 菜鸟学Struts2——零配置(Convention )

    又是周末,继续Struts2的学习,之前学习了,Struts的原理,Actions以及Results,今天对对Struts的Convention Plugin进行学习,如下图: Struts Conv ...

  4. 菜鸟学Struts2——Results

    在对Struts2的Action学习之后,对Struts2的Result进行学习.主要对Struts2文档Guides中的Results分支进行学习,如下图: 1.Result Types(Resul ...

  5. 菜鸟学Struts2——Actions

    在对Struts2的工作原理学习之后,对Struts2的Action进行学习.主要对Struts2文档Guides中的Action分支进行学习,如下图: 1.Model Driven(模型驱动) St ...

  6. 菜鸟学Struts2——Struts工作原理

    在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...

  7. 13、零配置Struts2开发

    Convention 插件 从 Struts 2.1 开始, Struts 可以使用 Convention 插件来支持零配置: Convention 插件完全抛弃配置信息, 不仅不需要使用 strut ...

  8. 12、Struts2表单重复提交

    什么是表单重复提交 表单的重复提交: 若刷新表单页面, 再提交表单不算重复提交. 在不刷新表单页面的前提下: 多次点击提交按钮 已经提交成功, 按 "回退" 之后, 再点击 &qu ...

  9. 11、Struts2 的文件上传和下载

    文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...

  10. 9、 Struts2验证(声明式验证、自定义验证器)

    1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...

随机推荐

  1. Class类是什么? Class.forName()是干什么的?

    Class类概念 Class类用来描述一个类的结构,比如描述一个类有哪些成员,有哪些方法等.有多种方法可以获取一个类对应的Class类实例,比如: //第一种方式获取描述Dog类结构的Class类实例 ...

  2. Glide加载图片并保存到本地返回file,bitmap

    有很多朋友都想要知道32位和64位的区别是什么,因为大家都拿不准自己要装32位系统还是64位系统,因此彷徨是必然的.那么到底区别是啥咧?如果大家想要知道的话,下面就让小编给大家带来32位和64位的区别 ...

  3. HiHoCoder1513:小Hi的烦恼——题解

    https://hihocoder.com/problemset/problem/1513 小Hi从小的一大兴趣爱好就是学习,但是他发现尽管他认真学习,依旧有学神考的比他好. 小Hi在高中期间参加了市 ...

  4. 洛谷 P1501 [国家集训队]Tree II 解题报告

    P1501 [国家集训队]Tree II 题目描述 一棵\(n\)个点的树,每个点的初始权值为\(1\).对于这棵树有\(q\)个操作,每个操作为以下四种操作之一: + u v c:将\(u\)到\( ...

  5. Hbase(二)hbase建表

    一.建表高级属性 下面几个 shell 命令在 hbase 操作中可以起到很到的作用,且主要体现在建表的过程中,看 下面几个 create 属性 1.bloomfilter 布隆过滤器 默认是 NON ...

  6. 洛谷P1029 最大公约数和最小公倍数问题

    题目描述 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数 条件: 1.P,Q是正整数 2.要求P,Q以x0为 ...

  7. php整理

    linux上安装php配套环境有些繁琐 推荐使用一键安装: https://lnmp.org/install.html phalcon框架环境: centos7下php7.0.x安装phalcon框架

  8. STL源码分析-bitset

    http://note.youdao.com/noteshare?id=0ea12c1fffd3866c6eddb8dc208c109d

  9. 题解【luogu3709 大爷的字符串题】

    Description 个人觉得这是这道题最难的一步...出题人的语文... 每次给出一个区间,求这个区间最少能被多少个单调上升的序列覆盖. Solution 这个东西可以转化为这个区间中出现次数最多 ...

  10. 题解【bzoj3240 [NOI2013]矩阵游戏】

    挖坑2333 等我把代码写完了再写