简单模拟struts2及struts2的处理流程介绍
用了几天模拟struts2,最后结果还是很成功的,也基本没有什么遇上比较难解决的问题,万事开头难,在最开始的时候无从下手,看着下面这张struts2工作流程图配合着网上的博客看了一天终于有了眉目。
看到图的时候应该最先看图例:第一个橙色(Servlet Filter)表示过滤器;第二个蓝色的(Struts Core)表示struts2的核心,是struts2最重要的部分;第三个(Interceptors)表示拦截器,是struts2中一个运用的很好的一个地方;最后一个(User created)是用户自己需要书写的代码
struts2的入口是什么?这个问题曾经把我问住了。现在想想如果这张图深深地记住,那么struts2的基本工作流程也就明白了。struts2的入口是过滤器,一个HttpServletRequest进来首先是过滤器,注意是过滤器,在图上我们也可以看到,用户发起的请求首先进入到过滤器,有些时候感觉过滤器是struts2的基础,但是这么说有些绝对,struts2因为有了过滤器,让有些代码变得简单。Struts实际上使用了一个所谓的ServletFilter来“使事情有效”。一般来说,使用Struts
2时不需要编写Servlet。在模拟struts2的时候需要自己定义一个过滤器,自定义的过滤器需要实现Filter接口,在doFilter方法中写入自己定义的规则基本上这个过滤器就可以使用了,注意需要在web.xml文件中进行配置,我们在开发struts2项目的时候也是需要在web.xml文件中配置一下,定义过滤器需要过滤哪些信息,只有经过过滤器选择出来需要进入struts2框架中处理的才会进入,其他的直接跳转到指定页面。自己定义了一个LoginFilter,在下面的配置中需要指定过滤器类,在url-patten中定义过滤的规则,/*代表所有的请求都会过滤。
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com_filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在过滤器类中是可以执行跳转页面代码的,在上面也说到了在使用struts2的时候不需要编写Servlet,struts2主要是把Servlet隐藏了,Servlet主要是执行了从一个页面到另一个页面的跳转,而过滤器是可以完全代替这些功能的,在过滤器的diFilter方法中声明了ServletRequest和ServletResponse两个类型的参数req、resp,在需要使用跳转的的时候把这两个参数强转成HttpServletRequest和HttpResponse类型的参数即可。在struts2源码中可见:
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
接着向下,经过过滤器的请求到了ActionMapper,但是ActionMapper只是简单的判断,在上面的过滤器中讲到了判断此时的请求是否过滤掉,这个ActionMapper是判断经过过滤器的请求是否需要struts2处理,也就是判断调用哪个Action。ActionMapper其实是HttpServletRequest和Action调用请求的一个映射,它屏蔽了Action对于Request等javaServlet类的依赖。Struts2中它的默认实现类是DefaultActionMapper。
在struts2的工作流程图中可以看到ActionMapper处理之后又返回给了FilterDispatcher,让FilterDispatcher把请求交给ActionProxy,最终调用还是由ActinProxy调用,注意ActionProxy是一个代理类,这里用到了动态代理这种设计模式,我的关于代理模式的文章:Java设计模式-代理模式,在模拟这里的时候代码,其实动态代理我们接触的很少,代码结构很不熟悉。ActionProxy通过ConfigurationManager读取了struts.xml配置文件,这里就要用到xml解析,通过对xml配置文件的解析,读出数据,包括Action类及做出响应的页面等信息。
ActionProxy通过ActionInvocation来执行用户请求对应Acion的拦截器。ActionInvocation负责管理拦截器(Interceptor)。在拦截器这里又用到了责任链设计模式,详见我的责任链的文章:Java设计模式-责任链模式,关于责任链还是比较好理解的,把不同的处理都放在拦截器中,然后组建成一条链,让用户的请求在这条链上走一遍完成各个不同的处理。
在<interceptors>标签中定义了拦截器类的名字和对应的类
然后在<interceptor-stack>中配置拦截器栈,这里相当于数据结构中的栈,从第一个走到最后,想要返回还要从最后一个依次返回,实际上struts2中调用的拦截器就是这些拦截器栈,用户也可以自己定义拦截器栈,把想要的功能组成一个interceptor-stack
在struts2的源码中struts-default.xml文件中配置了好多拦截器。模拟这里的时候,关于读出Action类,这里主要用到了反射,利用反射对类中的属性赋值及执行方法。
最后的返回的结果HttpServletResponse还是要通过过滤器返回的,在模拟的时候,把一些处理的调用放在了过滤器中这样在返回的时候就可以在过滤器中返回。实际上struts2的类远远不止这些,看到仔细的分析,写出了30多个类。简单的模拟只是实现了表单内容验证登录,很多东西都是写死的。
简单模拟struts2及struts2的处理流程介绍的更多相关文章
- springmvc流程 struts2 spring Hibernate 优缺点 使用场景介绍
为什么使用HandlerAdapter? SpringMVC使用一个Servlet(DispacherServlet)代理所有的请求 , SpringMVC中的处理器是方法级别的处理器,而非类级别的处 ...
- SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>
此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblo ...
- struts2(一) struts2入门
首先推荐一本书,虽然我还没看过,但是我以后肯定会看的,<Struts+技术内幕>提取密码:kg6w .现在只是停留在会使用struts2的层次,自己也想继续深入研究,但是感觉自己的知识面还 ...
- java web学习总结(二十二) -------------------简单模拟SpringMVC
在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: ...
- WPF简单模拟QQ登录背景动画
介绍 之所以说是简单模拟,是因为我不知道QQ登录背景动画是怎么实现的.这里是通过一些办法把它简化了,做成了类似的效果 效果图 大体思路 首先把背景看成是一个4行8列的点的阵距,X轴Y轴都是距离70.把 ...
- Linux 内核 链表 的简单模拟(2)
接上一篇Linux 内核 链表 的简单模拟(1) 第五章:Linux内核链表的遍历 /** * list_for_each - iterate over a list * @pos: the & ...
- Linux 内核 链表 的简单模拟(1)
第零章:扯扯淡 出一个有意思的题目:用一个宏定义FIND求一个结构体struct里某个变量相对struc的编移量,如 struct student { int a; //FIND(struct stu ...
- JavaWeb学习总结(四十九)——简单模拟Sping MVC
在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: ...
- 简单模拟Hibernate的主要功能实现
在学习期间接触到Hibernate框架,这是一款非常优秀的O/R映射框架,大大简化了在开发web项目过程中对数据库的操作.这里就简单模拟其底层的实现. /*******代码部分,及其主要注解***** ...
- 【HDU 4452 Running Rabbits】简单模拟
两只兔子Tom和Jerry在一个n*n的格子区域跑,分别起始于(1,1)和(n,n),有各自的速度speed(格/小时).初始方向dir(E.N.W.S)和左转周期turn(小时/次). 各自每小时往 ...
随机推荐
- Docker系统七:Docker数据管理
Docker的数据管理 I. 基本概念 Docker容器一旦删除,其相关的rootf文件系统就会被删除,其容器内的数据将一并删除,为了保存相关数据,Docker提出了数据卷的概念. II. 数据卷 D ...
- Luogu P2888 [USACO07NOV]牛栏Cow Hurdles
题目描述 Farmer John wants the cows to prepare for the county jumping competition, so Bessie and the gan ...
- python︱模块加载(pip安装)以及pycharm安装与报错解决方式
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 准备放下R开始学python,真是痛苦,因为找 ...
- hi3531芯片的标识寄存器
芯片的标识寄存器 0xee0.0xee4.0xee8.0xeec(基址是0x2005_0000) 系统控制器提供了芯片标识(ID)寄存器SC_SYSID.这个标识寄存器是一个概念上 的32bit 的标 ...
- Flex和Servlet结合上传文件
Flex和Servlet结合上传文件 1.准备工作 (1)下载文件上传的组件,commons-fileupload-1.3.1.jar (2)下载文件输入输出jar,commons-io-2.4.ja ...
- JavaWeb中jsp九大内置对象 和四大作用域
九大内置对象为 page request response session exception config application out pageContext no 内置对象 类型 1 pag ...
- newInstance 与new的区别
用newInstance与new的区别? 区别在于创建对象的方式不一样,前者是使用类加载机制,后者new 的类可以没有加载: 使用newInstance时候,必须保证:1.这个类已加载,2.这个类已经 ...
- 第一节 JDK是什么?JRE是什么?JDK和JRE的区别?以及jdk安装和测试。
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.Java语言作为静态面向对象编程语言的代表 ...
- luogu【P2753】[USACO4.3]字母游戏Letter Game
这个题...一开始看了很久题目(并且问了机房几个大佬)才明白题意.. (原题入口) 题意 大概是一开始给你一些字母出现的次数 你之后组成的单词(最多两个单词)每个字母出现次数 必须小于或等于标准(st ...
- React-Native安装使用
先附上React-Native官方文档中文版:http://wiki.jikexueyuan.com/project/react-native/getting-started.html 好,接下来我们 ...