走进Struts2(一) — Struts2的执行流程及其工作原理
Struts2是一套很优秀的Web应用框架,实现优雅、功能强大、使用简洁。能够说是Struts2是一款很成熟的MVC架构。
在我们学习Struts2时,最好是先学习它的执行流程、核心概念。从中得到启示。提升自己,而不不过学习怎么怎么使用它。
在网上看到这样一句话:
你千万不要成为一个仅仅会熟练使用框架的程序猿。那样。你会疲于奔命,你或许永远仅仅会使用 Hadoop ,而写不出一个 Hadoop ,你仅仅是一个 Hadoop程序猿,而不是一个分布式project师。
你或许永远仅仅会使用 Struts,而忘记了自己写 filter,你仅仅是一个 SSH 程序猿,而不是一个 Web project师。
话不多说,一起走进Struts2
一、系统架构
Struts2的官方文档附带了Struts2的架构图。
从这张图能够非常好的去理解Struts2
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2p3MDEzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
关于图中的Key:
- Servlet Filters:过滤器链,client的全部请求都要经过Filter链的处理。
- Struts Core:Struts2的核心部分,可是Struts2已经帮我们做好了,我们不须要去做这个
- Interceptors。Struts2的拦截器。Struts2提供了非常多默认的拦截器。能够完毕日常开发的绝大部分工作;而我们自己定义的拦截器,用来实现实际的客户业务须要的功能。
- User Created,由开发者创建的。包含struts.xml、Action、Template。这些是每一个使用Struts2来进行开发的人员都必须会的。
- 1.FilterDispatcher是整个Struts2的调度中心。也就是MVC中的C(控制中心),依据ActionMapper的结果来决定是否处理请求,假设ActionMapper指出该URL应该被Struts2处理。那么它将会运行Action处理,并停止过滤器链上还没有运行的过滤器。
- 2.ActionMapper 会推断这个请求是否应该被Struts2处理,假设须要Struts2处理。ActionMapper会返回一个对象来描写叙述请求相应的ActionInvocation的信息。
- 3.ActionProxy。它会创建一个ActionInvocation实例,位于Action和xwork之间,使得我们在将来有机会引入很多其它的实现方式。比方通过WebService来实现等。
- 4.ConfigurationManager是xwork配置的管理中心,能够把它看做struts.xml这个配置文件在内存中的相应。
- 5.struts.xml,是开发人员必须光顾的地方。是Stuts2的应用配置文件,负责诸如URL与Action之间映射关系的配置、以及运行后页面跳转的Result配置等。
- 6.ActionInvocation:真正调用并运行Action,它拥有一个Action实例和这个Action所依赖的拦截器实例。ActionInvocation会依照指定的顺序去运行这些拦截器、Action以及相应的Result。
- Interceptor(拦截器):是Struts2的基石。类似于JavaWeb的Filter,拦截器是一些无状态的类。拦截器能够自己主动拦截Action,它们给开发人员提供了在Action运行之前或Result运行之后来运行一些功能代码的机会。
- 7.Action:用来处理请求,封装数据。
- 二、执行流程
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2p3MDEzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
注意:Action完整的调用过程都是由ActionInvocation对象负责
拦截器的执行被分成两部分,一部分在Action之前执行,一部分在Result之后执行,并且顺序是刚好反过来的。也就是在Action执行前的顺序,比方是拦截器1、拦截器2、拦截器3,那么执行Result之后,再次执行拦截器的时候,顺序就变成拦截器3、拦截器2、拦截器1了。
这就好比,你要去奶奶家。需要通过 水泊梁山->盘丝洞 -> 索马里,到了奶奶家。看奶奶回来的时候,就必需要通过 索马里 -> 盘丝洞 -> 水泊梁山。
所以ActionInvocation对象运行的时候须要通过非常多复杂的过程,依照指定拦截器的顺序依次运行。
相应Struts2的架构图例如以下
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2p3MDEzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
9.到了奶奶家,然后运行Action的execute方法
10.然后依据execute方法返回的结果(Result),去struts.xml中匹配选择下一个页面
11.依据结果(Result)找到页面后,在页面上(有非常多Struts2提供的模板),能够通过Struts2自带的标签库来訪问须要的数据,并生成终于页面
注意:这时还没有给client应答,仅仅是生成了页面
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2p3MDEzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
12.最后,ActionInvocation对象倒序运行拦截器,从奶奶家回来
13.ActionInvocation对象运行完成后,已经得到响应对象(HttpServletResponse)了,最后按与过滤器(Filter)配置定义相反的顺序依次经过过滤器,向client展示出响应的结果
得到完整Struts2架构图
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2p3MDEzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
走进Struts2(一) — Struts2的执行流程及其工作原理的更多相关文章
- struts2 执行流程及工作原理
在Struts2框架中的处理大概分为以下的步骤 1 用户发送请求: 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过 ...
- 一条查询sql的执行流程和底层原理
1.一条查询SQL执行流程图 2.查询SQL执行流程之发送SQL请求 (1)客户端按照Mysql通信协议将SQL发送到服务端,SQL到达服务端后,服务端会单起一个线程执行SQL. (2)执行时Mysq ...
- Struts2的运行流程及其工作原理
1 服务开启,配置文件初始化 2 用户访问login请求 3 进入web.xml文件中我们配置的核心控制器(filter) 4 核心过滤器中有一个FilterDispatcher,FilterDisp ...
- 面试官:说说一条查询sql的执行流程和底层原理?
一条查询SQL执行流程图如下 序章 自我介绍 我是一条sql,就是一条长长的字符串,不要问我长什么样,因为我比较傲娇. 额~~不是我不说啊,因为细说起来,我可以细分为DML(Update.Insert ...
- Docker系列(4)- run的流程和docker原理
回顾HelloWorld流程 底层工作原理 Docker是怎么工作的? Docker是一个Client-Server结构的系统,Docker的守护进程运行在宿主机上.通过Socket从客户端访问 Do ...
- Servlet、Struts2、SpringMVC执行流程
Servlet 有以下四个阶段: 1.加载和实例化 Servlet容器负责加载和实例化Servlet. 当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Ser ...
- struts2 之 【struts2简介,struts2开发步骤,struts2详细配置,struts2执行流程】
入门框架学习避免不了的问题: 1. 什么是框架? 简单的说,框架就是模板,模子,模型.就是一个可重用的半成品. 2. 如何学习框架? 学习框架其实就是学习规则,使用框架就是遵循框架的规则,框架是可变的 ...
- Struts2第二篇【开发步骤、执行流程、struts.xml讲解、defalut-struts讲解】
前言 我们现在学习的是Struts2,其实Struts1和Struts2在技术上是没有很大的关联的.Struts2其实基于Web Work框架的,只不过它的推广没有Struts1好,因此就拿着Stru ...
- 学习Struts--Chap02:Struts2框架各个功能模块和程序执行流程的介绍
1.Struts2的系统架构: 2.架构中不同Key的作用介绍: servlet Filters:过滤器链,client的全部请求都要经过Filter链的处理. Struts Core:Struts2 ...
随机推荐
- java线程学习1
java实现多线程有三种方式:继承Thread类,重写run方法,启动使用start:实现runnable接口,重写run方法:实现callable接口,重写call方法(可以有返回值,也可以抛出异常 ...
- Java递归扫描文件路径
import java.io.File; public class Test { public static int count = 0; public static void main(String ...
- zabbix4.2学习笔记--新建用户组和用户
新建用户组 zabbix中管理机器是以用户组划分,这里新建一个只读用户群组和只读用户 新建用户组 点击 管理-用户组-创建用户群组,如下图 点击创建之后,有三列设置,分别是用户群组.权限和标签过滤器, ...
- js 实现弹力球效果
1.html代码: <div id='imgid'> <img src="img/5.png"> </div> 2.js代码: imgobj=d ...
- vue mixins应用场景
学习知识得在应用场景中去应用,这样才能真正学到东西,记忆也深刻,以后碰到类似的东西就会了. 1.在assets文件夹下创建一个js文件 // 创建一个需要混入的对象 export const mixi ...
- CentOS7.4 搭建和使用telnet
1.先检查是否安装了telnet rpm -qa | grep telnet //检查你的CentOS是否安装了telnet和telnet-server rpm -qa xinetd //检查你的C ...
- <Linux> 下安装和卸载JDK
安装 下载jdk https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 在local ...
- js 技巧 (二)
//最小化,最大化,关闭 <object id=min classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"> & ...
- Kvm:启动报错:error: internal error: process exited while connecting to monitor: 2018-11-12T01:47:14.993371Z qemu-system-x86_64: cannot set up guest memory 'pc.ram': Cannot allocate memory
今天有台kvm挂了,物理机启动时报错 很明显看报错显示内存不足,无法分配内存,查看物理机内存使用正常,.xml修改虚机内存后启动依然报错 报错: 这时候需要看一下主机确保可以分配多少内存 sysctl ...
- Matlab学习笔记(五)
三.矩阵运算 (一)矩阵函数和特殊矩阵 常见的矩阵处理函数 表3-1 常见的矩阵函数 函数 说明 /或\ 矩阵除法中的左除或右除,可以用于求解线性方程组 accumarray(ind,val) ...