0.了解
Struts(支柱、支干)是什么? Struts是流行和成熟的基于MVC设计模式的Web应用程序框架。使用它能帮助我们减少在运用MVC设计模型来开发Web应用时间。
为什么2.1.3之后用StrutsPrepareAndExecuteFilter而不用AdapterFilter,因为前者可以做到在action之前,过滤器之后写自己的过滤器
在Struts2框架中的处理大概分为以下几个步骤
1 .首先客户端通过HttpServletRequest向Servlet容器(例如Tomcat)提交一个请求。 2 .这个请求经过一系列的过滤器(Filter)。(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)。 3 .接着Struts2的核心控制器FilterDispatcher(或最新的过滤器StrutsPrepareAndExecuteFilter(2.1.3版本以后))被调用,被核心控制器所过滤到以后,核心控制器FilterDispatcher
访问ActionMapper来决定用户是否要请求某个Action。 4 .如果ActionMapper决定需要调用某个Action,Struts2中的核心控制器FilterDispatcher会将控制权委派给ActionProxy(即Action代理)。 5 .ActionProxy通过对象ConfigurationManager(配置管理器)来加载Struts2核心配置文件struts.xml,找到需要调用的Action。 6 .ActionProxy会创建一个ActionInvocation的实例,ActionInvocation实例使用命名模式来调用配置中定义的Action,在调用Action的过程前后,还需要调用非常多的拦截器(Intercepter)。 7.依次执行完一系列拦截器(1,2,3...)后, 就执行Action,它会调用Action中的业务处理方法进行业务处理,同时这个业务处理方法会返回一个结果Result,实际会返回一个字符串,我们根据这个
字符串去调度我们的视图(Template),去匹配result。一般会返回一个JSP页面或者FreeMarker的模版,或者会调用另外一个Action链。 8.当返回视图(Template)以后,还需要将之前执行过的拦截器再依次反向执行一遍(3,2,1...),当这些拦截器被反向执行完以后,才会进行最终的请求的响应,通过HttpServletResponse去响应
客户端的请求。
工作流程
1、客户端浏览器发出HTTP请求.
2、根据web.xml配置,该请求被FilterDispatcher接收
3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton
4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。
5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面
以简单登录验证项目练习一下
1.建立一个Java Web项目UserManager
2.导入Struts相关jar包
commons-fileupload(上传下载包) commons-io(输入输出包) commons-lang 3-3.2(基础包) commons-logging(日志包) freemarker(模板引擎,通过模板生成文本输出的通用工具) structs2-core(核心包) xwork-core(一些类基于xwork) ognl(表达式) javassist-3.11.0.GA.jar(解析java类文件的一个包)
3.在web.xml文件中添加Struts2的过滤器
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>UserManager</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 添加过滤器 --> <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> </web-app>
4.建立Action类
package dps.action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport{ 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; } @Override public String execute() throws Exception{ //定义返回值变量 String strReturn =INPUT; //业务逻辑判断 if(this.username.equals("abc")&&this.password.equals("123")){ strReturn=SUCCESS; }else{ ActionContext.getContext().getSession().put("tip", "登录失败!"); } return strReturn; } }
5.搭建前台jsp页面
5.1 登录页面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>用户登录页面</title> </head> <body> <center> ${tip} <form action="login.action" method="post"> <table> <tr> <td>用户名:</td> <td><input type="text" name="username"></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="pasword"></td> </tr> <tr> <td colspan="2"><input type="submit" value="登录"></td> </tr> </table> </form> </center> </body> </html>
5.2 登录成功页面loginSuccess.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>登录成功</title> </head> <body> <h1>用户登录成功!!</h1> </body> </html>
6.src目录下添加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> <!-- 设置struts对web页面的解码方式 --> <constant name="struts.i18n.encoding" value="UTF-8" /> <package name="myPackage" extends="struts-default"> <!-- 定义登录的Action --> <action name="login" class="dps.action.UserAction"> <result>loginSuccess.jsp</result> <result name="input">login.jsp</result> </action> </package> </struts>
7.运行结果
修改web.xml文件,将起始页改为login.jsp
<welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list>
发布