18第2章初识Suts2 on na Re blic class Login( </action> struts..xml● ●带有注释的Java源文件 Struts2应用程序 动作 动作 动作 语出 登录 注册 结果 图2-1使用XML或者Java注解声明Struts2应用程序的架构 1.基于XML的声明性架构 很多开发人员已经熟悉了将XML用作声明性软件开发。Stus2允许你使用XML文件描述应 用程序需要的Suts2架构组件。通常情况下,XML文档中包含了表示应用程序组件的元素。代 码清单21展示了一个声明动作以及结果的XML元素的示例。 代码清单2-1XML声明性架构元素 class="manning.Login"> reault name="input">/Login.jap</result </action> m日ag18上xat10n#2 cresult>/Registration.jsp</result> </action> action me-"Register"class-"manning.Register"> <xeu1>R1Pu七”>/Reg1 atrat1ou
2.1声明性架构19 现在我们不会深入地讲解这些元素的细节,仅展示它作为一个XML风格的声明性架构看起 来是什么样子。通常情况下,一个应用程序有几个包含上述元素的XML文件,这些元素描述了 应用程序的所有组件。尽管大部分的应用程序都有多个XML文件,但是所有的这些文件就像 个大描述文件那样一起工作。框架使用一个专门的文件作为进入这个大描述文件的入口点,这个 2 入口点文件就是struts..xml文件。这个文件驻留在Java类路径(classpath)下,并且必须由开发人 员创建。虽然可以在struts.xml文件中声明所有的组件,但是为了应用程序模块化,开发人员通常 只用这个文件包含次级的XML文件。 在稍后介绍HelloWorld应用程序时,我们会实际看到基于XML的声明性架构 2.基于Java注解的声明性架构 注解是Java语言比较新的一个特性,它允许在Java源代码文件中直接添加元数据。Java注 解的一个更高级的用途是可以从Java类中读取元数据并且能够使用这些信息做有意义的事情。 Suts2以这种方式使用Java注解。如果你不想使用XML配置文件,声明性架构机制可以被配置为 扫描Java类以获得与Struts2相关的注解。当我们展示注解版本的Hello World应用程序时,会解释 框架如何找到应该扫描注解的Java类,稍后我们马上介绍。代码清单2-2展示了这些注解 代码清单2-2使用注解的声明性架构 ®Re8u1t8( 力Reau value-"/Registrationsuccesa.jsp" e-"/RegistrationSuccess.jsp" public class Login implements Action public String execute()( //Business logic for login 注意,这些注解必须写在那些实现动作的Java类上。代码清单2-2展示了Login类的代码,这 个类会作为Logi动作。就像与之对应的XML中的元素一样,这些注解包含了框架用来创建应用 程序运行时组件的元数据。 在本书中,我们会深入地讲解这些内容,并且读者很有必要去了解Logini动作在代码清单2-1 中的XML元素与在代码清单2-2中的注解之间的关系。在代码清单2-2中,元数据直接放在了 Login,java源代码中。很多人认为相对于ML机制来说基于注解的机制是-一个更优雅的解决方案。 最起码,注解机制与基于约定的信息推断紧密结合。换句话说,有些在XML元素中必须显式指 定的信息,可以从注解的类所隶属的Java包结构自动推断出来。例如,你不需要再指定Java类的 名字,因为它明确地隐含在注解的物理位置中。很多开发人员还很欣赏注解减少了多年以来在 Wb应用程序类路径下积累的XML文件的混乱状况。我们会在本章后续部分提供的第二个版本的 HelloWorld)应用程序中,展示基于注解的声明性架构的基础知识
20第2章初识Struts2 3.应该使用哪种方式 最终选择哪种方式米声明架构由开发人员决定。最重要的是要理解Suts2声明性架构的概 念。如果你理解这个概念,那么就可以轻松地在XML或者Java注解的机制之间转换。本书在示何例 应用程序中使用XML。我们这样做出于两个原因。第一,我们认为XML版本更适合学习框架。 很多的读者可能更熟悉XML文件,更重要的是,ML文件提供了更集中的应用程序组件的符号 这使得第一次学习框架的人更容易理解。第二,现在Java注解还是一个未来目标。Suts2开发人 员正在热切地朝着使用约定优于配置的零配置系统努力,在不需要遵守约定时,Java注解充当覆 盖这些约定的机制。很多开发人员已经开始使用这种方法了,但是我们认为,现在它不是学习框 架的最好方法。但是我们坚信,由于注解非常优雅,有很多开发人员最终会选择使用Java注解来 声明应用程序的组件。 2.1.3智能默认值 很多常用的Suts2组件(或者组件的属性)不需要开发人员声明。不管使用哪种配置风格, 这些组件或者属性设置已经被框架声明了,以便开发人员可以更快地实现应用程序功能的常用部 分。一些框架组件(如拦截器和结果类型)可能从来都不需要开发人员直接声明,因为系统提供 的这些组件能够处理大部分开发人员的日常需求。其他的一些组件(如动作组件和结果组件)需 要开发人员自己声明,但是很多常用属性设置可以继承框架的默认值。 定义智能默认值提供了内建的组件,在不需要开发人员更多配置的情况下,就可以解决常见 的领域工作流,从而允许以最小的开发工作量实现常见的应用程序功能。 这些预先定义的组件是Struts2智能默认值的一部分。如果你感兴趣,struts-default.xml中声明 了很多这样的组件,这个文件在struts2-core.jar中。这个文件使用XML格式声明了一系列的智能 默认组件,这个包就是struts-default。.在马上要开始的HelloWorld/应用程序以及本书剩余的 内容中,我们会学习如何使用这个默认包提供的组件。 2.2简单的HelloWorld示例 本节将提供两个HelloWorldI应用程序,一个使用XML,另一个使用注解。首先介绍XML版 本的应用程序,我们会研究XML的用法,讨论该应用程序在哪些方面体现了Suts2架构的先进 性。我们也会介绍Struts2应用程序的基本布局。之后我们重新审视使用注解实现的同一个应用程 序,届时将重点放在注解上。就像以前说过的那样,声明架构的两种风格只是同一个声明性架构 的两个接口,选择使用哪种配置风格与Struts2应用程序的功能无关。两个只有架构声明风格不同 的HelloWorld应用程序正好说明了这个事实。 2.2.1部署示例应用程序 部署应用程序,需要一个Servlet容器。这听起来简单,但实际上并非如此。作为本书的作者
2.2简单的HelloWorld示例21 我们觉得这是一个比较难解决的问题。因为Servlet容器都是根据Servlet规范构建的,所以使用哪 个都没有问题。简而言之,你只需要在Servlet容器中部署示例应用程序。具体选哪一个是你的 自由。有些书尝试带你了解特定Servlet容器的安装细节。问题是这永远不像他们声称的那么简单 此外,我们认为学会安装Servlet容器要比阅读任何特定容器的快速安装指南能获得更多的 2 知识。如果有Java Web应用程序开发的相关经验,那么你已经有了自己喜欢的Servlet容器,并 且已经知道如何在你选择的容器中部署应用程序。如果你刚接触Java Webl应用程序开发,你可 以花几个小时看一下在线文档,完成Servlet容器的安装过程。在运行的Servlet容器中安装Web 应用程序通常就像单击鼠标一样简单。至于如何选择Servlet?容器,对于新手来说我们推荐 Apache Tomcat,它无疑是最流行的Servlet规范的开源实现。读者可以非常容易地下载到Apache Tomcat,并且获得详细说明。 相对于选择Servlet容器来说,选择合适的IED(集成开发环境)和构建工具或许不是根本性 问题,但也同样重要。我们的目标是提供一个与DE、构建工具无关的示例应用程序。例如,我 们认为提供一个带有Tomcat目标(target)的Ant构建脚本会帮你节省一些时间,但是如果你不使 用Ant和Tomcat,那么这不但不会帮你,甚至有可能干扰你的进程。我们应该说明,像很多Java 开源社区一样,Struts2社区一直采用Maven2作为其构建和项目管理的工具。如果你计划深入地 理解Struts2的源代码,Maven的实际经验会很有帮助。 假如你己经有了Servlet容器,接下来要做的就是根据容器的要求部署示例应用程序的WAR 文件了。你可以从Manning网站上获得示例应用程序。本书中的所有示例代码都包含在一个Struts 2Web应用程序中。这个应用程序被打包在Struts22 InAction..war文件中。把这个Web应用程序部署 在Servlet容器之后,通过浏览器打开htp:/localhost:8080/Struts2:InAction/Mcnu.action就会看到示例 应用程序的主菜单。注意,这里假定示例应用程序被部署在本机,并且Servlet容器正在监听8080 端口。图2-2显示了菜单。 apter .Struts 2 Portfolio (Chapter 8) 图2-2示例应用程序被组织在几个迷你应用程序中 如图2-2所示,示例应用程序被组织在了一系列迷你应用程序中。在此,我们有两个版本的 Hello Worldf应用程序和许多不同版本的Struts2公文包应用程序。从技术上来看,所有的这些迷你 应用程序共同组成了一个大的Struts2应用程序。然而,框架的灵活性允许我们将所有章节的示例 代码都整洁地模块化,以便我们可以为每一章提供不同版本的应用程序。这样,我们可以提供涵 盖前些章节基本内容的公文包应用程序的一个简单版本,之后为后续章节提供一个全功能的版
22第2章初识Struts2 补充信息:独立的HelloWorld WAR:文件 在本书付梓之前,我们听取了本书预读项目参与者的建议,追加了一个独立的HelloWorld 示例应用程序的WAR文件。有些读者想看看HelloWorld/应用程序最简单的包结构,共他的一些 读者想看看最小的Suts2Web应用程序,为了满足这两部分人的需求,我们把基于XML的 Hello World应用程序分离出来做成了一个单独的应用程序,因此你会看到Manning网站上可下 载的代码中也包含了HelloWorld..war文件.这让你在未配置完整的应用程序依赖的数据库或者 其他资源的情况下也可以部署HelloWorld,应用程序。另外,它还提供了一个完美的基础结构, 便于开始构建你自己的应用. 注意,我们没有从主要的示例Web应用程序(Struts2 InAction.war)中删除HelloWorld应用 程序。为了方便读者,我们只是构造了另一个HelloWorld应用程序.在阅读本幸时,你可以使 用任何一个版本的程序,但一般我们假定你会使用完整的Struts2 nAction应用程序, Struts2Web应用程序的布局 整个Struts22 InAction..war文件可以作为模板来理解Struts2Web应用程序安排资源的方式。应 用程序结构的大部分需求来源于Servlet API)对所有Web应用程序施加的需求。图2-3展示了 Struts2 nAction.war文件展开的目录结构。 chapterEight p□chapterFive b□chapterOne chapterseven chapterThree menu 。□wEB-NF v□classes global-messages.properties struts.properties 目struts.axm p向b b□src web.xml index.html 图2-3Sus2示例应用程序展开的目录结构