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 读取命令请求 ...
随机推荐
- jQuery整理您的笔记----jQuery开始
Jquery它是一种高速.简明的JavaScript相框,jQuery设计目标:Write Less,Do More(写更少的代码,做很多其他的事情). 一.Jquery框架优势: 1.轻量级 jQu ...
- struts2 通配符简化配置
在struts映射中反复出现的模式 动作方法 描写叙述 下一个动作方法 add 为save准备网页 save save 提交INSERT list edit 为update准备网页 update up ...
- vs.net 2013 Saffolding功能扩展
vs.net 2013 Saffolding功能扩展 Asp.net mvc 5 CRUD代码自动生成工具 -Visual Studio.net2013 Saffolding功能扩展 上次做过一个&l ...
- 单元测试之Qunit
单元测试之Qunit 前言 因为公司开发了一套javascript SDK需要测试,在网上找了很久,找到了JQuery团队开发的QUnit,和基于JUnit的JsUnit,还有一些还没有看,先讲讲QU ...
- ACdream 1195 Sudoku Checker (暴力)
Sudoku Checker Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) Submi ...
- IIS下配置php5.5
首先添加IIS. 控制面板-〉程序-〉打开或关闭Windows功能 1. 勾选"Internet 信息服务" 2. 勾选"IIS 管理控制台" Internet ...
- (蓝牙)网络编程中,使用InputStream read方法读取数据阻塞的解决方法
问题如题,这个问题困扰了我好几天,今天终于解决了,感谢[1]. 首先,我要做的是android手机和电脑进行蓝牙通信,android发一句话,电脑端程序至少就要做到接受到那句话.android端发送信 ...
- css,js工具篇
4. web前端开发分享-css,js工具篇 web前端开发乃及其它的相关开发,推荐sublime text, webstorm(jetbrains公司系列产品)这两个的原因在于,有个技术叫emm ...
- 使用Repository模式构建数据库访问层
使用Repository模式构建数据库访问层 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程[二]——使用Repository模式构建数据库访问层 系列导航地址http:// ...
- iOS基础 - UIScrollView
一.UIScrollView使用引导思路. 1.之前我们所学的显示图片是用UIImageView 2.将UIImageView添加到根视图中,不显示的原因:没有设置位置 3.当图片比屏幕大时,直接放在 ...