Struts2 源码分析——项目分析
| 项目知识点分析 |
从上一章中我们知道了接下来我们要去了解源码的项目(struts2-showcase)。而这一章将讲述我三年后在次接触struts2-showcase项目是一个什么样子的情况。我有一个工作习惯。在参于每一个新项目开发的时候,我都希望项目负责人能跟我讲讲这个项目到底用到了哪些知识点。这样子的目标是让我心中对项目会有一个大体上的概念。悲剧的是struts2-showcase作者是不可能为你这个小小的角色特意打电话或是EMAIL你的。所以我的入手点是看这个项目的需要的JAR。如图下。

从上面的图片里面的红框我们可以大概判断出。可能用的是struts2 + spring + hibernate架构。而界面是用sitemesh + struts2-Tiles来实现的。在这里我并不认了hibernate有被用到。因为我没有看到主要的hibernate包。而且这个项目并没有用到数据库方面的知识。所以最有可能是struts2 + spring 架构。为了进一步确定,我点开eclipse项目里同的WEB-INF来看。如下图

我可以看到applicationContext.xml,而没有看到hibernate相关的配置文件,我还特意去放代码的根目标(src)里面去找。这次我更加确定用的是Spring,没有用hibernate知识点。
项目总结:
1.主体架构:struts2 + spring 架构。
2.界面显示:sitemesh + struts2-Tiles。
3.其他:DWR框架,模板引擎(velocity,freemarker)。
| struts2入口类 |
从上面的总结我们可以看到项目用到的相关知识点。当然这是我个人的分析并不全面。要分析一个开源的框架只有项目结合来分析才是最完美的。而接下来我们要做的是找到对应的入口类。显然我们要从Web.xml入手。从Web.xml上面我们可以找到我们需要的类。StrutsPrepareFilter类和StrutsExecuteFilter类。如图下(web.xml的部分内容)

从图片中我们可看到struts2的入口类,我们可以想像一点struts2是不是用过滤器(Filter)来实现MVC思想呢?而不是用Servlet呢?。由于笔者正真看struts2源码是在四年前,所以当笔看到上面图片的写法的时候,笔者脑中就会有这样子的想法:每一个用户请求都会通过struts2来进行过滤来找到对应用户要请求的类。然后类执行对应的方法并返回相应的结果。在通过struts2来回应相关的结果页面。如图下。

我有个毛病,有思想之后,我都会试着去证明一下。首先假设我的想法是对的话,那么我们的目标也明确下来。我们就是要了解struts2是什么样子处理每个用户请求。又是什么样子去处理找到对应的类。让我们在看看上面的Web.xml 的信息。我们会发现这条内容(org.apache.struts2.dispatcher.filter.StrutsPrepareFilter)。我们可以根据这个内容找到他所在的JAR包——struts2-core-2.5.2.jar。让我们点开他。如图下。

从上面的图片我们能发现在filter包下有四个类分别为:FilterHostConfig.class,StrutsExecuteFilter.class,StrutsPrepareAndExecuteFilter.class,StrutsPrepareFilter.class。从这点上我们就明白这将是未来要用到的第一个类。用心的程序员会发现上面还有com.opensymphony.xwork2。从这一点上我们不难发现这就是关于xwork2的源码。既是Webwork框架的源码。没有错,struts2是基于Webwork上面在进行研发的。所以如果是学过Webwork的人会很易容上手struts2。让我们回头过来看看这四个类。根据类名我就可以想像一种可能情况:StrutsExecuteFilter.class + StrutsPrepareFilter.class == StrutsPrepareAndExecuteFilter.class。我也试用把StrutsPrepareFilter类删除掉,只用StrutsExecuteFilter。不好意思,不行。我记得我以前有带过一个新生,他只用一个StrutsExecuteFilter类。而后做一个下午,最后受不了就是不知道哪里出错了。就跑过来找我。我一看:小样的,你是想让我打死你吗?
| 文章总结 |
这一章主要的目标是让我们明白我们将要应对的知识点有。spring相关的知识。还有界面相关的知识。同时让我们明白我们要入口类有哪一些。在进行struts2的Web.xml配置的时候,有俩种方式。一种是用StrutsExecuteFilter.class + StrutsPrepareFilter.class,一种是用 StrutsPrepareAndExecuteFilter.class。
Struts2 源码分析——项目分析的更多相关文章
- Struts2 源码分析——DefaultActionInvocation类的执行action
本章简言 上一章讲到关于拦截器的机制的知识点,让我们对拦截器有了一定的认识.我们也清楚的知道在执行用户action类实例之前,struts2会先去执行当前action类对应的拦截器.而关于在哪里执行a ...
- Struts2 源码分析——拦截器的机制
本章简言 上一章讲到关于action代理类的工作.即是如何去找对应的action配置信息,并执行action类的实例.而这一章笔者将讲到在执行action需要用到的拦截器.为什么要讲拦截器呢?可以这样 ...
- Struts2 源码分析——Action代理类的工作
章节简言 上一章笔者讲到关于如何加载配置文件里面的package元素节点信息.相信读者到这里心里面对struts2在启动的时候加载相关的信息有了一定的了解和认识.而本章将讲到关于struts2启动成功 ...
- Struts2 源码分析——配置管理之PackageProvider接口
本章简言 上一章讲到关于ContainerProvider的知识.让我们知道struts2是如何注册相关的数据.也知道如何加载相关的配置信息.本章笔者将讲到如何加载配置文件里面的package元素节点 ...
- Struts2 源码分析——配置管理之ContainerProvider接口
本章简言 上一章笔者讲到关于Dispatcher类的执行action功能,知道了关于执行action需要用到的信息.而本章将会讲到的内容也跟Dispatcher类有关系.那就是配置管理中的Contai ...
- Struts2 源码分析——调结者(Dispatcher)之执行action
章节简言 上一章笔者写关于Dispatcher类如何处理接受来的request请求.当然读者们也知道他并非正真的执行action操作.他只是在执行action操作之前的准备工作.那么谁才是正真的执行a ...
- Struts2 源码分析——过滤器(Filter)
章节简言 上一章笔者试着建一个Hello world的例子.是一个空白的struts2例子.明白了运行struts2至少需要用到哪一些Jar包.而这一章笔者将根据前面章节(Struts2 源码分析—— ...
- Struts2 源码分析——Hello world
新建第一个应用程序 上一章我们讲到了关于struts2核心机制.对于程序员来讲比较概念的一章.而本章笔者将会亲手写一个Hello world的例子.所以如果对struts2使用比较了解的朋友,请跳过本 ...
- Struts2 源码分析——前言
笔者简言 笔者在博园里面注册是在二年前.可是那个时候我不知道要写些什么,也怕写出来被别人骂误人子弟.而现在却动笔了是因为前一段时间内我去参加一些大公司的面试,让笔者内心深处留下很多问号.最近三年来我一 ...
随机推荐
- libQtCassandra 0.5.0 发布
libQtCassandra 0.5.0 修复了 QCassandraRow::exists() 函数的问题,更新了 Thrift 库. libQtCassandra 是一个高级的 C++ 库用来访问 ...
- 【腾讯Bugly干货分享】深入理解 ButterKnife,让你的程序学会写代码
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/578753c0c9da73584b025875 0.引子 话说我们做程序员的,都 ...
- 【Java】ThreadLocal细节分析
ThreadLocal通过中文解释就是线程本地变量,是线程的一个局部变量.根据哲学家黑格尔“的存在即合理”的说法,ThreadLocal的出现肯定是有它的意义,它的出现也是因为多线程的一个产物.Thr ...
- ECMAScript 6 简介
ECMAScript 6 是JavaScript的下一个标准,正处在快速开发之中,大部分已经完成了,预计将在2014年正式发布.Mozilla将在这个标准的基础上,推出JavaScript 2.0. ...
- 生成PDF的新选择-Phantomjs
最近在node.js项目开发中,遇见生成PDF的需求,当然生成PDF不是一个新意的需求:我可以选择利用开源的pdfkit或者其他node pdf模块,或者通过edge.js调用.net/python下 ...
- CGLib与JDKProxy的区别
Spring AOP 的实现主要有两种:CGLib与JDK自带的Proxy. 他们主要的区别是,需要JDKProxy修改的类必须实现接口(因此也只能代理public方法),在创建Proxy时可以使用c ...
- 我心中的核心组件(可插拔的AOP)~第十五回 我的日志组件Logger.Core(策略,模版方法,工厂,单例等模式的使用)
回到目录 之前的讲过两篇关于日志组件的文章,分别是<第一回 日志记录组件之自主的Vlog>和<第三回 日志记录组件之log4net>,而今天主要说一下我自己开发的另一种日志 ...
- Laravel5.0学习--02 实例进阶
本文以laravel5.0.22为例. 本节以新建一个简单的博客作为实例. 准备工作 数据库配置 .env文件(也可以直接修改config/database.php) DB_HOST=localhos ...
- Atitit 数据存储的分组聚合 groupby的实现attilax总结
Atitit 数据存储的分组聚合 groupby的实现attilax总结 1. 聚合操作1 1.1. a.标量聚合 流聚合1 1.2. b.哈希聚合2 1.3. 所有的最优计划的选择都是基于现有统计 ...
- ui-router带参数的ui-sref配置
ui-router带参数的ui-sref配置 路由 .state('app.user_edit', { url:'user/userid/:userid', templateUrl: 'compone ...