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. solor5.4学习笔记

    1.下载地址:http://archive.apache.org/dist/lucene/solr/ 2.与tomcat的整合http://jingyan.baidu.com/article/d807 ...

  2. ICON小工具如何使用

    对于ICON这个小资源,我们可以手动绘制.选择bmp图形的大小,尤其是旁边的选择工具(矩形或者弧形),我们可以通过选择工具挪动我们手动绘制的图标,其实图标只有中间那部分有用,其他没有用.还有最右边色拾 ...

  3. 【Unity 3D】学习笔记三十三:游戏元素——天空盒子

    天空盒子 一般的3D游戏都会有着北京百年一遇的蓝天.让人惊叹不已.事实上天空这个效果没有什么神奇的仅仅需用到天空盒子这个组件即可.能够将天空设想成一个巨大的盒子,这个盒子将整个游戏视图和全部的游戏元素 ...

  4. linux使用crontab实现PHP执行定时任务(转)

    前几天写过一篇文章,利用单纯的php实现定时执行任务,但是效率不佳,对于linux来说用crontab实现更加合理. 首先说说cron,它是一个linux下的定时执行工具.根用户以外的用户可以使用 c ...

  5. Makefile浅尝

    [0]README makefile定义: 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要一先编译,哪些文件需要后编译,哪 ...

  6. 设置Eclipse中properties文件打开方式myeclipse一样有source和properties两个视图方法

    东北大亨: 说明:如果想在eclipse的properties文件打开的方式出现source和properties视图就需要添加JBossTools插件 下面介绍如果添加插件: 1.打开官网 http ...

  7. System.DateTime.Now.ToString()的一些用法

    日期处理函数    //2007年4月24日    this.TextBox6.Text = System.DateTime.Now.ToString("D");    //200 ...

  8. Angular入门(四) Router 替换当前页面

    1.在 xx.html 中直接 写标签       <a [routerLink]="['/home']">home</a>   2.在 xx.html 中 ...

  9. 远程服务器上的weblogic项目管理(五) PermGen内存溢出问题

    weblogic偶尔会出现PermGen异常,内存溢出的问题,这个时候需要修改weblogic安装目录下的domain/common/bin/commEnv.cmd. 打开后在其中找到: set ME ...

  10. Android笔记之ViewModel的使用示例

    依赖 implementation 'android.arch.lifecycle:extensions:1.1.1' implementation 'com.squareup.retrofit2:r ...