一、Struts概述
1.Struts背景
- 由出色稳定的框架Struts1和WebWork框架整合而来
- Struts1框架: 它是apache公司的开源子项目,是基于mvc逻辑分层的web层框架实现。是出现最早的web层框架,应用最广泛。它重点关注的是控制层(C),对于视图层(V)只是提供了大量的标签;对于Model(M)层的影响微乎其微.
- WebWork框架: 它也是一个mvc的框架,这个框架的设计思路是采用拦截链将用户的请求的数据转发到Action中,并负责将Action的处理结果转换成对用户的响应。这种设计思路能够和ServletAPI分离。
- 吸取两大框架的优点
- 提高开发效率和规范性
- 更好的实现了MVC架构
- 解除了与Servlet的强耦合性
2.Struts2框架的意义
- 更加便捷的进行开发
- 自动封装表单提交数据:属性驱动(表单中提交的数据不需要使用request.getParamater获取,而自动放到属性当中可以直接使用)、模型驱动(提交的表单数据可以自动封装到对应的实体类对象中,直接调用实体类中的EO方法即可持久化到数据库中)
- 便捷的实现上传文件:FileUpload(以前的文件上传方法需要手动引入smartupload.jar文件)
- 使网站通用于国内外(国际化),国际化通用标准
- 通过配置完成表单验证:校验器,表单验证一般分为两块,首先通过JS完成第一次表单校验,然后传到后台进行二次校验。
- 强大的标签库:Struts2标签库、OGNL标签库
更科学的管理
- 使用xml文件管理大量的程序文件对应映射关系,维护方便、简洁、安全、迅速。
更安全的操作
- 安全的线程机制:每个action都是独立的(Servlet是单例模式,线程不是安全的)
- 防止数据重复提交:token令牌机制,该机制可以防止用户因为电脑卡、网速慢引起的数据重复提交问题。
- 异常处理机制:通过配置来完成,更便于管理
- 先进的编程思路
- 面向切面的编程(AOP):拦截器
3.Struts核心处理机制
- 使用Filter作为控制器的MVC应用实战
- 流程概念分析
- 简单业务实现
传统的开发模式和Struts2开发模式的区别,首先看传统模式如下图所示:
图中拿一个注册页面进行举例,首先提交一个register.action的注册页面,程序会将action请求发送给Servlet,Servlet会处理请求跳转到一个注册页面,填写完信息后,点击注册按钮提交请求,此时会将请求提交给另外一个Servlet,这个Servlet验证用户的请求信息并保存到数据库中,最后跳转到注册结果页面。而应用了Filter的Struts2开发模式的处理方式是不同的,如图所示:
当提交一个注册action或者点击注册按钮提交注册信息时,可以直接将请求都提交到Filter中,Filter会通过判断来确定跳转到哪一个页面,极大的提高了开发效率。
下面是这个注册的Demo实例,代码如下:
首先创建一个实体类Users:
package cn.wikey.pojo;
public class Users {
private String username;
private int id;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
然后创建一过滤器的包,并创建一个Filter过滤器ControlFilter.java,在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>cn.wikey.Filter.ControlFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ControlFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
编写初始页面、注册、结果页面三个JSP文件,很简单的代码,省略不贴,然后我们对过滤器ControlFilter.java进行编写,代码如下:
package cn.wikey.Filter;
public class ControlFilter implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) arg0;
//1.接收用户请求的地址
String url = request.getServletPath();
//2.判断用户请求的地址,并执行相应的程序
if(url.equals("/register.action")){
request.getRequestDispatcher("/register.jsp").forward(arg0, arg1);
return;
}else if (url.equals("/savaUser.action")) {
String username = request.getParameter("username");
String password = request.getParameter("password");
String password1 = request.getParameter("password1");
if(password.equals(password1)){
Users users = new Users();
users.setUsername(username);
users.setPassword(password);
//执行相关的DAO持久化操作
request.getRequestDispatcher("end.jsp").forward(arg0, arg1);
return;
}else {
request.getRequestDispatcher("register.jsp").forward(arg0, arg1);
return;
}
}
arg2.doFilter(arg0, arg1);
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
最终实现简单的页面及结果如下: