Struts2 架构图:

1):提交请求

客户端通过 HttpServletRequest 向 Servlet (即Tomcat)提交一个请求。

请求经过一系列的过滤器,例如图中的 ActionContextCleanUp 和 Other filer (SlterMesh,etc)等,最后被 Struts 的核心过滤器 FilterDispatcher 控制到。

注:核心控制器 2.1.3 版本之后  Struts FileterDispatcher 核心控制器变成了 StrutsPrepareAndExcuteFilte

下图所示:

被核心控制器控制到 才会访问 ActionMapper 来决定是否调用某个 action (即用户是否要求某个action)。

如果是其他资源请求例如 jsp 页面,不会用到 action。

2):移交控制权

如果要用 action ,核心控制器将控制权 给 ActionProxy (即是 action 的代理)。

ActionProxy 获得控制权之后通过 ConfigurationManager 对象加载核心配置文件 struts.xml。

Struts 的 action 在这个配置文件进行配置 , 所以要加载它。

3):创建 ActionInvocation 的实例

如果在 struts.xml 找到需要调用的action ,ActionProxy 会创建一个 ActionInvocation 的实例。

4):调用 action 钱的拦截器

拦截器是 struts2 非常重要的概念,是核心功能实现,Struts 中的大部分功能通过拦截器实现。

Actioninvocation 包括创建的 action 实例,同时包括另外非常重要的一部分====拦截器。

调用 action 前后还会调用很多的拦截器

在调用 action 之前会依此调用用户所定义的拦截器。

5):调用 action 的业务方法进行业务处理

当把 action 前的拦截器执行完之后才会调用 action 的业务方法进行业务处理,

然后返回一个 Result (业务方法对应 String 类型的返回值,即使字符串,例如 SUCCESS,INPUT,REEOR,NONE,LOGIN 和用户自己在 Struts 对应定义 result标签name属性的值)。

6):匹配 result

然后根据返回的字符串来调度我们的试图来匹配我们的 struts.xml 中对应 action 标签中的result 标签。

一般来说返回一个 jsp 页面,或者调用另某一个 action

7):反向执行拦截器

当返回视图之后并没有真正响应用户,还需要把执行过的拦截器倒过来反向执行一遍。

8):响应客户端

当这些拦截器被反向执行后,通过 HttpServletResponse 响应客户端的请求。

简单实现 登陆 验证:点我下载源码

访问路径:没有登陆直接访问 localhost:8080/success  主页面的时候会跳转到登录页

目录结构:

UserAction:

package com.gdbd.action;

import com.gdbd.bean.UserInfo;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; import java.util.Map; /**
* @author asus
*/
public class UserAction extends ActionSupport implements ModelDriven<UserInfo> { private UserInfo Info = new UserInfo(); public UserInfo getInfo() {
return Info;
} public void setInfo(UserInfo info) {
Info = info;
} public String loginAction() {
Map<String, Object> session = ActionContext.getContext().getSession();
Map<String, Object> context = ActionContext.getContext().getValueStack().getContext();
try {
//再次访问登陆页面的时候判断是否已经登陆了
UserInfo userInfo = (UserInfo) session.get("userInfo");
if (userInfo != null) {
System.out.println("已登陆");
return "success";
}
if (!("admin".equals(Info.getUserName()))) {
context.put("errorName", "用户名错误");
} else if (!("admin".equals(Info.getUserPwd()))) {
context.put("errorPwd", "密码错误");
} else {
System.out.println("Info:"+Info.getUserName());
session.put("userInfo", Info);
return "success";
}
} catch (Exception ex) {
ex.printStackTrace();
}
return "input";
} public String success() {
return SUCCESS;
} @Override
public UserInfo getModel() {
return Info;
}
}

UserInfo:

package com.gdbd.bean;

import java.io.Serializable;

/**
* user 实体类
* @author asus
*/
public class UserInfo implements Serializable { private String userName;
private String userPwd; public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getUserPwd() {
return userPwd;
} public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
}

UserInterceptor:

package com.gdbd.util;

import com.gdbd.bean.UserInfo;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor; import java.util.Map; /**
* @author asus
*/
public class UserInterceptor implements Interceptor {
@Override
public void destroy() {
System.out.println("===============销毁==================");
} @Override
public void init() {
System.out.println("===============初始化==================");
} @Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("=======进入拦截器=======");
System.out.println(invocation.getProxy().getActionName()+"======");
Map<String, Object> session = invocation.getInvocationContext().getSession();
UserInfo userInfo = (UserInfo) session.get("userInfo");
if (userInfo != null) {
String invoke = invocation.invoke();
System.out.println("===========" + invoke);
return invoke;
}
return "input"; }
}

struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts> <!--全局配置:修改默认的日期提示信息-->
<!--<constant name="struts.i18n.encoding" value="UTF-8"/>-->
<!--<constant name="struts.custom.i18n.resources" value="message"></constant>--> <package name="user" namespace="/user" extends="struts-default"> <!--定义拦截器-->
<interceptors>
<!--自定义的拦截器-->
<interceptor name="author" class="com.mlq.uitl.AuthorizationInterceptor"></interceptor>
<!--定义拦截器栈-->
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="author"/>
</interceptor-stack>
</interceptors> <!--<default-interceptor-ref name="myStack"></default-interceptor-ref>--> <!--没有找到页面默认显示(故意把路径写错可以测试效果)-->
<default-action-ref name="defaultAction"/>
<!--定义一个全局结果-->
<global-results>
<result name="input">/fail.jsp</result>
</global-results>
<action name="defaultAction">
<result>/error.jsp</result>
</action>
<action name="login" class="com.mlq.action.LoginegisterRActionG" method="login">
<result type="redirectAction">${message}</result>
<result name="input">/login.jsp</result>
</action>
<action name="suc">
<result name="success">/success.jsp</result>
<result name="input">/login.jsp</result>
<interceptor-ref name="myStack"/>
</action> </package> </struts>

login.jsp:

<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<h2>登录</h2>
<s:debug/>
<s:form method="post" action="login"> <s:textfield label="请输入用户名" name="userName"></s:textfield>
<s:password label="请输入密码" name="userPwd"></s:password>
<s:property value="#errorName"/><s:property value="#errorPwd"/>
<s:submit value="登陆"></s:submit>
</s:form>
</body>
</html>

success.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Success</title>
</head>
<body>
<h2>Success</h2>
</body>
</html>

web.xml:

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app>
<display-name>Archetype Created Web Application</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>

Face your past without regret. Handle your present with confidence.Prepare for future without fear. keep the faith and drop the fear.

面对过去无怨无悔,把握现在充满信心,备战未来无所畏惧。保持信念,克服恐惧!一点一滴的积累,一点一滴的沉淀,学技术需要不断的积淀!

分享知识-快乐自己:Struts2框架 工作原理及执行流程图(拦截器的使用)的更多相关文章

  1. Struts2工作原理和执行流程图

    在struts2的应用中,从用户请求到服务器返回相应响应给用户端的过程中,包含了许多组件如:Controller.ActionProxy.ActionMapping.Configuration Man ...

  2. 菜鸟学Struts2——Struts工作原理

    在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...

  3. Struts2的工作原理及工作流程

    众所周知,Struts2是个非常优秀的开源框架,我们能用Struts2框架进行开发,同时能 快速搭建好一个Struts2框架,但我们是否能把Struts2框架的工作原理用语言表达清楚,你表达的原理不需 ...

  4. Struts2的工作原理(图解)详解

    Struts2的工作原理 上图来源于Struts2官方站点,是Struts 2 的整体结构. 一个请求在Struts2框架中的处理大概分为以下几个步骤(可查看源码:https://github.com ...

  5. Struts2 的工作原理

    Struts2 的工作原理: 1)client向server发出一个http请求.webserver对请求进行解析,假设在StrutsPrepareAndExecuteFilter的请求映射路径(在w ...

  6. Struts2学习(三)———— 输入校验和拦截器

    一.输入校验 在以前我们写一个登录页面时,并没有限制用户的输入,不管用户输入什么,我们都存入数据库中,很显然这是不行的,我们需要检测用户输入的文本是否合法,是否符合我们需要的文本格式,符合菜放行,而s ...

  7. AOP框架Dora.Interception 3.0 [3]: 拦截器设计

    对于所有的AOP框架来说,多个拦截器最终会应用到某个方法上.这些拦截器按照指定的顺序构成一个管道,管道的另一端就是针对目标方法的调用.从设计角度来将,拦截器和中间件本质是一样的,那么我们可以按照类似的 ...

  8. Struts1、Struts2、Hibernate、Spring框架工作原理介绍

    Struts1工作原理 Struts1工作原理图 1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控 ...

  9. struts2的工作原理

    在学习struts2就必须的了解一下它的工作原理: 首先来看一下这张图 这张工作原理图是官方提供的: 一个请求在Struts2框架中的处理大概分为以下几个步骤 1.客户端初始化一个指向Servlet容 ...

随机推荐

  1. jmeter 压测工具

    Apache jmeter 压力测试 java 环境安装 https://www.cnblogs.com/smyhvae/p/3788534.html 下载地址和文档 http://itopic.or ...

  2. 手把手教你画AndroidK线分时图及指标

    先废话一下:来到公司之前.项目是由外包公司做的,面试初,没有接触过分时图k线这块,认为好难,我能搞定不.可是一段时间之后,发现之前做的那是一片稀烂,可是这货是主功能啊.迟早的自己操刀,痛下决心,开搞, ...

  3. 关于iOS Tabbar的一些设置

    事实上iOS Tabbar的可定制性很高,我们没有必要反复造轮子,以下是笔者收集的一些tabbar的经常使用设置.希望对大家有所帮助. 设置tabbar选中颜色 iOS7设置例如以下: [self.t ...

  4. 转:office 2016最新安装及激活教程(KMS)

    office 2016最新安装及激活教程(KMS)[亲测有效]!!   win7激活教程 博主的一个朋友,咳咳……你们懂得,想装office,于是我就上网找了一下激活的方法,亲测有效,而且也没有什么广 ...

  5. Maven上传本地jar

    1. 将Jar包安装到本地仓库 -- DgroupId和DartifactId构成了该jar包在pom.xml的坐标, 对应依赖的DgroupId和DartifactId    -- Dfile表示需 ...

  6. git系列1

    git clone支持多种协议,除了HTTP(s)以外,还支持SSH.Git.本地文件协议等,下面是一些例子. $ git clone http[s]://example.com/path/to/re ...

  7. centOS7 安装nginx+php+mysql

    nginx安装 本文是介绍使用源码编译安装,包括具体的编译参数信息. 正式开始前,编译环境gcc g++ 开发库之类的需要提前装好. 安装make: yum -y install gcc automa ...

  8. php部分:网页中报表的打印,并用CSS样式控制打印的部分;

    网页中报表的打印,是通过调用window对象中的print()方法实现打印功能的: 调用浏览器本身的打印功能实现打印 <a href="#" onclick="wi ...

  9. Python 单元测试 之setUP() 和 tearDown()

    setUp:表示前置条件,它在每一个用例执行之前必须会执行一次 setUp可以理解为我们需要自动化测试时,需要打开网页窗口,输入对应测试地址,这一些属于前置条件. tearDown:表示释放资源,它在 ...

  10. Vue 填坑系列(持续更新...)

    1.遇到页面显示不更新,数据已更新情况 vue-cli中: this.$nextTick(function () { this.x=x; })     以js引入vue的网页中: this.$set( ...