struts2概述

时间:2022-07-25
本文章向大家介绍struts2概述,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

转载请注明: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的强耦合性

2.struts2的概念:

是轻量级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

6.struts2框架的意义

更便捷的开发:

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.

点击提交:

细心的可以看到地址栏的变化是在我们的预期之内的。