Struts2使用
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包如下所示:
//A.java package com.itszt.web;
import org.apache.struts2.ServletActionContext;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* 演示通过Struts2框架获取Response响应对象,
* Request请求对象,
* ServletContext上下文,
* Session会话对象
*/
public class A {
public void go() {
HttpServletResponse response = ServletActionContext.getResponse();
HttpServletRequest request = ServletActionContext.getRequest();
ServletContext servletContext = ServletActionContext.getServletContext();
HttpSession session = request.getSession();
}
}
struts2.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!--映射访问路径配置,还配置了返回的结果页-->
<package name="test" extends="struts-default" >
<action name="TestAction1" class="com.itszt.web.TestAction1" method="execute">
<result name="success" >/success.jsp</result>
</action>
</package>
<!--namespace为该Action路径的前导位置-->
<package name="userCenter" extends="struts-default" namespace="/userCenter">
<!--type 结果类型 默认是dispatcher 即转发到指定结果页-->
<!--type: redirect 重定向到指定结果页-->
<!--type: chain 转发到指定Action-->
<!--type: redirectAction 重定向到指定Action-->
<action name="login" class="com.itszt.web.UserCenterAction" method="doLogin">
<result name="success" type="redirect">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="reg" class="com.itszt.web.UserCenterAction" method="doReg">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
web.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--配置Struts2过滤器-->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>config</param-name>
<param-value>struts-default.xml,struts-plugin.xml,../struts2.xml</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<!--过滤的后缀名-->
<url-pattern>*.action</url-pattern>
<url-pattern>*.do</url-pattern>
</filter-mapping>
</web-app>
前端页面如下:
<%--index.jsp文件--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Struts2测试</title>
</head>
<body>
<a href="/TestAction1.action?data=我是data">找一个后台的Action,Action是什么呢?就是以前的controller</a>
<hr>
<a href="/userCenter/login.action?username=1">测试login。。。success</a> <hr>
<a href="/userCenter/login.action?username=2">测试login。。。error</a> <hr>
<a href="/userCenter/reg.action">测试reg。。。</a> <hr>
</body>
</html> -------------------------------------------------------------------------------
<%--success.jsp文件--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Struts2测试</title>
</head>
<body>
success.jsp...............
</body>
</html> --------------------------------------------------------------------------------
<%--error.jsp文件--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Struts2测试</title>
</head>
<body>
error.jsp................
</body>
</html>
服务器端的Action如下:
//TestAction1.java文件
package com.itszt.web;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import javax.servlet.http.HttpServletRequest;
/**
* 相当于springmvc里的controller,继承ActionSupport
*/
public class TestAction1 extends ActionSupport {
@Override
public String execute() throws Exception {
// HttpServletResponse response = ServletActionContext.getResponse();
HttpServletRequest request = ServletActionContext.getRequest();
String data = request.getParameter("data");
// ServletContext servletContext = ServletActionContext.getServletContext(); System.out.println("TestAction1.execute -----> "+data); return "success";
}
} ---------------------------------------------------------
//UserCenterAction.java文件
package com.itszt.web;
import org.apache.struts2.ServletActionContext;
import javax.servlet.http.HttpServletRequest;
/**
* 服务器端的Action
*/
public class UserCenterAction {
public String doLogin(){
HttpServletRequest request = ServletActionContext.getRequest();
String username1 = request.getParameter("username");
System.out.println("username1 = " + username1);
System.out.println("UserCenterAction.doLogin");
if ("1".equals(username1)) {
return "success";
}else {
return "error";
}
} public String doReg(){
System.out.println("UserCenterAction.doReg");
return "success";
}
}
上述项目案例运行在tomcat服务器上,可以实现正常的访问。如有问题请留言联系。
Struts2使用的更多相关文章
- 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...
- 菜鸟学Struts2——Interceptors
昨天学习Struts2的Convention plugin,今天利用Convention plugin进行Interceptor学习,虽然是使用Convention plugin进行零配置开发,这只是 ...
- 菜鸟学Struts2——零配置(Convention )
又是周末,继续Struts2的学习,之前学习了,Struts的原理,Actions以及Results,今天对对Struts的Convention Plugin进行学习,如下图: Struts Conv ...
- 菜鸟学Struts2——Results
在对Struts2的Action学习之后,对Struts2的Result进行学习.主要对Struts2文档Guides中的Results分支进行学习,如下图: 1.Result Types(Resul ...
- 菜鸟学Struts2——Actions
在对Struts2的工作原理学习之后,对Struts2的Action进行学习.主要对Struts2文档Guides中的Action分支进行学习,如下图: 1.Model Driven(模型驱动) St ...
- 菜鸟学Struts2——Struts工作原理
在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...
- 13、零配置Struts2开发
Convention 插件 从 Struts 2.1 开始, Struts 可以使用 Convention 插件来支持零配置: Convention 插件完全抛弃配置信息, 不仅不需要使用 strut ...
- 12、Struts2表单重复提交
什么是表单重复提交 表单的重复提交: 若刷新表单页面, 再提交表单不算重复提交. 在不刷新表单页面的前提下: 多次点击提交按钮 已经提交成功, 按 "回退" 之后, 再点击 &qu ...
- 11、Struts2 的文件上传和下载
文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...
- 9、 Struts2验证(声明式验证、自定义验证器)
1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...
随机推荐
- OSPF与Vlan间通信综合实验小结与端口隔离
总结 本实验模拟实际工作环境的网络拓扑结构,至此终于理解了一部分的配置思路: 一.三层交换机连接路由器的端口配置 图中GE0/0/4应该是配置成access类型,这个时候应该是不带vlan标签的. ...
- QT样式表
QT样式表 一.QT样式表简介 1.QT样式表简介 QSS的主要功能是使界面的表现与界面的元素分离,使得设计皮肤与界面控件分离的软件成为可能. QT样式表是允许用户定制widgets组件外观的强大机制 ...
- 【刷题】洛谷 P2664 树上游戏
题目描述 lrb有一棵树,树的每个节点有个颜色.给一个长度为n的颜色序列,定义s(i,j) 为i 到j 的颜色数量.以及 \[sum_i=\sum_{j=1}^ns(i,j)\] 现在他想让你求出所有 ...
- 51nod 1952 栈(单调队列)
用deque实时维护栈的情况. 数加入栈顶部,删掉栈顶部的数,相当于加入一个数,删掉最早出现的数,每次求最大值,这个直接记录一下就好了. 数加入栈底部,删掉栈顶部的数,相当于加入一个数,删掉最晚出现的 ...
- 洛谷 P1486 BZOJ 1503 NOI 2004 郁闷的出纳员 fhq treap
思路: 1. 此处的fhq treap的分裂是按照权值分裂然后插入的.将小于k的分为一棵子树,大于等于k的分为另一棵子树. 2. 删除的时候只要将大于等于min的分裂到以root为根的树中,另一部分不 ...
- HTML 页面源代码布局介绍
http://www.cnblogs.com/polk6/archive/2013/05/10/3071451.html 此介绍以google首页源代码截图为例: 从上到下依次介绍: 1.<!D ...
- Codeforces 939.E Maximize!
E. Maximize! time limit per test 3 seconds memory limit per test 256 megabytes input standard input ...
- laravel5.5 不能正常自动回复的问题
虽然开启了APP_DEBUG 但是 log 却没有记录任何错误信息,后来经过测试发现原来是路由问题,因为微信服务器发送消息是使用 post 方法,但是我的路由定义只定义了 get (tp 用多了习惯了 ...
- Meeting HDU - 5521 虚点建图
Problem Description Bessie and her friend Elsie decide to have a meeting. However, after Farmer John ...
- Dell 戴尔预装Windows8改成Windows7
UEFI模式启动: 添加启动方式,正确路径为: 另外: Ubuntu启动gpt由gpt10变为gpt9 dd