这篇博客主要是介绍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/
注:文中有些地方来源于网络。