复旦大学软件学院oOAD课程期末报告 Action Context ctx= ActionContext getContexto ∥将当前登录的用户名保存到 Session Map session ctxgetSession(; session. put("username",getUsernameo) eturn suCCeSS: return LOGINFAIL 在上面的 Action代码中,我们看不到任何的 Servlet APl,当系统需要处理两个请求参数 surname和 password时, Action并未通过 Http servletrEquest对象来获得请求参数,而是直 接调用访问该 Action的 username和 password成员属性一一这两个属性由 Action拦截器负责 初始化,以用户请求参数为其赋值。 即使 Action中需要访问 Http Session对象,依然没有在代码中直接出现 Httpsession A Pl,而是以一个Map对象代表了 Http Session对象。 当我们将 WebWork的 Action和Suts1的 Action进行对比时,不难发现 Struts1的Ac tion确实太臃肿了,确实不如 Webwork的 Action那么优雅 如果需要测试上面的 Action代码,测试用例的书写将非常容易,因为 execute方法中没 有包含任何 Servlet API,甚至没有 WebWork的APl。 (2) Action无需与 WebWork耦合,代码重用率高 在上面的 Action代码中,不难发现 WebWork中的 Action其实就是一个POo,该 Actio n仅仅实现了 WebWork的 Action接口,包含了一个 execute方法 Struts1中的 Action类需要继承 Struts1的 Action类。我们知道,实现一个接口和继承 一个类是完全不同的概念:实现一个接口对类的污染要小得多,该类也可以实现其他任意接
复旦大学软件学院 OOAD 课程 期末报告 Introduction to Struts2.0 Page | 11 ActionContext ctx = ActionContext.getContext(); //将当前登录的用户名保存到 Session Map session = ctx.getSession(); session.put("username",getUsername()); return SUCCESS; } else { return LOGINFAIL; } } } 在上面的 Action 代码中,我们看不到任何的 Servlet API,当系统需要处理两个请求参数: username 和 password 时,Action 并未通过 HttpServletRequest 对象来获得请求参数,而是直 接调用访问该 Action 的 username 和 password 成员属性——这两个属性由 Action 拦截器负责 初始化,以用户请求参数为其赋值。 即使 Action 中需要访问 HTTP Session 对象,依然没有在代码中直接出现 HttpSession A PI,而是以一个 Map 对象代表了 HTTP Session 对象。 当我们将 WebWork 的 Action 和 Struts 1 的 Action 进行对比时,不难发现 Struts 1 的 Ac tion 确实太臃肿了,确实不如 WebWork 的 Action 那么优雅。 如果需要测试上面的 Action 代码,测试用例的书写将非常容易,因为 execute 方法中没 有包含任何 Servlet API,甚至没有 WebWork 的 API。 (2)Action 无需与 WebWork 耦合,代码重用率高 在上面的 Action 代码中,不难发现 WebWork 中的 Action 其实就是一个 POJO,该 Actio n 仅仅实现了 WebWork 的 Action 接口,包含了一个 execute 方法。 Struts 1 中的 Action 类需要继承 Struts 1 的 Action 类。我们知道,实现一个接口和继承 一个类是完全不同的概念:实现一个接口对类的污染要小得多,该类也可以实现其他任意接
复旦大学软件学院oOAD课程期末报告 口,还可以继承一个父类;但一旦已经继承一个父类,则意味着该类不能再继承其他父类。 除此之外, Struts1中 Action也包含了一个 execute方法,但该方法需要4个参数,类 型分别是 Action Mapping、 Action Form、 Http servletrEquest和 HttpservletreSponse,一个包 含了这4个参数的方法,除了在 Struts1框架下有用外,笔者难以想象出该代码还有任何复 用价值。但 WebWork的 execute方法则完全不同,该方法中没有出现任何 Servlet API,也 没有出现任何 WebWork apl,这个方法在任何环境下都有重用的价值。 得益于 WebWork灵巧的设计, WebWork中的 Action无需与任何 Servlet APl、 Web Wor kAP耦合,从而具有更好的代码重用率 (3)支持更多的表现层技术,有更好的适应性 正如从图18所见到的, Web Work对多种表现层技术:JsP、 Velocity和 FreeMarker等 都有很好的支持,从而给开发更多的选择,提供了更好的适应性 1.4 Struts2起源 经过六年多的发展, Struts1已经成为一个高度成熟的框架,不管是稳定性还是可靠性 都得到了广泛的证明。但由于它太“老”了,一些设计上的缺陷成为它的硬伤。面对大量新的 MvC框架蓬勃兴起, Struts1也开始了血液的更新。 目前, Struts已经分化成两个框架:第一个框架就是传统 Struts1和 WebWork结合后 的 Struts2框架。 Struts2虽然是在 Struts1的基础上发展起来的,但实质上是以 WebWork k为核心, Struts2为传统 Struts1注入了 WebWork的设计理念,统一了 Struts1和WebW ork两个框架,允许 Struts1和 WebWork开发者同时使用 Struts2框架。 Struts分化出来的另外一个框架是Shae,这个框架远远超出了 Struts1原有的设计思想, 它与原有的 Struts1的关联很少,它使用全新的设计思想。 Shale更像一个新的框架,而不 是 Struts的升级。Shae在很多方面与 Struts存在不同之处,其中有两点最为突出 Struts与JsF集成,而 Shale则是建立在]SF之上 Struts实质上是一个巨大的、复杂的请求处理器;而Shae则是一组能以任何方式进行 组合的服务,简单地说,Shae是一种SOA(面向服务架构)架构 在后面的介绍中,我们会发现, Struts2非常类似于 WebWork框架,而不像 Struts1
复旦大学软件学院 OOAD 课程 期末报告 Introduction to Struts2.0 Page | 12 口,还可以继承一个父类;但一旦已经继承一个父类,则意味着该类不能再继承其他父类。 除此之外,Struts 1 中 Action 也包含了一个 execute 方法,但该方法需要 4 个参数,类 型分别是 ActionMapping、ActionForm、HttpServletRequest 和 HttpServletResponse,一个包 含了这 4 个参数的方法,除了在 Struts 1 框架下有用外,笔者难以想象出该代码还有任何复 用价值。但 WebWork 的 execute 方法则完全不同,该方法中没有出现任何 Servlet API,也 没有出现任何 WebWork API,这个方法在任何环境下都有重用的价值。 得益于 WebWork 灵巧的设计,WebWork 中的 Action 无需与任何 Servlet API、WebWor k API 耦合,从而具有更好的代码重用率。 (3)支持更多的表现层技术,有更好的适应性 正如从图 1.8 所见到的,WebWork 对多种表现层技术:JSP、Velocity 和 FreeMarker 等 都有很好的支持,从而给开发更多的选择,提供了更好的适应性。 1.4 Struts 2 起源 经过六年多的发展,Struts 1 已经成为一个高度成熟的框架,不管是稳定性还是可靠性, 都得到了广泛的证明。但由于它太“老”了,一些设计上的缺陷成为它的硬伤。面对大量新的 MVC 框架蓬勃兴起,Struts 1 也开始了血液的更新。 目前,Struts 已经分化成两个框架:第一个框架就是传统 Struts 1 和 WebWork 结合后 的 Struts 2 框架。Struts 2 虽然是在 Struts 1 的基础上发展起来的,但实质上是以 WebWor k 为核心,Struts 2 为传统 Struts 1 注入了 WebWork 的设计理念,统一了 Struts 1 和 WebW ork 两个框架,允许 Struts 1 和 WebWork 开发者同时使用 Struts 2 框架。 Struts分化出来的另外一个框架是Shale,这个框架远远超出了Struts 1原有的设计思想, 它与原有的 Struts 1 的关联很少,它使用全新的设计思想。Shale 更像一个新的框架,而不 是 Struts 的升级。Shale 在很多方面与 Struts 存在不同之处,其中有两点最为突出: — Struts 与 JSF 集成,而 Shale 则是建立在 JSF 之上。 — Struts 实质上是一个巨大的、复杂的请求处理器;而 Shale 则是一组能以任何方式进行 组合的服务,简单地说,Shale 是一种 SOA(面向服务架构)架构。 在后面的介绍中,我们会发现,Struts 2 非常类似于 WebWork 框架,而不像 Struts 1
复旦大学软件学院oOAD课程期末报告 Introduction to struts 2.0 框架,因为 Struts2是以 WebWork为核心,而不是以 Struts1为核心的。正因为此,许多 WebWork开发者会发现,从 WebWork过渡到 Struts2是一件非常简单的事情 当然,对于传统的 Struts1开发者, Struts2也提供了很好的向后兼容性, Struts2可 与 Struts1有机整合,从而保证 Struts1开发者能平稳过渡到 Struts2。 2初窥 Struts2 Struts2的体系与 Struts1体系的差别非常大,因为 Struts2使用了 WebWork的设计核 心,而不是使用 Struts1的设计核心。 Struts2大量使用拦截器来处理用户请求,从而允许 用户的业务逻辑控制器与 Servlet apl分离。 2.1 Struts2框架架构 从数据流图上来看, Struts2与 WebWork相差不大, Struts2同样使用拦截器作为处理 ( Advice),以用户的业务逻辑控制器为目标,创建一个控制器代理。 控制器代理负责处理用户请求,处理用户请求时回调业务控制器的 execute方法,该方 法的返回值将决定了 Struts2将怎样的视图资源呈现给用户。 图19显示了 Struts2的体系概图。 Stus2的核心控制器 FilterDispatcher 拦截器1 拦截器2 拦截器3 Result 图19 Struts2的体系概图
复旦大学软件学院 OOAD 课程 期末报告 Introduction to Struts2.0 Page | 13 框架,因为 Struts 2 是以 WebWork 为核心,而不是以 Struts 1 为核心的。正因为此,许多 WebWork 开发者会发现,从 WebWork 过渡到 Struts 2 是一件非常简单的事情。 当然,对于传统的 Struts 1 开发者,Struts 2 也提供了很好的向后兼容性,Struts 2 可 与 Struts 1 有机整合,从而保证 Struts 1 开发者能平稳过渡到 Struts 2。 2 初窥 Struts2 Struts 2 的体系与 Struts 1 体系的差别非常大,因为 Struts 2 使用了 WebWork 的设计核 心,而不是使用 Struts 1 的设计核心。Struts 2 大量使用拦截器来处理用户请求,从而允许 用户的业务逻辑控制器与 Servlet API 分离。 2.1 Struts 2 框架架构 从数据流图上来看,Struts 2 与 WebWork 相差不大,Struts 2 同样使用拦截器作为处理 (Advice),以用户的业务逻辑控制器为目标,创建一个控制器代理。 控制器代理负责处理用户请求,处理用户请求时回调业务控制器的 execute 方法,该方 法的返回值将决定了 Struts 2 将怎样的视图资源呈现给用户。 图 1.9 显示了 Struts 2 的体系概图。 图 1.9 Struts 2 的体系概图
复旦大学软件学院oOAD课程期末报告 Introduction to struts 2.0 Struts2框架的大致处理流程如下 ①浏览器发送请求,例如请求/ mypage action、/ reports/ myreport. pdf等。 ②核心控制器 Filter Dispatcher根据请求决定调用合适的 Action。 ③ WebWork的拦截器链自动对请求应用通用功能,例如 workflow、 validation或文件上 传等功能 ④回调 Action的 execute方法,该 execute方法先获取用户请求参数,然后执行某种数 据库操作,既可以是将数据保存到数据库,也可以从数据库中检索信息。实际上,因为Act on只是一个控制器,它会调用业务逻辑组件来处理用户的请求 SAction的 execute方法处理结果信息将被输出到浏览器中,可以是HTML页面、图像, 也可以是PDF文档或者其他文档。此时支持的视图技术非常多,既支持JSP,也支持 Velocit y、 FreeMarker等模板技术。 在我们大致了解了 Struts2.0的体系结构之后,我们再来仔细看看一张详细的 结构图。 Struts Action ContextcleanUp Other filters(Site Mesh, etc) FilterDispatcher ActionProxy (Interceptor 1 Action Mapper interceptor 3 Tag Subsystem Configuration HTML Doo forms, ete Manager ActionAction Interceptor 3 JSP, Freemarker, velocity, e struts. xml or 2 HttpservletreSponse Servlet Filters Struts Core Interceptors User created
复旦大学软件学院 OOAD 课程 期末报告 Introduction to Struts2.0 Page | 14 Struts 2 框架的大致处理流程如下: 浏览器发送请求,例如请求/mypage.action、/reports/myreport.pdf 等。 核心控制器 FilterDispatcher 根据请求决定调用合适的 Action。 WebWork 的拦截器链自动对请求应用通用功能,例如 workflow、validation 或文件上 传等功能。 回调 Action 的 execute 方法,该 execute 方法先获取用户请求参数,然后执行某种数 据库操作,既可以是将数据保存到数据库,也可以从数据库中检索信息。实际上,因为 Act ion 只是一个控制器,它会调用业务逻辑组件来处理用户的请求。 Action 的 execute 方法处理结果信息将被输出到浏览器中,可以是 HTML 页面、图像, 也可以是 PDF 文档或者其他文档。此时支持的视图技术非常多,既支持 JSP,也支持 Velocit y、FreeMarker 等模板技术。 在我们大致了解了 Struts 2.0 的体系结构之后,我们再来仔细看看一张详细的 结构图
复旦大学软件学院oOAD课程期末报告 在此图中,当一个初始请求到达 Serve容器,它会经过一系统的标准fter链,这些 Filter链包括 Action ContextcleanUp filter:发挥作用当集成像 SiteMesh Plugin一类的技术,接着 FilterDispatcher被调用,通过轮询参考 Action Mapper决定一个请求和一个 Action相关连! 当 Action Mapper决定了一个 Action的调用, FilterDispatcher委托 Action Proxy控 制, ActionProxy参考框架的配置文件管理,接着, Action Pr。oxy生成一个 ActionInvocation,它 负责命令执行,这样调用任何拦截器先于调用 Action Acion执行完毕 Actioninvocation负责查找适当的结果以和 struts. xm中的 action result code相比较,结果一般是调用一个在JSP或 FreeMarker中绘制的模板! 22 Struts2的配置文件 Struts2相关的配置文件有 web. xml, struts. xm, struts, properties, struts-default. xml, velocity properties, struts-default vm. t"p web. xml, struts. xml 是必须的,其它的配置文件可选择。它们在Web应用中的功能和具体应用如下: 2.2.1 web.xm 包含所有必须的框架组件的web部署描述符。 web. xm文件对任何的Web项目都是 个必须的文件,使用 Struts时,还需要对该文件进行一些必须的配置 11 Action servlet的配置 般需要在该文件中配置 Struts的 Servlet,示例配置如下: Eg1.简单的 Struts的 Action Servlet的配置 <servlet> <servlet-class>org. apache struts action. Action Servlet</servlet-class> <param-name>config</param-name> <param-value>/WEB-INF/struts-config xml</param-value> </init-param> <init-param> <param-value>3</ param-value> </init-param <param-name>detail</param-name> param-value>3</param-valuc </init-para <load-on-startup>0</ load-on-startup> </servlet> <servlet-mapping>
复旦大学软件学院 OOAD 课程 期末报告 Introduction to Struts2.0 Page | 15 在此图中,当一个初始请求到达 Servlet 容器,它会经过一系统的标准 filter链,这些 Filter链包括 ActionContextCleanUp filter:发挥作用当集成像 SiteMesh Plugin 一类的技术,接着 FilterDispatcher 被调用,通过轮询参考 ActionMapper 决定一个请求和一个 Action 相关连! 当 ActionMapper 决定了一个 Action 的调用,FilterDispatcher 委托 ActionProxy 控 制,ActionProxy 参考框架的配置文件管理,接着,ActionProxy 生成一个 ActionInvocation,它 负责命令执行,这样调用任何拦截器先于调用 Action 一Acion执行完毕.ActionInvocation负责查找适当的结果以和struts.xml中的action result code 相比较,结果一般是调用一个在 JSP 或 FreeMarker 中绘制的模板! 2.2 Struts 2 的配置文件 Struts2 相关的配置文件有 web.xml,struts.xml,struts.properties, struts-default.xml,velocity.properties,struts-default.vm。其中 web.xml,struts.xml 是必须的,其它的配置文件可选择。它们在 web 应用中的功能和具体应用如下: 2.2.1 web.xml 包含所有必须的框架组件的 web 部署描述符。 web.xml 文件对任何的 Web 项目都是一 个必须的文件,使用 Struts 时,还需要对该文件进行一些必须的配置。 1.1 ActionServlet 的配置 一般需要在该文件中配置 Struts 的 Servlet,示例配置如下: Eg1. 简单的 Struts 的 ActionServlet 的配置: <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>3</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>3</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping>