Struts2 应该说是第二代实现 MVC 模式的 Web 项目开发框架。它是以拦截器先拦截 HTTP 请求,在进入 MVC 模式中的 C 也就是控制器部分前,对 HTTP 请求中包含的数据做校验,字符编码转化等等操作,由于这些操作和业务逻辑关系不是很大,所以提前做这些事情,也让控制器可以着重处理 HTTP 请求和业务逻辑之间转发、处理等控制功能的实现。这点就是体现了“松耦合”的开发理念,让 Web 项目各部分都发挥自己负责的功能,而不互相牵涉,互相纠缠。开发人员进行修改,新增等功开发时候也只需要关心被开发的部分,而不需要去关心其他部分。
Struts2 按照技术细节划分,主要分为以下几块。
l 标签库:在视图中运用这些标签来实现网页上各种格式的显示。
l 拦截器: HTTP 请求在进入控制器部分执行前先执行拦截器中的功能。
l FilterDispatcher 和 Action :接收 HTTP 请求,根据 Action 的 ActionMapper 决定调用 Action 哪些方法。
l Struts2 配置文件:定义控制转发流程,每个 Action 类的处理和结果数据如何导航到相应表示界面都由它定义。
l OGNL 和类型转化:在表示界面将包含数据的 Java 对象进行类型转化,显示出符合页面规则的数据格式。
l Struts2 校验规则:对数据输入的严格定义,保证没有垃圾数据和不符合项目需求的数据。
l 国际化和本地化:针对字符编码的转化,让 Web 项目显示各种语言版本。
l SiteMesh 页面布局:和以前的 IFrame 以及 Struts 中的 tiles 相类似的技术。使用插件式开发模式让其和 Struts2 形成一个完整实体,支持 Web 项目中页面布局。
下面笔者针对这些具体细节做一下初步概念的介绍,希望初学者或入门者能对 Struts2 有一个完整的认识。
1.2.1 标签库介绍
Struts2 的标签库和 Struts 的标签库一样,也是通过标签定义文件 , 也就是后缀名为 tld 的文件在 JSP 页面的定义,然后在 JSP 页面中调用这些标签进行表示层代码的开发。它主要分为下列这几大类。
l 控制标签:该类标签是用来控制那些在视图中最终显示的信息,也封装了在视图中有可能根据未来需求需要调用的数据集合。
l 数据标签:该类标签可以修改那些动态生成的数据信息,例如 Action 执行后的返回结果,本地化或国际化的文本,导航指向的 URL 和链接等等。而且该类标签还能为开发者提供调试信息。
l 表单标签:该类标签将原有 HTML 标签进行了封装,很多 HTML 标签都可以转为相应的表单标签,包括 CheckBox 、日期、下拉框等等。
l 非表单标签:该类标签虽然也是可以用来表单里,但和构成表单的标签不同。主要包含错误信息、树形菜单、选择页等等。
1.2.2 拦截器应用目的
之前也对拦截器有个初步的叙述,在 Struts2 框架执行 Action 之前拦截器对各种各样的操作都预先进行处理。这点也是 AOP 编程理念的一个实现,即对某个业务逻辑处理类或流程控制类执行之前或之后,预先或事后对一些和系统业务逻辑没有太大关系的功能进行处理。 AOP 中的术语称之为“ crosscut ”,中文可以翻译为“横切”。而且开发人员不再需要修改原有代码就能增加很多他们想实现的需求。各组件之间也很独立,如果系统有变化部分,也能很好的对涉及变化的组件进行修改而不影响到其他组件。其实所谓的“松耦合”也就是这样的概念。
Struts2 中使用拦截器的目的,笔者认为有如下几点:
l 在 Action 调用之前提供系统处理流程逻辑控制。也就是 Web 项目中从一个视图转向或导航到目标视图的逻辑控制。
l 和 Action 交互时,提供 Action 执行时候一些初始信息。比如和 Spring 整合时候,调用的一些被 Spring 容器管理的 JavaBean 类。或者是传入 Action 中的一切 request 、 session 中的数据。
l 在 Action 执行结束后,一些事后处理的流程逻辑也需要由拦截器实现。
l 修改 Action 中返回的 Result 信息,这样可以让系统导航到开发者需要它导航的目标视图。
l 捕获异常,保证让一些可供选择的流程被执行或者导航一些显示异常原因或错误信息的目标视图。
1.2.3 FilterDispatcher 和 Action 概述
Action 可以称之为 Struts2 的核心技术。每一个 URL 都可以被一个特殊的 Action 所映射。该 Action 是开发人员根据 Web 项目特定需求进行开发所实现的。
Action 中通过一个无参的 execute 方法来执行控制转向,并且返回一个 String 类型变量或者 Result 对象。当然也可以在 Struts.xml 文件里进行特殊指定方法名,这样就可以不用 execute 作为方法名,而是用开发人员自己指定的方法名。
如果返回的是一个 String 类型变量,相应的导航的目标视图是在 Struts.xml 配置文件里定义,配置文件把这个变量值和定义的目标视图名相匹配,这样系统就能正确导航到目标视图。
如果返回的是 Result 对象,因为 Struts2 本身支持返回结果是 Result 对象的映射导航,可是像 JSP 这种视图中显示的数据都是 Java 中的基本类型。这就涉及到类型转化概念,在 Struts2 中设计者也考虑到这一点,因此也提供了类型转化的机制,在稍后章节也会具体介绍。
在 Web 项目中,如果 HTTP 请求被 servlet 容器接收,然后导航到定义的目标视图时候,有可能在之前会有 Web 项目中定义个一个过滤器( Filter )对它进行处理。在 Struts2 中是由一个叫 FilterDispatcher 的类来执行该过滤器的 HTTP 请求处理功能。
FilterDispatcher 也是 Struts2 的一个核心技术,它提供了处理 HTTP 请求用来访问 Web 项目框架的访问方法。假设我们启动了某个 Web 项目,很多可设置的元素都已经在该 Web 项目框架中定义,例如 Spring 的可管理的 JavaBean 配置, Action 的映射定义等等。在此时 FilterDispatcher 会执行下列这些操作:
l 读取静态数据信息:比如某些文件或者 JavaScript 代码等等。
l 决定需要转发或导航的 Action 配置,举例说从 HTTP 请求中发出的目标视图的导航定义,一般在 Struts.xml 配置文件中都配置了 Action 名字,系统会根据 Action 配置去配置文件中寻找这个 Action 名字的 Action 。也就是说通过 FilterDispatcher 去搜寻后缀名为“ Action ”的所有 Action 映射。
l 创建 Action 的 Context :从 HTTP 请求中发出的数据信息都是存储在 request 或 session 中,而 Struts2 则封装了这些 HTTP 的对象,创建 Context 对象作为存储数据之处,并且通过 Context 的一些内置方法可以得到 HTTP 请求存储在 request 或 session 中的数据。
l 创建 Action 代理: Action 代理是一个附加的逻辑处理。它实际上包含了 Web 项目所有的配置和 Context 信息,用以来处理 HTTP 请求并包含请求处理完毕后哪些返回的 Result 对象。
l 内存清理和性能优化:为了确保在 Web 项目启动运行后,内存不会溢出,出现运行越来越慢的情况, FilterDispatcher 会自动执行清理动作,主要清理 Context 对象,保证系统中没有冗余对象或垃圾对象。
1.2.4 Struts2 配置文件处理
Struts2 的配置文件也是 Struts2 框架的核心技术。它主要将 Web 项目中一些属性和需要配置的机制以及 Web 页面导航流程控制都配置起来。
配置文件主要分为两个文件
l Struts.xml 文件:在该文件中主要对 Action 即 Struts2 的主要业务逻辑控制类进行配置,除此之外还对拦截器、 FreeMarker 等也可以做配置。
l Struts.properties 文件:该文件定义了 Web 项目整个应用程序范围的设置。并且对那些可以改变 Web 项目框架功能的配置参数进行配置定义。
1.2.5 OGNL 介绍和类型转换目的
OGNL 全称为 Object Graph Navigating Language ,翻译成中文就是对象导航图语言。该语言是一种表达式语言,但是它有它的绑定方式。同一个 OGNL 表达式可以用于得到或者设置 Java 对象的属性。其实就是简化了 Java 中的 getter 、 setter 方法。而且表达式除了显示、得到对象属性之外,表达式也被允许带有计算功能。在 Struts2 中使用 OGNL 的目的其实就是下面三个:
l OGNL 本身的类型转换机制允许视图中的值和数据进行类型装换。
l OGNL 能使有些数据源可以简单映射到视图中。
l OGNL 能将 web 组件和相应的 Java 对象绑定在一起。
Struts2 中的类型转换一方面需要 OGNL 来支持,另一方面由于它自带了类型转换器,其实开发者调用这些缺省设置的转换器配合 OGNL 一起使用就能实现类型转换。而且开发者还可以自己定义符合自己 Web 项目需求的类型转换器。之所以类型转换很大程度原因是视图技术上显示的值一般都是 String 类型,而在 Java 对象中的属性不一定都是 String 类型,因此有必要让视图上的值和 Java 对象中的属性可以进行双向的类型转换。除此之外,一些判断视图上值是否为空的操作处理啊,也需要类型转换才能定义空值或不空值时候的显示在视图上的值格式。
1.2.6 进行校验
通常开发者在开发自己的 Web 项目时候,针对即将被存储进数据库的一些数据会进行校验,保证数据库中的数据不是垃圾数据或者是不符合项目要求格式的数据。甚至在视图层对于用户在视图中输入的数据,有可能也有特定的数据格式要求,比如输入数据不能为空或者不能为特定字符这样的要求。 Struts2 提供了一个稳固而又健壮的校验机制,使用该机制能对 Struts2 中开发者开发的 Action 进行快速而又便捷的校验操作。
Struts2 中校验机制有一下几种实现方式:
l 通过 Struts.xml 和 Struts.properties 配置文件定义校验。
l 继承 ActionSupport 类,重写它的一些方法在 Java 代码中进行校验。
l 使用校验拦截器,或者开发者自己定义的校验拦截器类在视图上输入的数据还没有传递到 Action 控制层时候来对其进行校验。
1.2.7 Web 项目国际化根由
国际化即 internationalization ,因为在这个单词第一个字母 i 和最后一个字母 n 之间有 18 个字母,所以通常又被称为 i18n 。为什么在 Web 项目中要进行国际化,原因是世界上所有的国家和地区都是位于不同的区域,每个区域的文化互相之间不同,而两个不同国家或地区的开发者开发的项目必然收到文化、语言限制有多所不同,所以当一个国家或地区的开发者希望自己开发的 Web 项目可以共享给其他国家和地区的开发者,也就会需要进行国际化来解决这个文化、语言带来的问题。
国际化主要是针对语言和信息格式化进行处理。除了字符编码和语言之外,信息格式指的是文本、日期、时间、数据处理等信息的显示格式。
它还包含了一个本地化的问题,本地化也被称为 l10n ,原因和国际化称为 i18n 是一样的。举例说一个中国的开发者,需要把一个英语的 Web 项目改版成中文字符显示信息的 Web 项目,其本身对此的操作包括对前文提到的语言和信息格式的处理就是本地化。
在 Struts2 中,有两种进行国际化操作方式:
l 在 Struts.properties 文件中设置处理各种字符编码或者语言的属性文件。并由此扩展这些属性文件,让 Web 系统使用形成各种语言或信息格式化的配置信息。
l 直接装载 Struts2 提供的自带信息资源包
1.2.8 SiteMesh 页面布局框架简介
在 Struts 中对页面布局的开发工作都由 tiles 来解决,但在 Struts2 中,设计者使用了一个专门来进行页面布局的框架。因此严格说它不应该属于 Struts2 框架的,但是在 Web 项目中使用页面布局是无可厚非的一件事情,总不能 Struts2 不能页面布局吧?况且 tiles 在 Struts 中也使用的相当成功,如果 Struts2 中没有对页面布局技术的支持,那肯定会有反对的声音。而 SiteMesh 不仅仅是具有原先 tiles 的功能,它还支持了一些属于设计模式中装饰模式开发理念,开发者同样可以使用它对原有页面进行风格等的修改布置。有一点可以肯定的是它和 tiles 一样都增强了页面的复用性,因此如果使用 Struts2 开发 Web 项目,它也是不可或缺的。
SiteMesh 主要针对以下几点做了处理:
l 所有的 Web 项目页面的布局
l 所有的 Web 项目的链接处理
l 所有的 Web 项目页面风格一致性
更多信息请查看 java进阶网 http://www.javady.com