Struts 和 Tiles 辅助基于组件的开发(3)

Struts 和 Tiles 辅助基于组件的开发(3)

Hello, World:经改进的新的应用程序

现在,让我们研究刚才看到的 Web 应用程序示例中的 Struts 和 Tiles 版本。请执行下列步骤:

  1. 转至 EX2_INSTALL 目录。
  2. 编辑 build.xml 文件,为 struts.install.dir 和 tomcat.install.dir 填写适当的值。
  3. 输入 ant deploy 。这将把第二个示例应用程序构建到 WAR 文件中以备部署,然后将它部署至 Tomcat。如果看到关于无法复制文件的错误,请检查第 2 步以确保正确设置了 struts.install.dir 和 tomcat.install.dir 。
  4. 将 Web 浏览器指向 http://localhost:8080/ex2。您应该会看到“Hello, World”页面。

目录结构和文件的说明

在 EX2_INSTALL/src/web 目录下有不少文件,乍看起来可能会把人搞糊涂。以下是给大家的一些指导。
profileInput.jsp 和 profileOutput.jsp 页面是页面主体 panel3 的内容;它们驱动这一特殊应用程序。在 tiles-components 下有页面的各种组件,而在 tiles-layouts 下是有关布局的 HTML 代码。我喜欢这样的组织安排,因为这使得对不同的用户角色有不同的布局,并在一个中心位置中保存所有视图组件。Tiles 可以让您以您希望的任何方式安排文件,只要您在 tiles-defs.xml 文件中指定了如何组织事物,所以使用那些最适合于您工作的事物。

如果您已看过 EX2_INSTALL 目录,您很可能会说:“这里要做些什么呢?有好多文件。”与大多数强调更有序和结构化程度更高的技术一样,对于 Struts 和 Tiles,在一开始需要在管理文件上花些工夫。对于只有少许页面的小项目,这一额外开销可能微不足道。然而,随着项目变大,Struts 和 Tiles 方法逐渐会显示其优越性。让我们一点点地体会吧!这里我不想讨论 EX2_INSTALL/src/WEB-INF/web.xml;尽管这个文件实质上与其示例 1 中相对应的文件不同,而且大多数行都是样板,但理解这些设置对于着手开发并不太重要。

在 EX2_INSTALL/src/WEB-INF/struts-config.xml 中,自先前有关 Struts 的文章以来重要的更改有在 <form-beans/> 节中 DynaActionForm 的使用及在 <action-mappings/> 节中 tile 作为目标的使用。在 Struts 的以前版本中,您必须为每个所使用的表单 bean 定义一个 Java 类。仅当不同的 HTML 表单共享域时,才可以在这些表单之间共享表单 bean。总之,每个表单 bean 需要有一个 Java 类是一个非常麻烦的要求。现在,您可以在 struts-config.xml 文件中指定表单 bean 的特性,而且是 迅速地! 不必有保存 Java 类的单独文件,就能自动创建这种 bean。象处理 Hashtable 对象一样,用值的强类型对象来处理动态表单 bean。至于操作映射,一旦确定将 Tiles 库合并到 Struts 分发版之后,那么指定一个 tile 作为目标,就完全是增加一项逻辑而已。您会在概要信息表单的操作映射中看到 tile 目标(tile.profileInput 和 tile.profileOutput)。在 input 属性和 path 属性中指定 tile。注:可以指定 tile 目标弥补了我在分析以页面为中心的模型中提到的更改文件名和位置中的缺陷:tile 目标是虚拟名称或逻辑名称,而不是物理名称。

现在,进入激动人心的部分。让我们看一下 EX2_INSTALL/src/WEB-INF/tiles-defs.xml。

在 <definition/> 标记中指定 tile。您可以将定义命名为任何希望的名称,而且 name 属性不必是与 path 属性匹配的子字符串。我为第一个定义选择了名称 rootLayout ,以表明它是应用程序中的页面要遵循的基本布局。注:路径是 /tiles-layout/rootLayout.jsp。如果查看 EX2_INSTALL/src/web 下的 /tiles-layout/rootLayout.jsp,您会看到这种布局是多么的简单整齐。用户界面的设计人员会“爱上它”。还请注意:它不包含任何代码,所以用户界面设计人员在进行更改时不必担心破坏什么。

rootLayout.jsp 中的 <tiles:insert/> 标记对应于 tiles-defs.xml 中 rootLayout 定义内的 <put/> 标记。注:每个 <tiles:insert attribute="x"/> 标记都有一个表示逻辑名称的属性。每个逻辑名称映射至通过在 tiles-defs.xml 内的 <definition/> 中使用 <put name="x" value="http://www.clde.net/program/java/index10/y"/> 标记指定的名称和值。通过在 rootLayout.jsp 页面中使用逻辑名称,而非物理名称,并通过在 tiles-defs.xml 中统一物理名称,我们就可以更改文件名,并使项目文件系统的组织易于管理。

真正节省时间和适应性方面最显著的增强方面体现在布局的继承,这是 Struts 的另一个特性。在 tiles-defs.xml 中,“Page definitions”栏下面的节有两个页面:tile.profileInput 和 tile.profileOutput。这些名称是任意的,如果您不喜欢 tile. 前缀,可以不使用它(但是您使用的名称必须与 struts-config.xml 文件中指定的目标相匹配)。这些名称应该与 struts-config.xml 中 <forward name="x" path="y"/> 标记中的 path 属性匹配。这些名称还应该与 struts-config.xml 中 <action ... input="" .../> 标记中的 input 属性匹配。在开发用户界面时,<definition name="x" extends="y"/> 标记中的 extends 属性是体现开发灵活性的地方。通过指定主布局并扩展它,您不仅能灵活更改象 topBanner 、 topMenu 、 panel1 、 panel2 这样的公共元素及其它组件, 还能随意地将不同元素放在页面上及更改它们的位置。例如,您可以添加 panel4 (一个 tile)以在页面左侧的 panel2 下显示本地天气。只要天气代码不需要用户的任何输入或与页面上的其它组件交互,您就可以添加 panel4 而不必对应用程序业务逻辑做任何更改,甚至不必更改除 rootLayout.jsp 以外的 JSP 页面。

让我们尝试将带有天气信息的 panel4 添加至应用程序中来看看这样做是多么容易。为了节省时间,我已在 EX2_INSTALL/src/web/tiles-components 中名为 panel4.jsp 的文件中创建了天气组件的 JSP 文件,其中有内容和 HTML 代码。您需要进行两个更改:

1.在 EX2_INSTALL/src/WEB-INF/tiles-defs.xml 中,找到清单 1 中显示的代码,然后编辑它以添加用于 panel4 的 <put/> 标记,如清单 2 所示:

清单 1. 原始 tiles-defs.xml 代码
<definition name="rootLayout" path="/tiles-layouts/rootLayout.jsp">
<put name="titleString" value="CHANGE-ME"/>
<put name="topBanner" value="/tiles-components/topBanner.jsp"/>
<put name="topMenu" value="/tiles-components/topMenu.jsp"/>
<put name="panel1" value="/tiles-components/panel1.jsp"/>
<put name="panel2" value="/tiles-components/panel2.jsp"/>
<put name="panel3" value="CHANGE-ME"/>
<put name="footer" value="/tiles-components/footer.jsp"/>
<put name="footerDebug" value="/tiles-components/footerDebug.jsp"/>
</definition>
清单 2. 新的 tiles-defs.xml 代码
<definition name="rootLayout" path="/tiles-layouts/rootLayout.jsp">
<put name="titleString" value="CHANGE-ME"/>
<put name="topBanner" value="/tiles-components/topBanner.jsp"/>
<put name="topMenu" value="/tiles-components/topMenu.jsp"/>
<put name="panel1" value="/tiles-components/panel1.jsp"/>
<put name="panel2" value="/tiles-components/panel2.jsp"/>
<put name="panel4" value="/tiles-components/panel4.jsp"/>
<put name="panel3" value="CHANGE-ME"/>
<put name="footer" value="/tiles-components/footer.jsp"/>
<put name="footerDebug" value="/tiles-components/footerDebug.jsp"/>
</definition>

你可能感兴趣的:(struts)