(一)Struts2的概念和工作流程
- 概念
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts1的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。
- 工作流程
注:图中明黄色部分为编程人员需要书写的部分。
1 客户端发送请求;
2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action。FilterDispatcher的功能如下:
(1)执行Actions(2)清除ActionContext(3)维护静态内容(4)清除request生命周期内的XWork的interceptors
4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6 ActionProxy创建一个ActionInvocation的实例。
7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper
(二)Struts2案例实现
搭建Struts2环境时,一般需做以下几步操作:
- 创建javaweb工程
- 找到开发Struts2应用需要使用到的jar文件并加入到工程中
- 创建jsp文件
- 创建action文件
- 编写Struts2的配置文件
- 在web.xml中加入Struts2 框架启动配置
登录案例:
Login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>login page</title> </head> <body> <form action="<%=path %>/struts/login.action" > <table> <tr> <td>用户名:</td> <td><input type="text" name="userName" /></td> </tr> <tr> <td>密 码:</td> <td><input type="password" name="passWord" /></td> </tr> <tr> <td colspan="2"><input type="submit" value="登录" /></td> </tr> </table> </form> </body> </html> |
Struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="struts2" extends="struts-default" namespace="/struts"> <action name="login" class="com.inspur.action.LoginAction"> <result name="SUCCESS">/index.jsp</result> <result name="ERROR">/login.jsp</result> </action> </package> </struts> |
Web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" 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_3_0.xsd"> <display-name></display-name> <filter> <filter-name>struts2</filter-name> <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> |
LoginAction.java
package com.inspur.action; public class LoginAction { public String userName; public String passWord; /** * 请求action的时候执行该action当中的execute方法 * @return */ public String execute(){ //验证成功后返回success字符串 if("ross".equals(userName) && "111".equals(passWord)){ return "SUCCESS"; }else{ //验证失败后返回error字符串 return "ERROR"; } } 省略Get/set方法…… } |
访问地址:http://localhost:8080/01struts_introduction/
其中01struts_introduction为项目访问地址,一般默认为项目名称。
(三)Action创建方法
1 不依赖任何借口或者类
2 实现Action接口的方法,可以重用5个常量(这5个常量的定义,有利于编程的规范化和程序的移植性)
3 继承ActionSupport类,可以重用5个常量,并集成了校验(推荐)