现在的位置: 首页 > 综合 > 正文

Struts 2基础

2013年09月03日 ⁄ 综合 ⁄ 共 3702字 ⁄ 字号 评论关闭

 

2 Struts 2

此内容是《Java Web开发教程——入门与提高篇(JSP+Servlet)》一书附赠资料的一部分。

2.1概述

Struts现在分两个版本:Struts 1.XStruts 2.XStruts 1.X已经有很多年了,可以说非常流行,但是因为其他框架的快速发展以及自身存在的问题,Struts 2诞生了,Struts 2Struts 1的区别非常大,实际上Struts 2的核心思想是基于另外一个非常成功的Web框架WebWork。两者的区别如表20.1所示。下面主要针对Struts 2进行介绍。

2.1 Struts1Struts2的比较

Feature

Struts 1

Struts 2

Action

Struts 1中要求Action类继承抽象的基类。在Struts 1中一个普遍存在的问题就是面向抽象类编程,而不是面向接口编程。

Struts 2中的Action可以实现一个Action接口,同时可以实现其他的接口,这样可以使用户有选择性地使用其它自定义的服务。Struts 2提供了基础类ActionSupport,该类实现了一些通用的接口。Action接口不是必须的。任何具有execute方法的POJO对象都可以用作Struts 2Action对象。

线程模型

Struts 1Actions是单例的,因为只有一个类的实例来处理所有对这个Action的请求,所以必须是线程安全的。单例策略对Struts 1Action的能够完成的功能有很大限制,有些功能需要额外的努力才能完成。Action资源必须是线程安全的或者synchronized

Struts 2Action对象是为每个请求实例化的,因此没有线程安全的问题。(在实践中,Servlet容器会为每个请求生成多个throw-away对象,增加的对象不会对性能产生太大影响或者对垃圾回收产生影响)

Servlet依赖

Struts 1Action依赖Servlet API,因为当调用Actionexecute方法时需要传参数HttpServletRequestHttpServletResponse

Struts 2Action与容器不是紧密结合在一起的。多数情况下,servlet上下文被表示为Map对象,允许对Action进行独立的测试。如果需要,Struts 2Action仍然可以访问原始的requestresponse对象。 然而,其它框架元素可以减少或者消除对HttpServetRequest HttpServletResponse对象进行直接访问的必要。

可测试性

测试Struts 1 Action的一个主要障碍就是execute方法使用了Servlet API1个第三方扩展Struts TestCase,为Struts 1提供了一组模拟(mock)对象。

Struts 2Action可以通过实例化、设置属性和调用方法进行测试。依赖注入支持使测试更简单。

获取输入

Struts 1使用ActionForm对象来获取输入。像Action一样,所有的ActionForm必须继承一个基类。因为其它的JavaBean不能用作ActionForm,开发人员经常需要创建多余的类来获取输入。可以使用动态Form来替换传统的ActionForm类,但是开发人员同样可能需要重新描述已有的JavaBean

Struts 2使用Action的属性作为输入属性,不用创建第二个输入对象。输入属性可以是复杂的对象类型,还可以有自己的属性。可以在页面中通过taglib访问Action属性。Struts 2也支持ActionForm模式,以及POJO表单对象和POJO Action。复杂对象类型,包括业务或者域对象,都可以作为输入/输出对象。模型驱动的特性简化了标签库对POJO输入对象的引用。

表达式语言

Struts 1集成了JSTL,所以可以使用JSTLEL语言,EL提供了基本的对象结构遍历(object graph traversal),但是集合以及索引属性支持比较弱。

Struts 2可以使用JSTL,同时Struts还支持另外一种功能更强大、使用更灵活的表达式语言,这种语言是Object Graph Notation Language,简称 OGNL

值与视图的绑定

Struts 1使用了标准的JSP机制把对象与要访问的页面上下文绑定。

Struts 2使用了一种ValueStack技术,这样标签库不用把视图与要呈现的对象类型关联就可以访问值。ValueStack策略允许重用涉及多个类型的视图,这些类型可能有相同的属性名,但是属性类型不同。

类型转换

Struts 1ActionForm属性通常都是字符串类型。Struts 1 使用Commons-Beanutils进行类型转换。转换器是针对每个类的,而不能为每个实例配置。

Struts 2使用OGNL进行类型转换,框架包含了常用对象类型和基本数据类型的转换器。

验证

Struts 1支持手动验证,通过ActionFormvalidate方法或者通过继承通用的验证器来完成。对于同一个类可以有不同的验证上下文环境,但是不能链接到对子类型的验证。

Struts 2支持通过验证方法进行手工验证和XWork验证框架。Xwork验证框架支持对子属性的链接验证,使用为属性类型定义的验证规则和上下文。

Action执行的控制

Struts 1支持为每个模块提供独立的请求处理器(生命周期),但是同一个模块中的所有Action具有相同的生命周期。

Struts 2通过拦截器栈支持为每个Action创建不同的生命周期。必要的时候,可以使用不同的Actio创建和使用自定义栈。

注:来自Struts的官方网站:http://struts.apache.org/2.0.11.2/docs/comparing-struts-1-and-2.html

Strust 2结构图如图2.1(原图来自Strust 2文档)所示:

2.1 Struts2结构图

在处理一个请求的时候,主要使用3个类:ActionInterceptorResult

处理流程:

u  请求到达服务器之后,首先经过一系列过滤器,有的是可选的,最主要的过滤器是FilterDispatcher。所有的请求都会提交给它处理,该过滤器是在web.xml中配置的。配置代码如下:

    <filter>

        <filter-name>struts2</filter-name>

        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

    </filter>

 

    <filter-mapping>

        <filter-name>struts2</filter-name>

        <url-pattern>/*</url-pattern>

    </filter-mapping>

u  FilterDispatcher过滤器接收到请求之后调用ActionMapper查看是否需要调用ActionActionMapper提供了HttpRequestAction调用请求之间的映射关系,可以决定当前请求是否需要调用Action。如果ActionMapper返回的信息表明需要调用ActionFilterDispatcher过滤器把控制前交给ActionProxy

u  ActionProxy调用配置文件管理器ConfigurationManager,该管理器从struts.xml配置文件中获取配置信息,获取的信息主要包括当前请求对应哪个Action(对用户的请求进行处理),对应哪些Result(决定了如何对用户响应),有时候还涉及拦截器。然后根据这些信息创建ActionInvocation对象,该对象负责具体的调用过程。struts.xml是用户需要提供的最主要的配置文件。下面是一个struts.xml配置文件的部分内容。

<struts>

    <package name="default" extends="struts-default">

 

        <action name="Logon" class="mailreader2.Logon">

            <result name="input">/pages/Logon.jsp</result>

            <result name="cancel" type="redirectAction">Welcome</result>

            <result type="redirectAction">MainMenu</result>

            <result name="expired" type="chain">ChangePassword</result>

        </action>

 

        <action name="Logoff" class="mailreader2.Logoff">

抱歉!评论已关闭.