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基础课程>>学习笔记 | 文章13章 | 数据库支持
备注:本章介绍了比较简单,只是比较使用样品,主要假设是把握连接,利用数据库.和SQLite做演示样本 ------ Python数据库API 为了解决Python中各种数据库模块间的兼容问题,如今已经 ...
- [Unity3D]Unity3D连衣裙实现游戏开发系统
大家好,我是秦培.欢迎关注我的博客,我的博客地址">blog.csdn.net/qinyuanpei. 不知从什么时候開始,国产RPG单机游戏開始出现换装,仙剑系列中第一部实现了换装的 ...
- MYSQL LIKE 区分大小写匹配
原文 MYSQL LIKE 区分大小写匹配 MYSQL使用LIKE匹配时默认是不区分大小写的.例:select * from table_name where a like 'wss%'select ...
- 思维方式--SMART原则
假设你的项目管理.系统架构的兴趣,请加微信订阅号"softjg",收藏此PM.建筑师的家 万事开头于你目标的设定,假设開始走错了,那么后面的路将会更加的错误.甚至于更加的努力犯错就 ...
- 快速构建Windows 8风格应用3-打包发布应用
原文:快速构建Windows 8风格应用3-打包发布应用 本篇博文主要介绍如何打包应用程序,成功后如何部署应用程序,最后介绍如何发布应用程序到应用商店中. 如何打包Windows 8风格应用程序呢? ...
- Android总结的基本机制监控事件
研究上午Android底层机制事件监视器,例如下面的摘要: 内核驱动监控硬件状态和行为,由uevent机制将事件发送到用户空间: 通过用户空间UeventObserver从内核监控uevent,处理. ...
- 使用AdvancedInstaller打包web工程设置tomcat端口的方法
原文:使用AdvancedInstaller打包web工程设置tomcat端口的方法 1.首先,要把你要打包的tomcat下的server.xml文件删掉,因为tomcat自带的serv ...
- SQLServer 分组查询相邻两条记录的时间差
原文:SQLServer 分组查询相邻两条记录的时间差 首先,我们通过数据库中表的两条记录来引出问题,如下图 以上为一个记录操作记录的表数据.OrderID为自增长列,后面依次为操作类型,操作时间,操 ...
- 由浅入深学习.NET CLR 系列:目录
经过对Android的一阵折腾,些许熟悉了一些Java的东东,又开始转战.NET.我觉得学习最好和工作不要相离太远,才会更加随笔随意,索性整理一些比较系统的.NET的基础知识学习学习.一提起学习.NE ...
- SQLSever: 如何在select中的每一行产生不同的随机数?
原文:SQLSever: 如何在select中的每一行产生不同的随机数? select 的随机函数有点假, 也许是因为它是基于时间来的吧, 同一select中由于时间无法错开导致产生的随机数都是一样的 ...