struts2概述
2015-07-08 20:11
369 查看
转载请注明:http://blog.csdn.net/uniquewonderq
1.struts2背景
由出色稳定的框架struts1和WebWork框架整合而来。
(struts1是Apache软件基金会赞助的一个开源项目,它通过采育好难过javaservlet/jsp技术,实现了基于java ee web应用的mvc设计模式的应用框架,是mvc经典设计模式中的一个经典产品。struts1结构简单小巧,十分易用,一度市场占有率超过20%,struts1框架,与jsp/servlet耦合非常紧密,这制约了它的发展,以至于被后来的框架陆续赶超)。
(webwork是有Opensysphony组织开发的,是建立在成为xwork的command模式框架之上的强大的mvc框架,webwork晚于struts1,技术上更为先进,由于组织至猛毒,人们习惯等原因。webwork市场的反响不如struts1)
struts2与struts1差别巨大,不能理解为struts1的升级版。
struts2以xwork为核心,可以理解为webwork的升级版。
吸取了两大框架的优点
吸收了自动封装数据技术,简化了许多冗余代码
提高了开发效率和规范性
更好的实现了mvc架构
解除了与servlet的强耦合性
[b]2.struts2的概念:[/b]
是轻量级MVC框架,主要解决了请求分发的问题,重心在控制层和表现层。所谓轻量级,低侵入性,与业务代码的耦合度很低。即业务代码中基本不需要import它的包。struts2实现了MVC,并提供了一些列API,采用模式化方式简化业务开发过程。
MVC:M(modle)模型,它的职责是斁业务逻辑,包含两层:业务数据和业务处理逻辑。比如实体类,DAO,service都属于模型层。
V(view)视图,它的职责是负责显示界面和用户交互(收集用户信息)。属于视图的组件是不包含业务逻辑和控制逻辑的jsp
C(controller)控制器,它是模型层M和视图层V之间的桥梁,用于控制流程。比如:在servlet项目中的单一控制器,ActionServlet.
3.struts2与Servlet对比
优点:
---业务代码解耦,适合团队开发
将请求分发给不同的处理类,从而降低了业务代码耦合度。
---提升开发效率
提供了一系列的API,可以大大提升项目的开发效率。如:使用拦截器自动给请求参数转型
缺点:
---执行效率偏低
需要使用反射,解析XML等技术手段,会降低执行效率。
---结构复杂,有学习成本
需要花费一定成本学习struts2的API以及使用步骤
4.struts2自身的优势:
健壮性:struts2是一个成熟稳定的框架,目前比较稳定的版本是2.1.8
易用性:易学好用
扩展性:struts2运用AOP的思想,使用拦截器来扩展业务控制器Action。
侵入性:struts2对业务代码依赖性很低,基本不需要导入它的包
5.servlet与struts2实现MVC示意图
servlet实现mvc
struts2实现mvc
[b]6.struts2框架的意义[/b]
更便捷的开发:
a.自动提交表单提交数据:属性驱动,模型驱动
b.便捷的实现上传文件:FileUpload
c.使网站通用于国内外:国际化
d.通过配置完成表单验证:校验器
e.强大的标签库:struts2标签库,OGNL标签库
更科学的管理;
a.使用xml文件管理程序文件对应关系
更安全的操作:
a.安全的线程机制:每个action都是独立的
b.防止数据重复提交:token令牌机制
先进的编程思路:
a.面向切面编程:拦截器
7.Struts2核心处理机制
使用Filter作为控制器的MVC应用实战。
下面以一个简单的实例演示一下:
首先创建一个web project
然后创建如下package 以及class
web.xml文档配置如下:
users.java
index.jsp
register.jsp
end.jsp
ControlFilter.java
执行结果;
首先打开index.jsp
点击注册:
填入用户信息。密码都为123.
点击提交:
细心的可以看到地址栏的变化是在我们的预期之内的。
1.struts2背景
由出色稳定的框架struts1和WebWork框架整合而来。
(struts1是Apache软件基金会赞助的一个开源项目,它通过采育好难过javaservlet/jsp技术,实现了基于java ee web应用的mvc设计模式的应用框架,是mvc经典设计模式中的一个经典产品。struts1结构简单小巧,十分易用,一度市场占有率超过20%,struts1框架,与jsp/servlet耦合非常紧密,这制约了它的发展,以至于被后来的框架陆续赶超)。
(webwork是有Opensysphony组织开发的,是建立在成为xwork的command模式框架之上的强大的mvc框架,webwork晚于struts1,技术上更为先进,由于组织至猛毒,人们习惯等原因。webwork市场的反响不如struts1)
struts2与struts1差别巨大,不能理解为struts1的升级版。
struts2以xwork为核心,可以理解为webwork的升级版。
吸取了两大框架的优点
吸收了自动封装数据技术,简化了许多冗余代码
提高了开发效率和规范性
更好的实现了mvc架构
解除了与servlet的强耦合性
[b]2.struts2的概念:[/b]
是轻量级MVC框架,主要解决了请求分发的问题,重心在控制层和表现层。所谓轻量级,低侵入性,与业务代码的耦合度很低。即业务代码中基本不需要import它的包。struts2实现了MVC,并提供了一些列API,采用模式化方式简化业务开发过程。
MVC:M(modle)模型,它的职责是斁业务逻辑,包含两层:业务数据和业务处理逻辑。比如实体类,DAO,service都属于模型层。
V(view)视图,它的职责是负责显示界面和用户交互(收集用户信息)。属于视图的组件是不包含业务逻辑和控制逻辑的jsp
C(controller)控制器,它是模型层M和视图层V之间的桥梁,用于控制流程。比如:在servlet项目中的单一控制器,ActionServlet.
3.struts2与Servlet对比
优点:
---业务代码解耦,适合团队开发
将请求分发给不同的处理类,从而降低了业务代码耦合度。
---提升开发效率
提供了一系列的API,可以大大提升项目的开发效率。如:使用拦截器自动给请求参数转型
缺点:
---执行效率偏低
需要使用反射,解析XML等技术手段,会降低执行效率。
---结构复杂,有学习成本
需要花费一定成本学习struts2的API以及使用步骤
4.struts2自身的优势:
健壮性:struts2是一个成熟稳定的框架,目前比较稳定的版本是2.1.8
易用性:易学好用
扩展性:struts2运用AOP的思想,使用拦截器来扩展业务控制器Action。
侵入性:struts2对业务代码依赖性很低,基本不需要导入它的包
5.servlet与struts2实现MVC示意图
servlet实现mvc
struts2实现mvc
[b]6.struts2框架的意义[/b]
更便捷的开发:
a.自动提交表单提交数据:属性驱动,模型驱动
b.便捷的实现上传文件:FileUpload
c.使网站通用于国内外:国际化
d.通过配置完成表单验证:校验器
e.强大的标签库:struts2标签库,OGNL标签库
更科学的管理;
a.使用xml文件管理程序文件对应关系
更安全的操作:
a.安全的线程机制:每个action都是独立的
b.防止数据重复提交:token令牌机制
先进的编程思路:
a.面向切面编程:拦截器
7.Struts2核心处理机制
使用Filter作为控制器的MVC应用实战。
下面以一个简单的实例演示一下:
首先创建一个web project
然后创建如下package 以及class
web.xml文档配置如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>ControlFilter</filter-name> <filter-class>com.filter.ControlFilter</filter-class> </filter> <filter-mapping> <filter-name>ControlFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
users.java
package com.entity; public class Users { private int id; private String username; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <a href="register.action" >注册</a> </body> </html>
register.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <form action="saveUser.action" method="post"> <input type="text" name="username"> <input type="password" name="password"> <input type="password" name="password1"> <input type="submit" name="提交"> </form> </body> </html>
end.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <h3>恭喜您注册成功!</h3> </body> </html>
ControlFilter.java
package com.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.xml.registry.infomodel.User; import com.entity.Users; public class ControlFilter implements Filter { public void destroy() { // TODO Auto-generated method stub } //核心控制器 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest request2=(HttpServletRequest)request; //1.接受用户请求的地址 String url=request2.getServletPath(); //2.判断用户请求的地址,并执行响应的程序 if(url.equals("/register.action")){ request2.getRequestDispatcher("register.jsp").forward(request, response); return; }else if(url.equals("/saveUser.action")){ String username=request2.getParameter("username"); String password=request2.getParameter("password"); String password1=request2.getParameter("password1"); if(password.equals(password1)){//如果相等就封装到user对象中去 Users user=new Users(); user.setUsername(username); user.setPassword(password); //执行相关DAO持久化操作 request2.getRequestDispatcher("end.jsp").forward(request, response); return; } else{ request2.getRequestDispatcher("register.jsp").forward(request, response); return; } } //3.跳转到相应的结果页面 chain.doFilter(request, response); } public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub } }
执行结果;
首先打开index.jsp
点击注册:
填入用户信息。密码都为123.
点击提交:
细心的可以看到地址栏的变化是在我们的预期之内的。
相关文章推荐
- java进制转换
- 《java编程思想-第2章》读书笔记
- java中的 FileWriter类 和 FileReader类的一些基本用法
- Java 查找算法
- Java注释 基本的几个注释词应用
- Java内存分配和String类型的深度解析***
- Java实现从文件中读入写入学生信息并实现增删改
- JavaBean BeanUtils包操作JavaBean类
- java比较两个文件是否相同
- Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
- java集合框架--List、Set、Map
- java.lang.NoClassDefFoundError: org/dom4j/DocumentHelper dom报错
- ios下使用RSA算法加密与java后台解密配合demo
- 关于在Eclipse中使用正则表达式替换的一点记录(使用正则表达式的分组)
- Java的垃圾回收总结
- Java面向对象学习阶段小结
- 《编程导论(Java)·6.3 private修饰符》
- springMVC学习笔记-加载静态文件,如样式表
- Dubbo与Zookeeper、SpringMVC整合和利用(负载均衡、容错)
- Spring特性——Aware感知特性