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. 搭建局域网maven仓库

    第一步: 下载Nexus http://nexus.sonatype.org/downloads/下载最新版本 解压缩到任意目录,我的直接解压到了E盘---------->E:\nexus-2. ...

  2. poj 1328 Radar Installation 【贪心】【区间选点问题】

    Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 54798   Accepted: 12 ...

  3. Ubuntu下载、zsync、安装、常见问题

    下载-镜像地址 http://mirrors.ustc.edu.cn/ubuntu-releases/ http://mirrors.163.com/ubuntu-releases/ Ubuntu 更 ...

  4. APU的Vsense引脚的作用

    JACK学习文档推荐: 开关电源PCB布局注意事项 开关电源PCB布线注意事项 一.Sense电压检测(FB) “Sense+”和“Sense-”,就是四线制中的电压检测线,high-sense 和l ...

  5. flash插件使用外部数据的方法

    使用xml保存需要改变的数据,如轮播图的图片路径,也可以在xml中指定数据库地址等

  6. 卸载gnu gcj

    麻辣个鸡的,我在Linux上安装的jkd版本是1.8,然后可能是之后安装了GCC吧,他大爷的,java版本变成了1.5.这个残酷的事实是在我写练习Package的测试文件的时候搞得. 机智的看了一下j ...

  7. 【nginx】关于Nginx的一些优化(突破十万并发)

    nginx指令中的优化(配置文件) worker_processes 8; nginx进程数,建议按照cpu数目来指定,一般为它的倍数. worker_cpu_affinity 00000001 00 ...

  8. 01 redis特点及安装使用

    一:redis的特点 ()redis是一个开源,BSD许可高级的key-value存储系统.可以用来存储字符串,哈希结构,链表,集合,因此,常用来提供数据结构服务. 二:redis和memcached ...

  9. diy文件系统上创建文件的流程

    [0]README 0.1) source code are from orange's implemention of a os , and for complete code , please v ...

  10. Oracle学习第一篇—安装和简单语句

    一 安装  10G ----不适合Win7 Visual Machine-++++Visual Hard Disk 先安装介质(VM)---便于删除 11G-----适合Win7 1 把win64_1 ...