复旦大学软件学院oOAD课程期末报告 Introduction to struts 2.0 复旦大学软件学院OOAD课程 期末报告 Introduction to struts2.0 0461013吴玮杰 张力 0461109李婉蓉 0461111金薇薇 0461119徐晓蓉
复旦大学软件学院 OOAD 课程 期末报告 Introduction to Struts2.0 Page | 1 复旦大学软件学院 OOAD 课程 期末报告 Introduction to Struts2.0 0461013 吴玮杰 0461019 张 力 0461109 李婉蓉 0461111 金薇薇 0461119 徐晓蓉
复旦大学软件学院oOAD课程期末报告 Introduction to struts 2.0 目录 1引言 1.1 Struts2.0背景简介 12 Struts1简介及存在的问题… 337 13 WebWork简介 14 Struts2起源 2初窥 Struts2 2.1 Struts2框架架构 2.2 Struts2的配置文件… 2.2.1 web xml 2.2.2 Struts. xml 23 Strut2的标签库 598 24 Struts2与 Struts1的对比 2.5 WebWork和 Struts2对比 3深入理解 Struts2 31 Struts2的控制器组件 32拦截器( Interceptor) 321拦截器概述 32.2拦截器实现原理 323 Struts2中己有的拦截器 324配置和使用拦截器. 325自定义拦截器 326拦截器总结… ∴45 33转换器( Converter)… 331转换器概述 332 Struts2中已有的转换器 33.3批量封装对象(Bean)… 334转换错误处理. 335转换器总结 ∴55 4 Struts2与其他jde集成高阶应用 4.1IDE简介 4.2 Struts2与 Spring的集成 4.3Stts2与 CommonTemplate集成 44 Struts2与 click framework集成 4.5 Struts2、 spring2与 hibernate3集成
复旦大学软件学院 OOAD 课程 期末报告 Introduction to Struts2.0 Page | 2 目 录 1 引言 ..............................................................................................................................................3 1.1 Struts2.0 背景简介........................................................................................................3 1.2 Struts 1 简介及存在的问题 ..........................................................................................3 1.3 WebWork 简介................................................................................................................7 1.4 Struts 2 起源 ................................................................................................................12 2 初窥 Struts2...............................................................................................................................13 2.1 Struts 2 框架架构.........................................................................................................13 2.2 Struts 2 的配置文件 ....................................................................................................15 2.2.1 web.xml..................................................................................................................15 2.2.2 Struts.xml ...............................................................................................................19 2.3 Strut 2 的标签库.............................................................................................................28 2.4 Struts 2 与 Struts 1 的对比 .........................................................................................29 2.5 WebWork 和 Struts 2 对比 ..........................................................................................31 3 深入理解 Struts2.....................................................................................................................32 3.1 Struts 2 的控制器组件.................................................................................................32 3.2 拦截器(Interceptor) ....................................................................................................36 3.2.1 拦截器概述...........................................................................................................36 3.2.2 拦截器实现原理...................................................................................................37 3.2.3 Struts 2 中已有的拦截器 .....................................................................................37 3.2.4 配置和使用拦截器...............................................................................................40 3.2.5 自定义拦截器.......................................................................................................41 3.2.6 拦截器总结...........................................................................................................45 3.3 转换器(Converter).......................................................................................................46 3.3.1 转换器概述...........................................................................................................46 3.3.2 Struts 2 中已有的转换器 ..................................................................................49 3.3.3 批量封装对象 (Bean)..........................................................................................50 3.3.4 转换错误处理.......................................................................................................54 3.3.5 转换器总结...........................................................................................................55 4 Struts2 与其他 ide 集成高阶应用..........................................................................................56 4.1 IDE 简介........................................................................................................................56 4.2 Struts2 与 Spring 的集成 ............................................................................................56 4.3 Struts2 与 CommonTemplate 集成...........................................................................59 4.4 Struts2 与 click framework 集成 ...............................................................................62 4.5 Struts2、spring2 与 hibernate3 集成........................................................................63
复旦大学软件学院oOAD课程期末报告 1引言 11 Struts20背景简介 经过六年多的发展, Struts1己经成为了一个高度成熟的框架,不管是稳定性还 是可靠性都得到了广泛的证明。市场占有率超过20%,拥有丰富的开发人群,几 乎已经成为了事实上的工业标准。但是随着时间的流逝,技术的进步, Struts 的局限性也越来越多地暴露出来,并且制约了 Struts1的继续发展, Struts2以 WebWork优秀的设计思想为核心,吸收了 Struts1的部分优点,建立了一个兼容 WebWork和 Struts1的MvC框架, Struts2的目标是希望可以让原来使用 Struts1、 WebWork 的开发人员,都可以平稳过渡到使用 Struts2框架。 12 Struts1简介及存在的问题 从过去的岁月来看, Struts1是所有MC框架中不容辩驳的胜利者,不管是市场占有 率,还是所拥有的开发人群, Struts1都拥有其他MvC框架不可比拟的优势。 Struts1的成 功得益于它丰富的文档、活跃的开发群体。当然, Struts1是世界上第一个发布的MvC框 架: Struts1.0在2001年6月发布,这一点可能是使它得到如此广泛拥戴的主要原因。 为了使读者可以明白 Struts1的运行机制,下面将简要介绍 Struts1的基本框架。 Struts1框架以 Action Servlet作为核心控制器,整个应用由客户端请求驱动。当客户端 向web应用发送请求时,请求将被 Struts1的核心控制器 Action Servlet拦截, Action Servlet 根据请求决定是否需要调用业务逻辑控制器处理用户请求(实际上,业务逻辑控制器还是控 制器,它只是负责调用模型来处理用户请求),当用户请求处理完成后,其处理结果通过S P呈现给用户 对于整个 Struts1框架而言,控制器就是它的核心, Struts1的控制器由两个部分组成 核心控制器和业务逻辑控制器。其中核心控制器就是 Action Servlet,由 Struts1框架提供 业务逻辑控制就是用户自定义的 Action,由应用开发者提供 对于大部分用户请求而言,都需要得到服务器的处理。当用户发送一个需要得到服务器 处理的请求时,该请求被 Action Servlet拦截到, Action Servlet将该请求转发给对应的业务逻 辑控制器,业务逻辑控制器调用模型来处理用户请求:如果用户请求只是希望得到某个UR
复旦大学软件学院 OOAD 课程 期末报告 Introduction to Struts2.0 Page | 3 1 引言 1.1 Struts2.0 背景简介 经过六年多的发展,Struts1 已经成为了一个高度成熟的框架,不管是稳定性还 是可靠性都得到了广泛的证明。市场占有率超过 20%,拥有丰富的开发人群,几 乎已经成为了事实上的工业标准。但是随着时间的流逝,技术的进步,Struts1 的局限性也越来越多地暴露出来,并且制约了 Struts1 的继续发展。 Struts 2 以 WebWork 优秀的设计思想为核心,吸收了 Struts 1 的部分优点,建立了一个兼容 WebWork 和 Struts 1 的 MVC 框架,Struts 2 的目标是希望可以让原来使用 Struts 1、WebWork 的开发人员,都可以平稳过渡到使用 Struts 2 框架。 1.2 Struts 1 简介及存在的问题 从过去的岁月来看,Struts 1 是所有 MVC 框架中不容辩驳的胜利者,不管是市场占有 率,还是所拥有的开发人群,Struts 1 都拥有其他 MVC 框架不可比拟的优势。Struts 1 的成 功得益于它丰富的文档、活跃的开发群体。当然,Struts 1 是世界上第一个发布的 MVC 框 架:Struts 1.0 在 2001 年 6 月发布,这一点可能是使它得到如此广泛拥戴的主要原因。 为了使读者可以明白 Struts 1 的运行机制,下面将简要介绍 Struts 1 的基本框架。 Struts 1 框架以 ActionServlet 作为核心控制器,整个应用由客户端请求驱动。当客户端 向 Web 应用发送请求时,请求将被 Struts 1 的核心控制器 ActionServlet 拦截,ActionServlet 根据请求决定是否需要调用业务逻辑控制器处理用户请求(实际上,业务逻辑控制器还是控 制器,它只是负责调用模型来处理用户请求),当用户请求处理完成后,其处理结果通过 JS P 呈现给用户。 对于整个 Struts 1 框架而言,控制器就是它的核心,Struts 1 的控制器由两个部分组成: 核心控制器和业务逻辑控制器。其中核心控制器就是 ActionServlet,由 Struts 1 框架提供; 业务逻辑控制就是用户自定义的 Action,由应用开发者提供。 对于大部分用户请求而言,都需要得到服务器的处理。当用户发送一个需要得到服务器 处理的请求时,该请求被 ActionServlet 拦截到,ActionServlet 将该请求转发给对应的业务逻 辑控制器,业务逻辑控制器调用模型来处理用户请求;如果用户请求只是希望得到某个 UR
复旦大学软件学院oOAD课程期末报告 Introduction to struts 2.0 L资源,则由 Action Servlet将被请求的资源转发给用户 Struts1的程序运行流程如图17所示 mTTP请求 核心控制器 转发请求 业务逻辑控制器 客户端浏览器 转发请求 调用业务逻辑方法 Struts. xml HP响应 图1.7 Struts1的程序运行流程 下面就 Struts1程序流程具体分析MVC中的三个角色。 (1)Mode部分 Struts1的Mode部分主要由底层的业务逻辑组件充当,这些业务逻辑组件封装了底层 数据库访问、业务逻辑方法实现。实际上,对于一个成熟的企业应用而言,Mode部分也不 是一个简单的 Java bean所能完成的,它可能是一个或多个EB组件,可能是一个 WebServic e服务。总之,Mode部分封装了整个应用的所有业务逻辑,但整个部分并不是由 Struts1 提供的, Struts1也没有为实现Mode组件提供任何支持 (2)view部分 Struts1的view部分采用JsP实现。 Struts1提供了丰富的标签库,通过这些标签库可 以最大限度地减少脚本的使用。这些自定义的标签库可以输出控制器的处理结果。 虽然 Struts1提供了与Tes框架的整合,但 Struts1所支持的表现层技术非常单一:既 不支持 FreeMarker、 Velocity等模板技术,也不支持 Jasper Reports等报表技术。 (3) Controller部分 Struts1的 Controller由两个部分组成。 系统核心控制器:由 Struts1框架提供,就是系统中的 Action Servlet 业务逻辑控制器:由 Struts1框架提供,就是用户自己实现的 Action实例 Struts1的核心控制器对应图1.7中的核心控制器( Action Servlet)。该控制器由 Struts 1框架提供,继承 Httpservlet类,因此可以配置成一个标准的 Servlet,该控制器负责拦截所 有HTP请求,然后根据用户请求决定是否需要调用业务逻辑控制器,如果需要调用业务逻 辑控制器,则将请求转发给 Action处理,否则直接转向请求的JsP页面
复旦大学软件学院 OOAD 课程 期末报告 Introduction to Struts2.0 Page | 4 L 资源,则由 ActionServlet 将被请求的资源转发给用户。 Struts 1 的程序运行流程如图 1.7 所示。 图 1.7 Struts 1 的程序运行流程 下面就 Struts 1 程序流程具体分析 MVC 中的三个角色。 (1)Model 部分 Struts 1 的 Model 部分主要由底层的业务逻辑组件充当,这些业务逻辑组件封装了底层 数据库访问、业务逻辑方法实现。实际上,对于一个成熟的企业应用而言,Model 部分也不 是一个简单的 JavaBean 所能完成的,它可能是一个或多个 EJB 组件,可能是一个 WebServic e 服务。总之,Model 部分封装了整个应用的所有业务逻辑,但整个部分并不是由 Struts 1 提供的,Struts 1 也没有为实现 Model 组件提供任何支持。 (2)View 部分 Struts 1 的 View 部分采用 JSP 实现。Struts 1 提供了丰富的标签库,通过这些标签库可 以最大限度地减少脚本的使用。这些自定义的标签库可以输出控制器的处理结果。 虽然 Struts 1 提供了与 Ties 框架的整合,但 Struts 1 所支持的表现层技术非常单一:既 不支持 FreeMarker、Velocity 等模板技术,也不支持 JasperReports 等报表技术。 (3)Controller 部分 Struts 1 的 Controller 由两个部分组成。 — 系统核心控制器:由 Struts 1 框架提供,就是系统中的 ActionServlet。 — 业务逻辑控制器:由 Struts 1 框架提供,就是用户自己实现的 Action 实例。 Struts 1 的核心控制器对应图 1.7 中的核心控制器(ActionServlet)。该控制器由 Struts 1 框架提供,继承 HttpServlet 类,因此可以配置成一个标准的 Servlet,该控制器负责拦截所 有 HTTP 请求,然后根据用户请求决定是否需要调用业务逻辑控制器,如果需要调用业务逻 辑控制器,则将请求转发给 Action 处理,否则直接转向请求的 JSP 页面
复旦大学软件学院oOAD课程期末报告 Introduction to struts 2.0 业务逻辑控制器负责处理用户请求,但业务逻辑控制器本身并不具有处理能力,而是调 用Mode来完成处理。 Struts1提供了系统所需要的核心控制器,也为实现业务逻辑控制器提供了许多支持 因此,控制器部分就是 Struts1框架的核心。有时候,我们直接将MVC层称为控制器层。 提示对于任何的MVC框架而言,其实只实现了C(控制器)部分,但它负责用控制器 调用业务逻辑组件,并负责控制器与视图技术(JsP、 FreeMarker和 Velocity等)的整 对于 Struts1框架而言,因为它与JsP/ Servlet耦合非常紧密,因而导致了许多不可避免 的缺陷,随着web应用的逐渐扩大,这些缺陷逐渐变成制约 Struts1发展的重要因素- 这也是 Struts2出现的原因。下面具体分析 Struts1中存在的种种缺陷。 (1)支持的表现层技术单一 Struts1只支持JsP作为表现层技术,不提供与其他表现层技术,例如 Velocity、FreM arker等技术的整合。这一点严重制约了 Struts1框架的使用,对于目前的很多 Java EE应用 而言,并不一定使用JsP作为表现层技术 虽然 Struts1处理完用户请求后,并没有直接转到特定的视图资源,而是返回一个Acti on Forward对象(可以理解 Action Forward是一个逻辑视图名),在 struts- config.xm|文件中定 义了逻辑视图名和视图资源之间的对应关系,当 Action Servlet得到处理器返回的 Action For word对象后,可以根据逻辑视图名和视图资源之间的对应关系,将视图资源呈现给用户。 从上面的设计来看,不得不佩服 Struts1的设计者高度解耦的设计:控制器并没有直接 执行转发请求,而仅仅返回一个逻辑视图名一一实际的转发放在配置文件中进行管理。但因 为 Struts1框架出现的年代太早了,那时候还没有 FreeMarker、 Velocity等技术,因而没有 考虑与这些 FreeMarker、 Velocity等视图技术的整合。 L提示 Struts1已经通过配置文件管理逻辑视图名和实际视图之间的对应关系,只是没 有做到让逻辑视图名可以支持更多的视图技术。 虽然 Struts1有非常优秀的设计,但由于历史原因,它没有提供与更多视图技术的整合, 这严重限制了 Struts1的使用
复旦大学软件学院 OOAD 课程 期末报告 Introduction to Struts2.0 Page | 5 业务逻辑控制器负责处理用户请求,但业务逻辑控制器本身并不具有处理能力,而是调 用 Model 来完成处理。 Struts 1 提供了系统所需要的核心控制器,也为实现业务逻辑控制器提供了许多支持。 因此,控制器部分就是 Struts 1 框架的核心。有时候,我们直接将 MVC 层称为控制器层。 提示 对于任何的 MVC 框架而言,其实只实现了 C(控制器)部分,但它负责用控制器 调用业务逻辑组件,并负责控制器与视图技术(JSP、FreeMarker 和 Velocity 等)的整 合。 对于 Struts 1 框架而言,因为它与 JSP/Servlet 耦合非常紧密,因而导致了许多不可避免 的缺陷,随着 Web 应用的逐渐扩大,这些缺陷逐渐变成制约 Struts 1 发展的重要因素—— 这也是 Struts 2 出现的原因。下面具体分析 Struts 1 中存在的种种缺陷。 (1)支持的表现层技术单一 Struts 1 只支持 JSP 作为表现层技术,不提供与其他表现层技术,例如 Velocity、FreeM arker 等技术的整合。这一点严重制约了 Struts 1 框架的使用,对于目前的很多 Java EE 应用 而言,并不一定使用 JSP 作为表现层技术。 虽然 Struts 1 处理完用户请求后,并没有直接转到特定的视图资源,而是返回一个 Acti onForward 对象(可以理解 ActionForward 是一个逻辑视图名),在 struts‐config.xml 文件中定 义了逻辑视图名和视图资源之间的对应关系,当 ActionServlet 得到处理器返回的 ActionFor word 对象后,可以根据逻辑视图名和视图资源之间的对应关系,将视图资源呈现给用户。 从上面的设计来看,不得不佩服 Struts 1 的设计者高度解耦的设计:控制器并没有直接 执行转发请求,而仅仅返回一个逻辑视图名——实际的转发放在配置文件中进行管理。但因 为 Struts 1 框架出现的年代太早了,那时候还没有 FreeMarker、Velocity 等技术,因而没有 考虑与这些 FreeMarker、Velocity 等视图技术的整合。 提示 Struts 1 已经通过配置文件管理逻辑视图名和实际视图之间的对应关系,只是没 有做到让逻辑视图名可以支持更多的视图技术。 虽然 Struts 1 有非常优秀的设计,但由于历史原因,它没有提供与更多视图技术的整合, 这严重限制了 Struts 1 的使用
复旦大学软件学院oOAD课程期末报告 (2)与 Servlet API严重耦合,难于测试 因为 Struts1框架是在 Model2的基础上发展起来的,因此它完全是基于 Servlet API 的,所以在 Struts1的业务逻辑控制器内,充满了大量的 Servlet API。 看下面的 Action代码片段: ∥/业务逻辑控制器必须继承 Struts1提供的Acon类 public dass LoginAction extends Action ∥处理用户请求的 execute方法 public ActionForward execute(ActionMapping mapping, Action Form form, Http servletrEquest request ervletResponse response )throws AuctionException 获取封装用户请求参数的 Action Form对象 /将其强制类型转换为登录用的 Action Form LoginForm login Form =Login)form ∥/当用户名为scot密码为 tiger时返回成功 if (scott equals( login Form. getUsername( & tiger".equals(login Form. getPasswordo) ∥0处理成功,返回一个 Action Forward对象 eturn mapping find Forward(success"); ∥处理失败,返回一个 Action Forward对象 eturn mapping find Forward("success 当我们需要测试上面 Action类的 execute方法时,该方法有4个参数: Action Mapping、 Action Form、 HttpservletreQuest和 Http Servletresponse,初始化这4个参数比较困难,尤其 是 HttpservletreqUest和 HttpservletresPonse两个参数,通常由Web容器负责实例化 因为 Http servletrEquest和 Http Servletresponse两个参数是 Servlet APl,严重依赖于We b服务器。因此,一旦脱离了Web服务器, Action的测试非常困难。 (3)代码严重依赖于 Struts1APl,属于侵入式设计 正如从上面代码片段中所看到的, Struts1的 Action类必须继承 Struts1的 Action基类
复旦大学软件学院 OOAD 课程 期末报告 Introduction to Struts2.0 Page | 6 (2)与 Servlet API 严重耦合,难于测试 因为 Struts 1 框架是在 Model 2 的基础上发展起来的,因此它完全是基于 Servlet API 的,所以在 Struts 1 的业务逻辑控制器内,充满了大量的 Servlet API。 看下面的 Action 代码片段: //业务逻辑控制器必须继承 Struts 1 提供的 Action 类 public class LoginAction extends Action { //处理用户请求的 execute 方法 public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)throws AuctionException { //获取封装用户请求参数的 ActionForm 对象 //将其强制类型转换为登录用的 ActionForm LoginForm loginForm = (LoginForm)form; //当用户名为 scott,密码为 tiger 时返回成功 if ("scott".equals(loginForm.getUsername() && "tiger".equals(loginForm.getPassword()) { //处理成功,返回一个 ActionForward 对象 return mapping.findForward("success"); } else { //处理失败,返回一个 ActionForward 对象 return mapping.findForward("success"); } } } 当我们需要测试上面 Action 类的 execute 方法时,该方法有 4 个参数:ActionMapping、 ActionForm、HttpServletRequest 和 HttpServletResponse,初始化这 4 个参数比较困难,尤其 是 HttpServletRequest 和 HttpServletResponse 两个参数,通常由 Web 容器负责实例化。 因为 HttpServletRequest 和 HttpServletResponse 两个参数是 Servlet API,严重依赖于 We b 服务器。因此,一旦脱离了 Web 服务器,Action 的测试非常困难。 (3)代码严重依赖于 Struts 1 API,属于侵入式设计 正如从上面代码片段中所看到的,Struts 1 的 Action 类必须继承 Struts 1 的 Action 基类
复旦大学软件学院oOAD课程期末报告 Introduction to struts 2.0 实现处理方法时,又包含了大量 Struts1APl:如 Action Mapping、 Action Form和 Action For ward类。这种侵入式设计的最大弱点在于,一旦系统需要重构时,这些 Action类将完全没 有利用价值,成为一堆废品 可见, Struts1的 Action类这种侵入式设计导致了较低的代码复用。 13 Webwork简介 WebWork虽然没有 Struts1那样赫赫有名,但也是出身名门, WebWork来自另外一个 优秀的开源组织: opensymphony,这个优秀的开源组织同样开发了大量优秀的开源项目, 如 Qutarz、 OSWork Flow等。实际上, WebWork的创始人则是另一个Java领域的名人:Rick ard Oberg(他就是 JBoss和 XDoclet的作者)。 相对于 Struts1存在的那些先天性不足而言, WebWork则更加优秀,它采用了一种更 加松耦合的设计,让系统的 Action不再与 Servlet ap耦合。使单元测试更加方便,允许系 统从B/S结构向C/S结构转换。 相对于 Struts1仅支持JsP表现层技术的缺陷而言, WebWork支持更多的表现层技术, 如 Velocity、 FreeMarker和XsLT等。 WebWork可以脱离Web应用使用,这一点似乎并没有太多优势,因为,一个应用通常 开始已经确定在怎样的环境下使用。 WebWork有自己的控制反转( Inversion of contro)容 器,通过控制反转,可以让测试变得更简单,测试中设置实现服务接口的Mock对象完成测 试,而不需要设置服务注册。 WebWork2使用OGNL这个强大的表达式语言,可以访问值栈。OGNL对集合和索引属 性的支持非常强大。 WebWork建立在 WOrk之上,使用 ServletDispatcher作为该框架的核心控制器,处理H TTP的响应和请求。 从处理流程上来看, WebWork与 Struts1非常类似,它们的核心都由控制器组成,其 中控制器都由两个部分组成 核心控制器 ServletDispatcher,该控制器框架提供 业务逻辑控制器 Action,该控制器由程序员提供
复旦大学软件学院 OOAD 课程 期末报告 Introduction to Struts2.0 Page | 7 实现处理方法时,又包含了大量 Struts 1 API:如 ActionMapping、ActionForm 和 ActionFor ward 类。这种侵入式设计的最大弱点在于,一旦系统需要重构时,这些 Action 类将完全没 有利用价值,成为一堆废品。 可见,Struts 1 的 Action 类这种侵入式设计导致了较低的代码复用。 1.3 WebWork 简介 WebWork 虽然没有 Struts 1 那样赫赫有名,但也是出身名门,WebWork 来自另外一个 优秀的开源组织:opensymphony,这个优秀的开源组织同样开发了大量优秀的开源项目, 如 Qutarz、OSWorkFlow 等。实际上,WebWork 的创始人则是另一个 Java 领域的名人:Rick ard Oberg(他就是 JBoss 和 XDoclet 的作者)。 相对于 Struts 1 存在的那些先天性不足而言,WebWork 则更加优秀,它采用了一种更 加松耦合的设计,让系统的 Action 不再与 Servlet API 耦合。使单元测试更加方便,允许系 统从 B/S 结构向 C/S 结构转换。 相对于 Struts 1 仅支持 JSP 表现层技术的缺陷而言,WebWork 支持更多的表现层技术, 如 Velocity、FreeMarker 和 XSLT 等。 WebWork 可以脱离 Web 应用使用,这一点似乎并没有太多优势,因为,一个应用通常 开始已经确定在怎样的环境下使用。WebWork 有自己的控制反转(Inversion of Control)容 器,通过控制反转,可以让测试变得更简单,测试中设置实现服务接口的 Mock 对象完成测 试,而不需要设置服务注册。 WebWork 2 使用 OGNL 这个强大的表达式语言,可以访问值栈。OGNL 对集合和索引属 性的支持非常强大。 WebWork 建立在 XWork 之上,使用 ServletDispatcher 作为该框架的核心控制器,处理 H TTP 的响应和请求。 从处理流程上来看,WebWork 与 Struts 1 非常类似,它们的核心都由控制器组成,其 中控制器都由两个部分组成: — 核心控制器 ServletDispatcher,该控制器框架提供。 — 业务逻辑控制器 Action,该控制器由程序员提供
复旦大学软件学院oOAD课程期末报告 Introduction to struts 2.0 相对 Struts1的 Action与 Servlet Ap紧紧耦合的弱点来说, Web Work的 Action则完全 与 Servlet API分离,因而该 Action更容易测试 ebWork的 Action可以与 Servlet APl分离,得益于它灵巧的设计,它使用一个拦截器 链,负责将用户请求数据转发到 Action,并负责将 Action的处理结果转换成对用户的响应。 当用户向web应用发送请求时,该请求经过 Action ContextCleanUp、 Site Mesh等过滤器 过滤,由 WebWork的核心控制器拦截,如果用户请求需要 WebWork的业务逻辑控制器处 理,该控制器则调用 Action映射器,该映射器将用户请求转发到对应的业务逻辑控制器。 值得注意的是,此时的业务逻辑控制器并不是开发者实现的控制器,而是 WebWork创建的 控制器代理。 创建控制器代理时, WebWork需要得到开发者定义的 xork xm配置文件,控制器代理 以用户实现的控制器作为目标,以拦截器链中的拦截器作为处理( Advice) 喜提示 WebWork中创建控制器代理的方式,就是一种AOP(面向切面编程)编程方式 只是这种AOP中的拦截器由系统提供,因此无需用户参与。如果读者需要获取更多关 于AOP编程的知识,请参阅AOP相关资料,或笔者所著的《spng2.0宝典》一书的 第6章。 开发者自己实现的业务逻辑控制器只是 WebWork业务控制器的目标一一这就是为什么 开发者自己实现的 Action可以与 Servlet ap分离的原因。当开发者自己的 Action处理完HT TP请求后,该结果只是一个普通字符串,该字符串将对应到指定的视图资源 指定的试图资源经过拦截器链的处理后,生成对客户端的响应输出。 上面整个过程的数据流图如图18所示。 与前面的 Struts1框架对比,不难发现 Webwork在很多地方确实更优秀。相对 Struts 1的种种缺点而言, WebWork存在如下优点
复旦大学软件学院 OOAD 课程 期末报告 Introduction to Struts2.0 Page | 8 相对 Struts 1 的 Action 与 Servlet API 紧紧耦合的弱点来说,WebWork 的 Action 则完全 与 Servlet API 分离,因而该 Action 更容易测试。 WebWork 的 Action 可以与 Servlet API 分离,得益于它灵巧的设计,它使用一个拦截器 链,负责将用户请求数据转发到 Action,并负责将 Action 的处理结果转换成对用户的响应。 当用户向 Web 应用发送请求时,该请求经过 ActionContextCleanUp、SiteMesh 等过滤器 过滤,由 WebWork 的核心控制器拦截,如果用户请求需要 WebWork 的业务逻辑控制器处 理,该控制器则调用 Action 映射器,该映射器将用户请求转发到对应的业务逻辑控制器。 值得注意的是,此时的业务逻辑控制器并不是开发者实现的控制器,而是 WebWork 创建的 控制器代理。 创建控制器代理时,WebWork 需要得到开发者定义的 xwork.xml 配置文件,控制器代理 以用户实现的控制器作为目标,以拦截器链中的拦截器作为处理(Advice)。 提示 WebWork 中创建控制器代理的方式,就是一种 AOP(面向切面编程)编程方式, 只是这种 AOP 中的拦截器由系统提供,因此无需用户参与。如果读者需要获取更多关 于 AOP 编程的知识,请参阅 AOP 相关资料,或笔者所著的《Spring 2.0 宝典》一书的 第 6 章。 开发者自己实现的业务逻辑控制器只是 WebWork 业务控制器的目标——这就是为什么 开发者自己实现的 Action 可以与 Servlet API 分离的原因。当开发者自己的 Action 处理完 HT TP 请求后,该结果只是一个普通字符串,该字符串将对应到指定的视图资源。 指定的试图资源经过拦截器链的处理后,生成对客户端的响应输出。 上面整个过程的数据流图如图 1.8 所示。 与前面的 Struts 1 框架对比,不难发现 WebWork 在很多地方确实更优秀。相对 Struts 1 的种种缺点而言,WebWork 存在如下优点:
复旦大学软件学院oOAD课程期末报告 HTTP请求 Web Work ActionContext CleanUp 其他过滤器(如 SitMesh等) Web Work的核心控制器: ServletDispather 调用 Action Action代理 L拦截1Actn映射器 拦截器2 配置管理器 Web Work标签库 拦截3 例如 HTML forms work xml 视图模板 颜色含义 拦截器 Free Marker Servlet过滤器 等等 拦截器 Webwork核心AP 开发者定义文件 拦截器 拦截器 HTTP响应 图1.8 WebWork的数据流图 (1) Action无需与 Servlet API耦合,更容易测试 相对于 Struts1框架中的 Action出现了大量 Servlet apl而言, WebWork的 Action更像 个普通Java对象,该控制器代码中没有耦合任何 Servlet apl。看下面的 Webwork的Acti 示例 public class LoginAction implements Action ∥/该字符串常量将作为 Action的返回值 private final static String LOGINFAIL="loginfail ∥1该Acon封装的两个请求参数
复旦大学软件学院 OOAD 课程 期末报告 Introduction to Struts2.0 Page | 9 图 1.8 WebWork 的数据流图 (1)Action 无需与 Servlet API 耦合,更容易测试 相对于 Struts 1 框架中的 Action 出现了大量 Servlet API 而言,WebWork 的 Action 更像 一个普通 Java 对象,该控制器代码中没有耦合任何 Servlet API。看下面的 WebWork 的 Acti on 示例: public class LoginAction implements Action { //该字符串常量将作为 Action 的返回值 private final static String LOGINFAIL="loginfail"; //该 Action 封装的两个请求参数
复旦大学软件学院oOAD课程期末报告 private String password private String username: / password请求参数对应的getr方法 public String getPasswordo return password / password请求参数对应的 setter方法 public void setPassword(string password) this password password / /username请求参数对应的 getter方法 public String getUsernameo return username / username请求参数对应的 setter方法 public void setUsername(String username) this username username ∥0处理用户请求的 execute方法 if ("yeeku".equalsIgnoreCase(getUsernameo) don) Page 10
复旦大学软件学院 OOAD 课程 期末报告 Introduction to Struts2.0 Page | 10 private String password; private String username; //password 请求参数对应的 getter 方法 public String getPassword() { return password; } //password 请求参数对应的 setter 方法 public void setPassword(String password) { this.password = password; } //username 请求参数对应的 getter 方法 public String getUsername() { return username; } //username 请求参数对应的 setter 方法 public void setUsername(String username) { this.username = username; } //处理用户请求的 execute 方法 public String execute() throws Exception { if ("yeeku".equalsIgnoreCase(getUsername()) && "password".equals(getPassword())) {