【Jsp精品源码栏目提醒】:网学会员Jsp精品源码为您提供Struts2框架核心代码分析 - 其它资料参考,解决您在Struts2框架核心代码分析 - 其它资料学习中工作中的难题,参考学习。
代码分析报告Struts2 框架核心代码分析 专业: ?????? 学号: ?????? 二年十一月目录一、引言 ................................................................................................................................... 1二、Struts2 的发展过程 ........................................................................................................... 5 2.1 Struts1 .......................................................................................................................... 5 2.2 WebWork .................................................................................................................... 6 2.3 Struts 2 的诞生 ............................................................................................................ 6 2.4 相对 struts1.2,struts2.0 的新特性及其实现 ............................................................ 7 2.5struts2.0 的 MVC 模式与 struts1.0 的 MVC 模式区别 .............................................. 9三、Struts 2 框架 ...................................................................................................................... 9 3.1 使用 Struts2.0 实现 MVC.................................................................................. 9 3.2 Struts 2 配置文件 .............................................................................................. 11 3.3 Struts 2 控制器 .................................................................................................. 12 3.4 Struts 2 标签库 .................................................................................................. 12四、Struts2 源代码分析 ......................................................................................................... 13 4.1 下载 struts-2.3.4.1-all-src.zip ............................................................................ 13 4.2 核心代码分析 .................................................................................................. 15 4.3Struts2 请求处理
源码过程 ................................................................................ 23五、Struts 2 框架应用举例 .................................................................................................... 25六、结论 ................................................................................................................................. 28 Struts2 框架核心代码分析一、引言 Apache Struts2 是一个为企业级应用打造的优秀的、可扩展的 Web 框架。
该框架旨在充分精简应用程序的开发周期,从而减少创建、发布、应用所花费的时间。
而且对于Struts1 有很多革命性的改进,但它并不是全新的框架,而是在 WebWork 框架的基础上发展起来的。
所以也可以说 Struts2 是 WebWork 的升级,吸收了 Struts1 和 WebWork 的优势,稳定性、性能都有了很好的保证。
作为一个对 java web 学习的初学者、菜鸟,首先让我们先了解下这几个名词:1.MVC 框架 MVC Model View Controller本来是存在于 Desktop 程序中的,M 是指数据模型,V 是指用户界面,C 则是控制器。
使用 MVC 的目的是将 M 和 V 实现代码分离,从而使同一个程序可以使用不同的表现形式。
比如一批统计数据你可以分别用柱状图、饼图来表示。
C 存在的目的则是确保 M 和 V 的同步,一旦 M 改变,V 应该同步更新。
MVC 是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。
使用 MVC应用程序被分成三个核心部件:模型、视图、控制器。
它们各自处理自己的任务。
图 1.1 MVC 模式 MVC 的处理过程,首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。
2.框架 框架是为了解决一个又一个在 Web 开发中所遇到的问题而诞生的。
不同的框架,都是为了解决不同的问题,但是对于程序员而言,他们只是 jar 包而已。
框架的优缺点的评论,也完全取决于其对问题解决程度和解决方式的优雅性的评论。
在现在的 java web 主流编程中有许多框架,比如 Struts、Spring、Hibernate 等。
3.设计模式 我是在考软件设计师时学到了设计模式的,当时对设计模式的理解是对在某种环境中反复出现的问题以及解决该问题的方案的描述,是一种比框架要抽象的概念。
框架可以用代码表示,也能直接执行或复用,而对模式而言只有实例才能用代码表示,设计模式是比框架更小的元素,一个框架中往往含有一个或多个设计模式,框架总是针对某一特定应用领域,但同一模式却可适用于各种应用。
在 Struts2 中有一些核心的设计模式,甚至贯穿了整个 Struts2 的逻辑主线,成为 Struts2内部实现中不可或缺的重要组成部分。
在 Struts2 中,我们将先后接触到命令(Command)模式、ThreadLocal 模式、装饰(Decorator)模式、策略(Strategy)模式、构造(Builder)模式、责任链(Chain Of Responsibility)模式、代理(Proxy)模式等等。
这些设计模式的反复使用,使得 Struts2 的实现本身就充满了最佳实践。
4.
JSP JSP 技术提供一种简单快速的方法来创建显示动态生成内容的 Web 页面,其目的是使得构造基于 Web 的应用开发程序更加容易和快捷,而这些程序能够与各种 Web 服务器、应用服务器、游览器和开发工具协同工作。
JSP 网页由传统的网页 HTML 文件(.htm 和.html)中加入 java 程序片段(Scriptlet)和
JSP 标记(tag)所构成。
Web 服务器在遇到访问
JSP 网页的请求时,首先执行其中的程序片段,然后将执行结果以 HTML 格式返回给客户。
所以程序操作都在服务器端执行,网络上传送给客户端的仅仅是结果,对客户游览器的要求比较低。
由
JSP 推出后,众多大公司都推出了支持
JSP 技术的服务器,如 IBM、Oracle 及 Bea公司等,由此
JSP 迅速成为商业应用的服务器端语言。
5.Servlet Servlet 是
JSP 的本质,所有的
JSP 页面在执行时都会被服务器端的
JSP 引擎转换为Servlet。
由于
JSP 引擎调用 Java 编译器,将 Servlet 编译成.class 文件,并由 JVM 解释执行,然后即可通过服务器端向客户发布
JSP 网页。
一个 Servlet 请求就是 Java 编程语言中的一个类,用来扩展服务器的性能,服务器中驻留可以通过“请求—响应”编程模型来访问的应用程序。
虽然 Servlet 可以响应任何类型的请求,但是通常只用来扩展 Web 服务器的应用程序,Java Servlet 技术为这些应用程序定义了一个特定于 HTTP 的 Servlet 类。
Servlet 通过创建一个框架来扩展服务器的能力,以提供在 Web 上的请求和响应服务。
当客户端发送请求至服务器时,服务器可以将请求信息发送给 Servlet,并由其建立服务器返回给客户端的响应。
当启动 Web 服务器或者接收到客户端的第一次请求服务时,可以自动装入 Servlet。
装入后,Servlet 继续运行,直到其他客户端发出请求。
6.Web 服务器 简单介绍其中一种应用比较广泛的 Tomcat,Tomcat 是 Apache 软件基金会(ApacheSoftware Foundation)的 Jakarta 项目中的一个核心项目,由 Apache、Sun 和其他一些公司及 由于有了 Sun 的参与和支持,个人共同开发而成。
最新的 Servlet 和
JSP 规范总是能在 Tomcat中得到体现。
因为 Tomcat 技术先进、性能稳定,而且免费,因而深受 Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的 Web 应用服务器。
Tomcat 是一个轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试
JSP 程序的首选。
对于一个初学者来说,可以这样认为,当在一台机器上配置好 Apache 服务器,可利用它响应对 HTML 页面的访问请求。
实际上 Tomcat 部分是 Apache 服务器的扩展,但它是独立运行的,所以当你运行 tomcat 时,它实际上作为一个与 Apache 独立的进程单独运行的。
这里的诀窍是,当配置正确时,Apache 为 HTML页面服务,而 Tomcat 实际上运行
JSP 页面和 Servlet。
7.Java Bean JavaBean 大部分是用在 web 项目里,是一个后台的类,提供给前台的
JSP 页面使用,这个类完成某个功能,比方说,往数据库加条记录,中文转码。
JavaBean 说白了不过是一个 Java 类,和普通的 Java 类差不多,区别有 3 个:1.用 private把不必要的属性隐藏起来,通过属性的 getter 和 setter 使类外可以拿到这些属性或者给它们设置值;2.必须实现序列化接口(java.io.Serializable),这是为了以后能把这个类的对象保存在硬盘上;3.必须有一个 public 的无参构造函数,因为使用者可能需要通过反射机制来实例化这个对象。
除此之外 JavaBean 跟普通 Java 类没有区别。
这样的一个 Java 类(也就是 , 以JavaBean) 你可 在
JSP 页面上使用 sun 提供给我们的标签来操作它。
如果你写了一个类,这个类没有遵从上面那 3 个标准的话,你在
jsp 页面里用标签来操作这个类,可能会出错的。
二、Struts2 的发展过程 接着让我们了解下 Struts2 的起源和背景。
2.1 Struts1 在过去,Struts1 是所有 MVC 框架中不容辩驳的胜利者。
其程序运行流程如图 2.1所示。
图 2.1 Struts 1 的程序运行流程 但是对于 Struts 1 框架而言,因为它存在着不少问题: 1.与
JSP/Servlet 耦合非常紧密,难于测试。
2.支持的表现层技术单一,只支持
JSP 作为表现出技术,不提供其他表现层技术,严重制约了其使用。
3.代码严重依赖于 Struts 1 API,属于侵入式设计。
随着 Web 应用的拙见扩大,这些缺陷逐渐变成制约 Struts 1 发展的的重要因素——这也是 Struts 2 出现的原因。
2.2 WebWork WebWork 来自另外一个优秀的开源组织:opensymphony。
WebWork 2 建立在 Xwork之上,处理 HTTP 的请求和响应,所有的请求都会被前端控制器截获。
前端控制器对请求的数据进行包装、初始化上下文数据、根据配置文件查找请求 URL 对应的 Action 类、执行 Action,并将执行结果转发到相应地展现页面。
WebWork2 支持多视图表示,试图部分可以使用
JSP、Velocity、FreeMarker、JasperReport 和 XML 等。
它采用了更加松耦合的设计,让系统的 Action 不再与 Servlet API 耦合。
允许系统从 B/S 结构向 C/S 结构转换。
而且相对于 Struts 1 仅支持 JPS 表现层技术的缺陷而言,WebWrok 支持更多的表现层技术。
相对于 Struts1 的种种缺点,WebWork 具有如下优点: 1.Action 不必与 ServletAPI 耦合,更容易测试。
2.Action 不必与 WebWork 耦合,代码重用率高。
3.支持更多的表现层技术,有更好的适应性。
2.3 Struts 2 的诞生 但实质上是以 WebWork 为核心。
在 Struts 2 虽然是在 Struts 1 的基础上发展起来的,从某种程度上来讲,Struts2 没有继承 Struts1,而是继承了 WebWork 的血统。
因为 Struts2是 WebWork 的升级,而不是一个全新的框架,因此稳定性及性能等各方面都有很好的保证。
Struts 2 为传统 Struts 1 注入了 WebWork 的设计理念,它吸收了 Struts1 和 WebWork二者的优势,统一了 Struts 1 和 WebWork 两个框架。
Struts 2 大量使用拦截器来处理用户请求,从而允许用户的业务逻辑控制器与 ServletAPI 分离。
2.4 相对 struts1.2,struts2.0 的新特性及其实现 Struts2 与 Struts1 体系的差别非常大,因为前者使用了 WebWork 的设计核心,而不是使用后者的设计核心。
Struts2 大量使用拦截器来处理用户请求,从而允许用户的业务逻辑控制器与 ServletAPI 分离。
Struts2 是一个雅致、可扩展并用来建立企业级 Java Web 应用程序的框架,不但注重程序的开发过程,更注重部署和后期维护。
它容易使用,并且最大可能地保留 Struts1.X的相似性。
1.Action 类 Struts1 要求 Action 类继承一个抽象基类。
Struts1 的一个普遍问题是使用抽象类编程而不是接口。
Struts2Action 类可以实现一个 Action 接口,也可实现其他接口,使可选和定制的服务成为可能。
Struts2 提供一个 ActionSupport 基类去实现常用的接口。
Action 接口不是必须的,任何有 execute 标识的 POJO 对象都可以用作 Struts2 的 Action 对象。
2.线程模式 Struts1 Action 是单例模式并且必须是线程安全的,因为仅有 Action 的一个实例来处理所有的请求。
单例策略限制了 Struts1 Action 能作的事,并且要在开发时特别小心。
Action 资源必须是线程安全的或同步的。
Struts2 Action 对象为每一个请求产生一个实例, (实际上, 因此没有线程安全问题。
servlet 容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题) 3.Servlet 依赖 Struts1 Action 依赖于 Servlet API因为当一个 Action 被调用时 HttpServletRequest 和HttpServletResponse 被传递给 execute 方法。
Struts2 Action 不依赖于容器,允许 Action 脱离容器单独被测试。
如果需要,Struts2Action 仍然可以访问初始的 request 和 response。
但是,其他的元素减少或者消除了直接访问 HttpServetRequest 和 HttpServletResponse 的必要性。
4.可测性 测试 Struts1 Action 的一个主要问题是 execute()方法暴露了 servlet API(这使得测试要依赖于容器)。
为了脱离 Web 容器测试 Struts1 的 Action,必须借助于第三方扩展 Struts TestCase--提供了一套 Struts1 的模拟对象(来进行测试)。
Struts2 Action 可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。
5.捕获输入 Struts1 使用 ActionForm 对象捕获输入。
所有的 ActionForm 必须继承一个基类。
因为其他 JavaBean 不能用作 ActionForm,开发者经常创建多余的类捕获输入。
动态 Bean(DynaBeans)可以作为创建传统 ActionForm 的选择,但是,开发者可能是在重新描述创建已经存在的 JavaBean(仍然会导致有冗余的 javabean)。
Struts2 直接使用 Action 属性作为输入属性,消除了对第二个输入对象的需求。
输 Action 属性能够通过 web 页面上的 taglibs入属性可能是有自己子属性的 rich 对象类型。
访问。
Struts2 也支持 ActionForm 模式。
rich 对象类型,包括业务对象,能够用作输入/输出对象。
这种 ModelDriven 特性简化了 taglib 对 POJO 输入对象的引用。
6.表达式语言 Struts1 整合了 JSTL, 这 因此使用 JSTL 表达式语言。
种 表达式语言有基本对象图遍历,但是对集合和索引属性的支持很弱。
Struts2 可以使用 JSTL,但是也支持一个更强大和灵活的表达式语言--ObjectGraph Notation Language OGNL。
7.绑定值到页面(view) Struts1 使用标准
JSP 机制把对象绑定到页面中来访问。
Struts2 使用 ValueStack 技术,使标签库能够访问值而不需要把你的页面(view)和对象绑定起来。
ValueStack 策略允许通过一系列名称相同但类型不同的属性重用页面(view)。
8.类型转换 Struts1ActionForm 属性通常都是 String 类型。
Struts1 使用 Commons-Beanutils 进行类型转换。
每个类一个转换器,对每一个实例来说是不可配置的。
Struts2 使用 OGNL 进行类型转换。
提供基本和常用对象的转换器。
9.校验 Struts1 支持在 ActionForm 的 validate 方法中手动校验,或者通过 Commons Validator的扩展来校验。
同一个类可以有不同的校验内容,但不能校验子对象。
Struts2 支持通过 validate 方法和 XWork 校验框架来进行校验。
XWork 校验框架使用为属性类类型定义的校验和内容校验,来支持 chain 校验子属性。
10.Action 执行的控制 Struts1 支持每一个模块有单独的 Request Processors(生命周期),但是模块中的所有 Action 必须共享相同的生命周期。
Struts2 支持通过拦截器堆栈(Interceptor Stacks)为每一个 Action 创建不同的生命周期。
堆栈能够根据需要和不同的 Action 一起使用。
2.5struts2.0 的 MVC 模式与 struts1.0 的 MVC 模式区别 struts2 的 mvc 模式:当用户在页面提交用户请求时该请求需要提交给 struts2 的控制器处理。
struts2 的控制器根据处理结果决定将哪个页面呈现给客户端。
与 struts1 最大的不同是:struts2 的控制器。
struts2 的控制器不再像 struts1 的控制器需要继承一个 Action 父类甚至可以无需实现任何接口struts2 的 Action 就是一个普通的POJO(简单实体类)。
实际上,Struts2 的 Action 就是一个包含 execute 方法的普通 Java类该类里包含的多个属性用于封装用户的请求参数。
三、Struts 2 框架3.1 使用 Struts2.0 实现 MVC 一个请求在Struts 2框架被处理大致分为一下几个步骤,如图3.1所示: 图3.1 Struts 2工作机制(1)客户端初始化一个指向 Servlet 容器(例如 Tomcat)的请求;( 2 ) 这 个 请 求 经 过 一 系 列 的 过 滤 器 ( Filter ) ( 这 些 过 滤 器 中 有 一 个 叫 做ActionContextCleanUp 的可选过滤器,这个过滤器对于 Struts2 和其它框架的集成很有帮助,例如:SiteMesh Plugin);(3)接着 FilterDispatcher 被调用,FilterDispatcher 询问 ActionMapper 来决定这个请求是否需要调用某个 Action;(4)如果 ActionMapper 决定需要调用某个 Action,FilterDispatcher 把请求的处理交给ActionProxy;(5)ActionProxy 通过 Configuration Manager 询问框架的配置文件,找到需要调用的Action 类;(6)ActionProxy 创建一个 ActionInvocation 的实例;(7)ActionInvocation 实例使用命名模式来调用,在调用 Action 的过程前后,涉及到相关拦截器(Intercepter)的调用;(8)一旦 Action 执行完毕,ActionInvocation 负责根据 struts.xml 中的配置找到对应的返回 Result。
返回 Result 通常是(但不总是,也可能是另外的一个 Action 链)一个需要被表示的
JSP 或者 FreeMarker 的模版。
( 9 ) 如 果 要 在 返 回 Result 之 前 做 些 什 么 , 可 以 实 现 PreResultListener 接 口 ,PreResultListener 可以再 Interceptor 中实现,也可以在 Action 中实现。
(10)根据 Result 对象信息,生成用户响应信息 response,在生成响应过程中可以使用Struts2 框架中继承的标签,在这个过程中需要涉及到 ActionMapper。
从上述工作机制上可以看出 Struts2 的 MVC 模式分离了 model 和 view 层,其中 用 (数据模型) Java 程序Model (业务类) 用 来实现, (表示层)
JSP 来实现, View Controller 用(控制层) FilterDispatcher 和业务控制器 Action 来实现,这样的模式分离使代码更加清晰易读。
3.2 Struts 2 配置文件 Struts2配置文件是用户请求View和业务逻辑模块ModelAction之间联系的桥梁。
开发者可以通过修改Struts2的配置文件来快速适应业务需求它是整个Struts2的精髓之一。
当然熟悉Struts1和WebWork的框架的人对配置文件一定不会陌生同Struts1和WebWork 框 架 一 样 Struts2 框 架 配 置 文 件 也 分 为 XML 文 件 和 属 性 资 源 文 件 两 种 。
struts.xml文件中包含了Action 的定义以及Action的返回值对应的视图资源、命名空间等信息。
此外用户也可以定义自己的XML文件然后通过include指令将其包含到struts.xml文件中。
另一类配置文件是属性资源文件。
资源文件中一般采用固定的Key -Value形式用于.