strut2读源码记录
首先你得准备一个很简单的struts2的程序,可以发一次请求后能返回一个正确的响应,当然,struts2的源码也要有,我这里用的myeclipse调试的,本来是想用eclipse,因为本人习惯于用eclipse一点,速度,你懂的,不过,我的eclipse装了反编译,不太好调源码,好了,不扯远了,入正题
1,sturts2用的是什么来处理请求的?
请求开始入口,任何一个请求struts都从这里拦截
为什么说是拦截,而不是像struts1直接使用的servlet,而且最简单的是配置直接就告诉你了用的是
直接实现的是
这个接口,所以,很容易混淆的一个知识点就如可以分清楚了,struts2用的是拦截器
2,struts2到底在请求之前做了些什么?
发送一个请求,直接被拦截到了StrutsPrepareAndExecuteFilter里了,因为我是用的这个拦截类,我知道还有其他的拦截器可以使用,我这里就不多说了。直接将
request,response请求进行了包装,此时,ActionMapping已被初始化了
但是mapping里有值,所以进入了ExecuteOperations的executeAction方法里
我们发现,在这个方法里,只是将这个方法添加了一个参数便提交到了dispatcher.serviceAction方法里了,那这个参数是做什么的了?
我一一点开查看了一下,发现这个参数里添加了好多一些配置信息,但这只是服务器提供的一些如编码,请求url,超时的系统信息,并不包含struts2配置信息,再按F5追踪详细信息。
此时进入Dispatcher类
在这里我们终于看到了
这个字眼,终于开始看到struts的信息了
我们发现在这里有个loadedFileNames有三个值,这里是默认的struts默认加载这三个类名的文件,有一种配置方法可能改变这个三个的默认值,但不建议这么使用,因为,struts2也有一个约定熟成的规定,就是约定大于配置的思想。这里提一下是我以前的一个项目配置时,总是出现问题,都不知道是从哪里出了问题,后面突然想起spring也有约定大于配置的不成文的规定,改回后才能正常跑起来。
当你点开这个配置时,你会发现这里有两个请求,struts框架会处理,一个是我配置的Login框架,另一个我没有配置
但我用/test也能访问我的action,但会报一个404的result错误
结果是访问了这个action,但是没有找到result,这里就有另一个约定大于配置的问题了,只要你是按照struts规定的写法,struts里所有的action都可以直接用类名小写首字母去后面的action,简单的说就是TestAction,就可以用/test.action来访问
在Dispatcher类的serviceAction方法中,mapping参数中的method=null,后面ActionProxy类代理后就默认加上了execute值,则表示,struts2默认会给没有写方法名的action直接访问execute方法。
在这里才真正调用到了execute方法,下面是invocation的栈值,可以看到代理类用的StrutsActionProxy,这个里面都封装了反射需要的所有参数
到这里,一次请求就到了我们自己定义的action类里面了,如果直接F5继续追踪详细信息,就会到一个拦截器里面来,这里是先拦截器,拦截器再调用invoke方法,实际上就是利用的反射调用,我在论坛里听说用反射会很消耗资源,而且效率非常底,不知道,这里用反射会不会效率不会成为考虑的问题,不管了,我不太懂这方面,反正知道原理就行了。但有一点肯定是正确,程序员写自定义拦截器时一定要考虑效率问题,这个就是自己程序的问题了。
有必要在这里讲一下这个intercepter
struts2默认提供了18种不同类型的拦截器
拿第一个
这个类来说吧,如果我们实现一个自己定义的Interceptor,只需要继承自AbstractInterceptor类,重写intercept方法,
然后在struts配置文件里配置一下,这里怎么配置就不详细说明,就可以在每次访问一个action之前先通过拦截器来实现你需要实现的一些业务。所以这个时候应该就比较好理解拦截器的概念了。
先写到这里,以后有时间更新
strut2读源码记录的更多相关文章
- Java读源码之ReentrantLock
前言 ReentrantLock 可重入锁,应该是除了 synchronized 关键字外用的最多的线程同步手段了,虽然JVM维护者疯狂优化 synchronized 使其已经拥有了很好的性能.但 R ...
- Java读源码之ReentrantLock(2)
前言 本文是 ReentrantLock 源码的第二篇,第一篇主要介绍了公平锁非公平锁正常的加锁解锁流程,虽然表达能力有限不知道有没有讲清楚,本着不太监的原则,本文填补下第一篇中挖的坑. Java读源 ...
- [一起读源码]走进C#并发队列ConcurrentQueue的内部世界
决定从这篇文章开始,开一个读源码系列,不限制平台语言或工具,任何自己感兴趣的都会写.前几天碰到一个小问题又读了一遍ConcurrentQueue的源码,那就拿C#中比较常用的并发队列Concurren ...
- Java读源码之CountDownLatch
前言 相信大家都挺熟悉 CountDownLatch 的,顾名思义就是一个栅栏,其主要作用是多线程环境下,让多个线程在栅栏门口等待,所有线程到齐后,栅栏打开程序继续执行. 案例 用一个最简单的案例引出 ...
- 阅读源码很重要,以logback为例,分享一个小白都能学会的读源码方法
作为一个程序员,经常需要读一些开源项目的源码.同时呢,读源码对我们也有很多好处: 1.提升自己 阅读优秀的代码,第一可以提升我们自身的编码水平,第二可以开拓我们写代码的思路,第三还可能让我们拿到大厂 ...
- 读源码【读mybatis的源码的思路】
✿ 需要掌握的编译器知识 ★ 编译器为eclipse为例子 调试准备工作(步骤:Window -> Show View ->...): □ 打开调试断点Breakpoint: □ 打开变量 ...
- 跟大佬一起读源码:CurrentHashMap的扩容机制
并发编程——ConcurrentHashMap#transfer() 扩容逐行分析 前言 ConcurrentHashMap 是并发中的重中之重,也是最常用的数据结构,之前的文章中,我们介绍了 put ...
- 跟着大彬读源码 - Redis 1 - 启动服务,程序都干了什么?
一直很羡慕那些能读 Redis 源码的童鞋,也一直想自己解读一遍,但迫于 C 大魔王的压力,解读日期遥遥无期. 相信很多小伙伴应该也都对或曾对源码感兴趣,但一来觉得自己不会 C 语言,二来也不知从何入 ...
- 跟着大彬读源码 - Redis 3 - 服务器如何响应客户端请求?(下)
继续我们上一节的讨论.服务器启动了,客户端也发送命令了.接下来,就要到服务器"表演"的时刻了. 1 服务器处理 服务器读取到命令请求后,会进行一系列的处理. 1.1 读取命令请求 ...
随机推荐
- python元类分析
刚開始接触到Python新式类中的元类的概念的时候非常是纠结了下..不知道这是个啥东西... 用下面几个定义来说明吧: (1)Python中,类也是对象..仅仅只是这样的对象比較的特殊,他用于创建别的 ...
- linux网络编程学习笔记之四 -----多-threaded服务器
对于使用过程中并发.通过实现更轻量级线程. 每个线程都是一个独立的逻辑流. 主题是CPU在执行调度的最小独立单位,这个过程是资源分配单元.当然,这是在微内核操作系统说.总之,这是唯一的一个操作系统内核 ...
- 2014值得期待的Erlang两本新书
在2014年的开头就有这样一个令人振奋的好消息,Erlang有一本新书即将出版 <The Erlang Runtime System>,其作者happi在2013年3月份发布了这本书的写作 ...
- XAMPP on Mac 组态 Virual Host
首先,在hosts文件中添加virtual host域名.方向127.0.0.1 我一般使用的命名约定dev-domainname.com sudo nano /private/etc/hosts # ...
- 我的MYSQL学习心得(十三)
原文:我的MYSQL学习心得(十三) 我的MYSQL学习心得(十三) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYS ...
- C++ AMP 介绍(两)
C++ AMP 介绍(两) 最后更新:2014-05-02 读前提:<C++ AMP介绍(一个)> 周边环境:Windows 8.1 64bit英文版,Visual Studio 2013 ...
- Fluent NHibernate
Fluent NHibernate]第一个程序 目录 写在前面 Fluent Nhibernate简介 基本配置 总结 写在前面 在耗时两月,NHibernate系列出炉这篇文章中,很多园友说了Flu ...
- windows批处理研究_不断更新
windows批处理脚本(bat),很麻烦,主要原因有: 1.bat脚本编写的风格,太古老,调用方式太奇怪. 2.windows自身运行机制就对批处理脚本有兼容性问题.比如,鼠标双击打开一个bat,与 ...
- SQL Server 性能调优 之运行计划(Execution Plan)调优
运行计划中的三种 Join 策略 SQL Server 存在三种 Join 策略:Hash Join,Merge Join,Nested Loop Join. Hash Join:用来处理没有排过序/ ...
- js获取非行间样式或定义样式
<!--DOCTYPE html--> <html> <head> <meta charset="utf-8" /> <sty ...