J2ME之家

匿名投稿 投稿指南 RSS订阅 J2ME通告:
搜索: 您的位置主页>Java技术>Struts>

Struts,MVC 的一种开放源码实现

2008-7-28 20:35:49 来源:本站整理 责任编辑: 【 点击: 我要投稿 [进入论坛]

ActionForm 类

    ActionForm 维护 Web 应用程序的会话状态。 ActionForm 是一个抽象类,必须为每个输入表单模型创建该类的子类。当我说 输入表单模型 时,是指 ActionForm 表示的是由 HTML 表单设置或更新的一般意义上的数据。例如,您可能有一个由 HTML 表单设置的 UserActionForm 。Struts 框架将执行以下操作:

  • 检查 UserActionForm 是否存在;如果不存在,它将创建该类的一个实例。
  • Struts 将使用 HttpServletRequest 中相应的域设置 UserActionForm 的状态。没有太多讨厌的 request.getParameter() 调用。例如,Struts 框架将从请求流中提取 fname ,并调用 UserActionForm.setFname() 。
  • Struts 框架在将 UserActionForm 传递给业务包装 UserAction 之前将更新它的状态。
  • 在将它传递给 Action 类之前,Struts 还会对 UserActionForm 调用 validation() 方法进行表单状态验证。 注: 这并不总是明智之举。别的网页或业务可能使用 UserActionForm ,在这些地方,验证可能有所不同。在 UserAction 类中进行状态验证可能更好。
  • 可在会话级维护 UserActionForm 。

注:

  • struts-config.xml 文件控制 HTML 表单请求与 ActionForm 之间的映射关系。
  • 可将多个请求映射到 UserActionForm 。
  • UserActionForm 可跨多页进行映射,以执行诸如向导之类的操作。

  Action

    Action 类是业务逻辑的一个包装。 Action 类的用途是将 HttpServletRequest 转换为业务逻辑。要使用Action ,请创建它的子类并覆盖 process() 方法。

    ActionServlet (Command) 使用 perform() 方法将参数化的类传递给 ActionForm 。仍然没有太多讨厌的 request.getParameter() 调用。当事件进展到这一步时,输入表单数据(或 HTML 表单数据)已被从请求流中提取出来并转移到 ActionForm 类中。

    注:扩展 Action 类时请注意简洁。 Action 类应该控制应用程序的流程,而不应该控制应用程序的逻辑。通过将业务逻辑放在单独的包或 EJB 中,我们就可以提供更大的灵活性和可重用性。

    考虑 Action 类的另一种方式是 Adapter 设计模式。 Action 的用途是“将类的接口转换为客户机所需的另一个接口。Adapter 使类能够协同工作,如果没有 Adapter,则这些类会因为不兼容的接口而无法协同工作。”(摘自 Gof 所著的 Design Patterns - Elements of Reusable OO Software )。本例中的客户机是 ActionServlet ,它对我们的具体业务类接口一无所知。因此,Struts 提供了它能够理解的一个业务接口,即 Action 。通过扩展 Action ,我们使得我们的业务接口与 Struts 业务接口保持兼容。(一个有趣的发现是, Action 是类而不是接口)。 Action 开始为一个接口,后来却变成了一个类。真是金无足赤。)

  Error

    UML 图(图 6)还包括 ActionError 和 ActionErrors 。 ActionError 封装了单个错误消息。 ActionErrors 是 ActionError 类的容器,View 可以使用标记访问这些类。 ActionError 是 Struts 保持错误列表的方式。

Relationship of ActionServlet to Action

    图 7. Command (ActionServlet) 与 Model (Action) 之间的关系的 UML 图

  ActionMapping 类

    输入事件通常是在 HTTP 请求表单中发生的,servlet 容器将 HTTP 请求转换为 HttpServletRequest 。控制器查看输入事件并将请求分派给某个 Action 类。 struts-config.xml 确定 Controller 调用哪个 Action 类。 struts-config.xml 配置信息被转换为一组 ActionMapping ,而后者又被放入 ActionMappings 容器中。(您可能尚未注意到这一点,以 s结尾的类就是容器)

ActionMapping 包含有关特定事件如何映射到特定 Action 的信息。 ActionServlet (Command) 通过 perform() 方法将 ActionMapping 传递给 Action 类。这样就使 Action 可访问用于控制流程的信息。

  ActionMappings

    ActionMappings 是 ActionMapping 对象的一个集合。

 

  再访邮件列表样例

    下面我们看一下 Struts 是如何解决困扰 join.jsp 的这些问题的。改写后的方案由两个项目组成。第一个项目包含应用程序的逻辑部分,这个应用程序是独立于 Web 应用程序的。这个独立层可能是用 EJB 技术实现的公共服务层。为了便于说明,我使用 Ant 构建进程创建了一个称为 business 的包。有几个原因促使我们使用独立的业务层:

  • 划分责任
    单独的包使管理人员能够在开发小组内委派责任。这也有助于提高开发人员的责任心。
  • 通用件
    我们设想开发人员将这个包看作一个商业软件。将它放在另外的包中使它更像通用件。这个包可能是通用件,也可能是由组织内部的另一个小组开发的。
  • 避免不必要的构建和单元测试。

    分开的构建进程有助于避免不必要的构建和单元测试。
  • 使用接口开发
    在进行开发和避免不必要的耦合时,它有助于从接口的观点来思考问题。这是极重要的一个方面。当开发您自己的业务包时,这些业务类不应该关心到底是 Web 应用程序执行调用,还是独立应用程序执行调用。因此,应该避免在业务逻辑层使用对 servlet API 或 Struts API 调用的任何引用。
  • 稳定性
    并不是每个组织都每天、每周甚至每月进行检修。因此,在进行开发时,稳定的接口点是重要的。不能因为业务包处于变迁阶段就认为 Web 项目也应该处于变迁阶段。

  业务构建注释

    我用 Ant 构建项目,并用 JUnit 运行单元测试。business.zip 包含构建业务项目所需的一切,当然 Ant 和 JUnit 除外。这个包脚本将构建类,运行单元测试,创建 Java 文档和 jar 文件,最后将所有这些内容压缩到一个 zip 文件中发送给客户。只要对 build.xml 作一些修改,您就可以将它部署到其他平台上。 Business.jar 位于 Web 的下载部分,因此,您并非必须下载并构建这个业务包。

  Web 项目

    第二个项目是用 Struts 开发的一个 Web 应用程序。您将需要一个符合 JSP 1.1 和 Servlet 2.2 规范的容器。最快的入门方法是下载并安装 Tomcat 3.2(请参阅 参考资源 )。直到有 Struts 的 1.0 发行版之前,我建议您从 Jakarta 项目获得最新的版本(请参阅 参考资源 )。这对我来说是个大问题,我不能确保我的 Web 项目样例能与您下载的 Struts 一起工作。Struts 仍在不断变化,所以我不得不经常更新我的项目。在本项目中,我使用的是 jakarta-struts-20010105.zip。图 8 显示了此 Web 项目的结构。如果您已安装了 Ant,则运行这个版本将创建一个称为 joinStruts.war 的 war 文件,您随时可以部署这个文件。

Web project layout

    图 8. Web 项目的结构

    清单 4 显示了转换后的 JSP 文件,称为 joinMVC.jsp 。这个文件从最初的 50 行变为 19 行,并且现在不含任何 Java 代码。从网页设计人员的角度来看,这是个巨大的改进。



  清单 4. joinMVC.jsp -- 再访简单的 JSP

<%@ page language="java" %>

<%@ taglib uri="/WEB-INF/struts.tld" prefix="struts" %>

<%@ taglib uri="/WEB-INF/struts-form.tld" prefix="form" %>

<html>

<head>

<title><struts:message key="join.title"/></title>

</head>

<body bgcolor="white">

<form:errors/>

<h3>Enter your email to join the group</h3>

<form:form action="join.do" focus="email" >

    <form:text   property="email" size="30" maxlength="30"/>

    <form:submit property="submit" value="Submit"/>

</form:form>

</body>

</html>

 

 

  网页的变化

    下面是使用 Struts 标记库之后所发生变化的列表:

  • Import

<%@ taglib uri="/WEB-INF/struts.tld" prefix="struts" %>

 


用于 Java 代码的 <%@page import? 已被替换为用于 Struts 标记库的 <%@ taglib uri? 。

  • 文本

<struts:message key="join.title"/>

 


资源属性文件包含 join.title 的文本。在本例中,ApplicationResources 属性文件包含这个名值对。这使字符串更易于查看和国际化。

  • 错误

<form:errors/>

 


ActionServlet 或 ActionForm 构建要显示的错误消息。这些错误消息也可以包含在属性文件中。ApplicationResources 也提供了一种格式化错误的方法,即设置 error.header 和 error.footer 。


Tag:实现 源码 开放   < " Struts JSP 一个 文件
责任编辑:
  • 上一篇:没有了  下一篇:Struts架构中的Session对象创建和控制
    用户名: (新注册)密码: 匿名:  请文明参与讨论,禁止漫骂攻击。
    评论总数: [ 查看全部 ] 网友评论
    关于我们 - 在线帮助 - 网站动态 - 版权声明 - RSS订阅 - 网站地图 - 返回顶部