这篇博客主要是介绍Struts2学习过程中的收获,其中有许多内容是来源于网络(其他人的博客),但是鉴于网络上的内容不是很系统或存在误区,所以在此整理一番,以作备用。
当今常见的开发框架:
数据流程MVC框架:Struts2,WebWorker,Spring MVC....
数据关系容器框架: Spring,GUICE....
数据操作持久层框架:Hibernate,IBatis...
所谓框架就是把通用的东西给你封装起来,最基本的事件处理逻辑关系已经确定,开发人员只需要在此基础上构建自己的代码,开发业务。当然许多公司都有自己内部的开发框架,提高了代码复用率和开发效率,但是最基本的框架还是离不开开源的几个框架(Struts2、Spring、Hibernate...)。
(一)Struts2概述
Struts2是从struts1发展而来,但是和struts1在框架的设计思想上截然不同,Struts2结合了WebWork的设计思想,是一个轻量级的MVC流程框架。MVC包含三个基础部分:Model、View和Controller,这三部分以最小的耦合协同工作,增加的程序的可扩展和可维护性:
1)Model:JavaBean、EJB的EntityBean
2)View:JSP、Struts的TabLib
3)Controller:Struts的ActionServlet、Action
Struts2的简单处理流程:
1)浏览器发送请求
2)中新处理器根据struts.xml文件查找对应的处理请求Action类
3)WebWork的拦截器自动对请求应用通用功能,如:WorkFlow、Validation等
4)如果struts.xml文件中配置了Method参数,则调用Method参数对应的Action类中的Method方法,否则调用通用的execute()方法处理用户请求。
Struts2的系统架构:
-
橙色是Servlet Filters,过滤器链,所有的请求都要经过Filter链的处理。
浅蓝色是Struts Core,Struts2的核心部分,Struts2中已经做好的功能,在实际开发中不需要动它们。
浅绿色是Interceptors,Struts2的拦截器。Struts2提供了很多默认的拦截器,可以完成日常开发的绝大部分工作;当然,也可以自定义拦截器,用来实现具体业务需要的功能。
浅***是User Created,由开发人员创建的,包括struts.xml、Action、Template,是每个使用Struts2来进行开发的人员都必须会的。
各个模块说明:
-
FilterDispatcher是整个Struts2的调度中心,根据ActionMapper的结果来决定是否处理请求,如果ActionMapper指出该URL应该被Struts2处理,那么它将会执行Action处理,并停止过滤器链上还没有执行的过滤器。
ActionMapper提供了HTTP请求与action执行之间的映射,简单点说,ActionMapper会判断这个请求是否应该被Struts2处理,如果需要Struts2处理,ActionMapper会返回一个对象来描述请求对应的ActionInvocation的信息。
ActionProxy是一个特别的中间层,位于Action和xwork之间,使得我们在将来有机会引入更多的实现方式,比如通过WebService来实现等。
ConfigurationManager是xwork配置的管理中心,通俗的讲,可以把它看做struts.xml这个配置文件在内存中的对应。
struts.xml是Stuts2的应用配置文件,负责诸如URL与Action之间映射的配置、以及执行后页面跳转的Result配置等。
ActionInvocation:真正调用并执行Action,它拥有一个Action实例和这个Action所依赖的拦截器实例。ActionInvocation会执行这些拦截器、Action以及相应的Result。
Interceptor(拦截器):拦截器是一些无状态的类,拦截器可以自动拦截Action,它们给开发者提供了在Action运行之前或Result运行之后来执行一些功能代码的机会。类似于我们熟悉的javax.servlet.Filter。
Action:动作类是Struts2中的动作执行单元。用来处理用户请求,并封装业务所需要的数据。
Result:Result就是不同视图类型的抽象封装模型,不同的视图类型会对应不同的Result实现,Struts2中支持多种视图类型,比如Jsp,FreeMarker等。
Templates:各种视图类型的页面模板,比如JSP就是一种模板页面技术。
Tag Subsystem:Struts2的标签库,它抽象了三种不同的视图技术JSP、velocity、freemarker,可以在不同的视图技术中,几乎没有差别的使用这些标签
(二)构建测试用例
1. 使用eclipse构建Dynamic Web Project工程
2. 下载struts2,以struts-2.3.20为例
3. 将Struts2-2.3.20 lib中的如下jar包导入eclipse工程中的WEB-INF/lib
commons-fileupload-1.3.1.jar
commons-io-2.2.jar
commons-lang-2.4.jar
commons-lang3-3.2.jar
freemarker-2.3.19.jar
javassist-3.11.0.GA.jar
ognl-3.0.6.jar
struts2-core-2.3.20.jar
xwork-core-2.3.20.jar
4. WEB-INF下面创建web.xml,添加如下内容
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <filter-name>struts2</filter-name> <filter> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>Login.jsp</welcome-file> </welcome-file-list> </web-app>
5. 在src下面创建struts.xml,配置action,示例如下
<!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="login" class="com.rankexam.control.LoginAction">
<!-- 定义三个逻辑视图和物理资源之间的映射 -->
<result name="input">/Login.jsp</result>
<result name="error">/Error.jsp</result>
<result name="success">/Welcome.jsp</result>
</action>
</package>
</struts>
6. 创建相应的类文件和jsp文件
1)创建LoginAction
package com.rankexam.control;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import java.io.*;
public class LoginAction extends ActionSupport{
private static final long serialVersionUID = 1L;
private String username;
private String password;
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;
}
public String execute() throws Exception {
System.out.println("username:"+getUsername());
System.out.println("password:"+getPassword());
if(getUsername().equals("baidu") && getPassword().equals("baidu")){
ActionContext.getContext().getSession().put("user", getUsername());
return "success";
}else{
return "error";
}
}
}
2)创建Login.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>login</title>
</head>
<body>
<form action="login" method="get">
用户名:<input type="text" name="username"><br>
密 码:<input type="password" name="password"><br>
<input type="submit" value="login">
</form>
</body>
</html>
3)Error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>login failed</title>
</head>
<body>
sorry login failed!
</body>
</html>
4)Welcome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>login success</title>
</head>
<body>
${sessionScope.user} welcome to login !
</body>
</html>
7. 部署应用到Tomcat 7,访问http://localhost:8080/project-name/
注:文中有些地方来源于网络。
转载于:https://blog.51cto.com/shadowhorse/1652617