首先你得准备一个很简单的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. addEventListener

    addEventListener addEventListener-开始 前面零散地写了些关于 addEventListener 的内容,觉得比较散,有些地方可能也说得不够清楚明白,所以决定以连载的形 ...

  2. poj 2513 Colored Sticks(欧拉路径+并检查集合+特里)

    题目链接:poj 2513 Colored Sticks 题目大意:有N个木棍,每根木棍两端被涂上颜色.如今给定每一个木棍两端的颜色.不同木棍之间拼接须要颜色同样的 端才干够.问最后是否能将N个木棍拼 ...

  3. uptime命令具体解释——linux性能分析

    基本使用: uptime [-V] 实际分析: 这里因为命令比較简单,所以我们不进行具体地介绍.但越是简单的命令,就越是好用方便.像之前百度面试运维的时候,面试管问我哪个命令能够看得到系统负载.我立即 ...

  4. javascript1

    <script> //初始化表达式:通过方括号定义数组元素和通过花括号定义对象属性名和属性值之间的映射关系的语法 //通过“.”和“[]”来引用对象属性或数组元素的值就构成一个表达式. v ...

  5. sql点滴42—mysql中的数据结构

    原文:sql点滴42-mysql中的数据结构 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小 ...

  6. windows下使用pthread

    有的时候需要使用多线程来测试代码啥的,在Linux下有pthread,在windows也有. 我这儿是使用MingW作为编译工具,具体如何下载MingW自行在网上搜索. 而pthread是在这里下载的 ...

  7. OSG(OpenSceneGraphcow.osg)配置笔记

    OpenSceneGraph是一款高性能的3D图形开发库.广泛应用在可视化仿真.游戏.虚拟现实.高端技术研发以及建模等领域.使用标准的C++和OpenGL编写而成,可以运行在Windows系列.OSX ...

  8. 游戏开发常用JS

    游戏插件:cocos2d,createjs,webGl(3d),three.js(3d插件) web插件:Bootstrap插件.less尽量写在服务端. chart.js:精巧的js图标绘制工具库

  9. FineUI开发实践

    ASP.NET-FineUI开发实践-7 摘要: 下拉显示grid列表.其实很简单,但是试了很多方法,水平有限,主要是都不好使,还是简单的好使了,分享下.先是看了看网上的,是直接写个了extjs控件类 ...

  10. Oracle自主事务处理

    --当一个子程序调用另外一个子程序时,事务提交或回滚都将影响两个子程序 --为防止一个子程序的事务影响其他子程序,可以将这个子程序标记为自主事务处理 --这样自主事务成为一个独立的事务处理,不影响其他 ...