首先你得准备一个很简单的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读源码记录的更多相关文章

  1. Java读源码之ReentrantLock

    前言 ReentrantLock 可重入锁,应该是除了 synchronized 关键字外用的最多的线程同步手段了,虽然JVM维护者疯狂优化 synchronized 使其已经拥有了很好的性能.但 R ...

  2. Java读源码之ReentrantLock(2)

    前言 本文是 ReentrantLock 源码的第二篇,第一篇主要介绍了公平锁非公平锁正常的加锁解锁流程,虽然表达能力有限不知道有没有讲清楚,本着不太监的原则,本文填补下第一篇中挖的坑. Java读源 ...

  3. [一起读源码]走进C#并发队列ConcurrentQueue的内部世界

    决定从这篇文章开始,开一个读源码系列,不限制平台语言或工具,任何自己感兴趣的都会写.前几天碰到一个小问题又读了一遍ConcurrentQueue的源码,那就拿C#中比较常用的并发队列Concurren ...

  4. Java读源码之CountDownLatch

    前言 相信大家都挺熟悉 CountDownLatch 的,顾名思义就是一个栅栏,其主要作用是多线程环境下,让多个线程在栅栏门口等待,所有线程到齐后,栅栏打开程序继续执行. 案例 用一个最简单的案例引出 ...

  5. 阅读源码很重要,以logback为例,分享一个小白都能学会的读源码方法

    作为一个程序员,经常需要读一些开源项目的源码.同时呢,读源码对我们也有很多好处: 1.提升自己 阅读优秀的代码,第一可以提升我们自身的编码水平,第二可以开拓我们写代码的思路,第三还可能让我们拿到大厂 ...

  6. 读源码【读mybatis的源码的思路】

    ✿ 需要掌握的编译器知识 ★ 编译器为eclipse为例子 调试准备工作(步骤:Window -> Show View ->...): □ 打开调试断点Breakpoint: □ 打开变量 ...

  7. 跟大佬一起读源码:CurrentHashMap的扩容机制

    并发编程——ConcurrentHashMap#transfer() 扩容逐行分析 前言 ConcurrentHashMap 是并发中的重中之重,也是最常用的数据结构,之前的文章中,我们介绍了 put ...

  8. 跟着大彬读源码 - Redis 1 - 启动服务,程序都干了什么?

    一直很羡慕那些能读 Redis 源码的童鞋,也一直想自己解读一遍,但迫于 C 大魔王的压力,解读日期遥遥无期. 相信很多小伙伴应该也都对或曾对源码感兴趣,但一来觉得自己不会 C 语言,二来也不知从何入 ...

  9. 跟着大彬读源码 - Redis 3 - 服务器如何响应客户端请求?(下)

    继续我们上一节的讨论.服务器启动了,客户端也发送命令了.接下来,就要到服务器"表演"的时刻了. 1 服务器处理 服务器读取到命令请求后,会进行一系列的处理. 1.1 读取命令请求 ...

随机推荐

  1. vi使用高级

    下面的命令在vi命令模式被激活 h 光标左移一个字符 l 光标向右移动一个字符 j 光标下移一行 k 移动光标线 一.对整行操作 1.复制光标所在行 yy 2.删除光标所在行 dd 3.选中光标所在行 ...

  2. js模块开发

    js模块开发(一) 现在嵌入页面里面的javascript代码越来越复杂,于是可能依赖也越来越严重,使用别人开发的js也越来越多,于是在理想情况下,我们只需要实现核心的业务逻辑,其他都可以加载别人已经 ...

  3. [SQLXML]FOR XML语法导出XML的易错之处

    原文:[SQLXML]FOR XML语法导出XML的易错之处 [SQLXML]FOR XML语法导出XML的易错之处 Version Date Creator Description 1.0.0.1 ...

  4. 【翻译自mos文章】SYS_OP_C2C 导致的全表扫描(fts)/全索引扫描

    SYS_OP_C2C 导致的全表扫描(fts)/全索引扫描 參考原文: SYS_OP_C2C Causing Full Table/Index Scans (Doc ID 732666.1) 适用于: ...

  5. Webservice中使用Session、Application

    原文:Webservice中使用Session.Application 在Asp.Net 2.0里,已经能够在WebMethod里使用 Session . Application 这种服务器变量了.一 ...

  6. AJAX入门——工作原理

    同步和异步交互,了解互动 对于一个样本:一般B/S模式(同步)       AJAX技术(异步)        *  同步:       提交请求->等待server处理->处理完成返回 ...

  7. 学习html5的WebSocket连接

    1.什么是WebSocket WebSocket 是一种自然的全双工.双向.单套接字连接.使用WebSocket,你的HTTP 请求变成打开WebSocket 连接(WebSocket 或者WebSo ...

  8. Play framework 2.0

    Play framework 2.0北京时间3月14日消息,根据Play framework官方网站消息,目前Play framework 2.0正式版已经发布.新版本的Play framework进 ...

  9. css3动画实例测试

    1.css3动画属性分析(2016-5-11) 1.transition: 规定属性变换规则,可以这样讲.transition(a,b,c,d); a:要变换的属性: b:过渡时间: c:运动方式: ...

  10. Web Api 自动生成帮助文档

    Web Api 自动生成帮助文档   新建Web Api项目之后,会在首页有API的导航菜单,点击即可看到API帮助文档,不过很遗憾,Description 是没有内容的. 怎么办呢? 第一步: 如果 ...