`
grzrt
  • 浏览: 188835 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Struts 开发的最佳实践

    博客分类:
  • JAVA
 
阅读更多

Struts:简介

Struts 是一种开源框架,可用来构建 Web 应用程序,它基于流行的 Model-View-Controller (MVC2) 设计范型。该框架构建在一些标准的技术之上,比如 Java Servlets、JavaBeans、ResourceBundles 和 XML,并且可提供灵活和可扩展的组件。Struts 以 ActionServlet 的形式实现了 Controller 层,并建议使用 JSP 标记库构建 View 层。Struts 通过 Action 类提供了围绕 Model 层的包装器。图 1 展示了基于 Model-View-Controller 设计的 Struts 框架。


图 1. Struts 和 MVC
Struts 和 MVC




回页首

 

Struts 组件概览

首先,我们在最佳实践上下文中解释 Struts 组件,以及它们在 Web 应用程序开发中所起的作用。

Action

应用程序的每个 Action 都会扩展 Struts 的 org.apache.struts.action.Action 类。这些 Action 类为应用程序的 Model 层提供了一个接口,充当围绕业务逻辑的包装器。每个 Action 类都必须向 perform() 方法提供其特定于用例的实现。perform() 方法经常返回类型 ActionForward 的一个值。

ActionForm

应用程序的 ActionForm 扩展了 Struts 的 org.apache.struts.action.ActionForm 类。ActionForm 是一些封装和验证请求参数的简单 JavaBean。要验证请求数据,ActionFormvalidate() 方法必须给出一个特定于该情况的实现。ActionForm 作为运载工具,向 Action 类提供请求数据。一个 JSP 对象与各自的 ActionForm 对象相结合,构成应用程序的 View 层。在该层,几乎 JSP 对象的每个表单字段都映射到相应的 ActionForm 的属性。

JSP 定制标记库

JSP 定制标记库是用标记表示的一组行为的集合。这是 JSP Specification 1.1 的一个强大特性;它将其他应用程序层的表示区别了开来。这些库易于使用,而且可以以一种类似 XML 的方式来读取。只要尽量少地在其中使用 Java scriptlet,就可以轻松维护 JSP 组件。Struts 提供的 JSP 标记包括 HTML、逻辑和 bean 标记。

ActionErrors

可以使用 ActionError 来支持异常处理。ActionError 捕捉应用程序异常,并将其传送给 View 层。每个异常都是一个 ActionError 实例的集合。ActionError 可以封装错误消息,而 Presentation 层中的 </html:errors> 可以呈现 ActionError 集合内的所有错误消息。

 




回页首

 

最佳实践 1. 跨多个 ActionForm 重用数据

熟悉了 Struts 组件之后,就可以继续学习如何充分利用这一框架。首先,Struts 建议将每个 JSP 对象与一个 ActionForm 相关联,后者可以封装屏幕上显示的数据。可以通过 ActionForm 内的附加方法来访问 JSP 对象内的表单数据。清单 1 展示了 ActionForm 标记在 View 层中的传统方法。


清单 1. 使用 ActionForm

   <html:form action="/bp1">

   <html:text  property="attrib1" />

   </html:form >

 

这个 ActionForm 被称为 “BP1AForm ”,它包括属性 attrib1 及其 getter 和 setter 方法。在配置文件 struts-config.xml 中,行为 “/bp1 ” 通过 name 属性映射到 bp1AForm 。这有助于在 JSP 中显示数据。

要实现这一最佳实践,Struts 建议您进行以下两个操作:

  1. 创建一个 JavaBean(BP1BForm ),且其属性是 BP1AForm 属性的子集,还要创建这些属性的 getter 和 setter 方法。
  2. 通过将这个 bean 与 BP1AForm 关联,用 bean BP1BForm 的属性替代 BP1AForm 中的属性。现在就可以通过 BP1BForm 访问 BP1AForm 中的属性子集了。清单 2 展示了访问的方式。


清单 2. 访问 JSP 中的表单属性

   <html:form action="/bp1">

   <bean:define name="bp1AForm" property="bp1BForm" id="bp1B"
                type="com.ibm.dw.webarch.struts.BP1BForm" />

   <html:text  name="bp1B" property="subsetAtt1" />

   </html:form >

 

要点

这种实践的主要优势是可用于多个 ActionForm 访问一个属性集。在遵循这一最佳实践的同时,需要记住以下几点:

  • Struts 实现 <bean:define/> 标记。
  • 当代码 <%@ taglib uri="struts-bean.tld" prefix="bean" %> 指向 struts-bean.tld 时,<bean:define/> 标记开始在 JSP 组件内工作。
  • ActionForm 扩展而来的 BP1AForm 验证框架必须验证 BP1BForm 的数据。

当在应用程序中创建 Action 类时,不需要直接扩展 org.apache.struts.action.Action ,可以通过扩展 org.apache.struts.action.Action 创建一个 Action 类(IntermediateAction ),用于处理应用程序中的常见事务。所有其他的 Action 类都扩展 IntermediateAction 类。

 




回页首

 

最佳实践 2. 使用 Action 类处理请求

通常,在使用这个 Struts 框架时,对于 JSP 组件请求应用程序执行的每个动作,应用程序都必须扩展 Struts 的 org.apache.struts.action.Action 以创建 Action 类。在处理请求时,单个的 Action 类与应用程序的 Model 层连接。

要实现这一最佳实践,Struts 建议您遵循以下步骤:

  1. 通过扩展 org.apache.struts.action.Action 创建一个 Action 类,比如 BP2Action
  2. 通过扩展 BP2Action 在 Web 应用程序中创建所有其他 Action 类。
  3. BP2Action 类中创建一个方法 performTask() ,就像在公共抽象类 ActionForward performTask(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException 中一样。
  4. BP2Action 类中向应用程序添加一个或多个泛型方法,比如 serverSideValidate() 。考虑以下因素后决定方法的访问修饰符:
    • 如果所有 Action 类都必须实现此方法,则让其为抽象。
    • 如果某些 Action 类提供一个特定的实现,则将此方法声明为受保护,并给它一个默认实现。
  5. BP2Action 类中,将方法 perform() 声明为 final。调用上述的泛型方法(通常在处理请求前调用该方法)。现在调用 步骤 3 中创建的方法 performTask()
  6. 在每个扩展 BP2ActionAction 类,添加具有特定实现的方法 performTask()

优势

这一实践有两个主要优势。首先,它避免了 Web 应用程序中每个 Action 类的冗余代码。其次,通过将 Action 类的行为集中在一起,使应用程序能够更多地控制通用的任务。

 




回页首

 

最佳实践 3. 使用 ActionForm 处理会话数据

在一个基于 Struts 的 Web 应用程序中,每个 ActionForm 都扩展 org.apache.struts.action.ActionForm 类。这些 ActionForm 封装页面数据,并提供一个验证框架来验证请求参数。

大多数 Web 应用程序都在会话中保持数据,使其在整个应用程序过程中可用。这种最佳实践实现了这种 Web 应用程序特性。它允许方法 toSession()fromSession() 将会话数据移动到表单数据或从表单数据移回。因此,它实现了在 Web 应用程序中保持会话数据。

要遵循一最佳实践,执行以下步骤:

  1. 通过扩展 org.apache.struts.action.ActionForm 创建一个名为 BP3Form 的抽象类。
  2. BP3Form 类中,添加具有访问修饰语的方法,就像在公共抽象类 void toSession(SessionData sessionData)void fromSession(SessionData sessionData) 中一样。
  3. 在每个 ActionForm 类中,扩展 BP3Form 并实现这些抽象方法(表单数据通过它们传递到会话或从会话传回)。
  4. 相应的 Action 类可以决定这些方法的调用顺序。例如,可以在决定 actionForward 之前调用 ActionForm 上的方法 toSession()

何时使用这一实践

这一实践最适用于:会话数据是单一对象和/或每个页操作或使用会话数据。

 




回页首

 

最佳实践 4. 有效处理异常

传统地,当在 Action 类中发生应用程序异常时,异常首先被写入日志。然后此类创建一个 ActionError 并在合适的作用域中存储它。然后 Action 类再将控制转交给合适的 ActionForward 。清单 3 展示了 Action 类是如何处理异常的。


清单 3. Action 类中的异常处理

   try {
   //Code in Action class
   }
   catch (ApplicationException e) {
   //log exception
   ActionErrors actionErrors = new ActionErrors();
   ActionError actionError = new ActionError(e.getErrorCode());
   actionErrors.add(ActionErrors.GLOBAL_ERROR, actionError);
   saveErrors(request, actionErrors);
   }

 

传统的异常处理过程在每个 Action 类中保存异常信息,而最佳实践 4 则在处理异常时避免冗余代码。

要使用这一最佳实践,Struts 建议您遵循以下步骤:

  1. 通过扩展 org.apache.struts.action.Action 创建一个 Action 类,比如 BP4Action
  2. 通过扩展 BP4Action 在 Web 应用程序中创建所有其他 Action 类。
  3. BP4Action 中声明变量 ActionErrors actionErrors = new ActionErrors();
  4. BP4Action 中创建方法 performTask() ,就像在公共抽象类 ActionForward performTask(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, ActionErrors actionErrors) throws IOException, ServletException 中一样。
  5. BP4Action 中将方法 perform() 声明为 final。然后调用泛型方法(这些方法总是在处理请求前调用)。现在调用在前一个步骤中创建的 performTask()
  6. 在每个 Action 类中实现方法 performTask() 的同时(通过扩展 BP4Action ),像清单 4 那样处理应用程序异常。


清单 4. 有效使用 ActionErrors

   try		 {
   //Code in Action class
   }
   catch(ApplicationException appException) {
   //Log exception
   //Add error to actionErrors
   actionErrors.add(ActionErrors.GLOBAL_ERROR,
      new ActionError(appException.getErrorCode()));
   }

 

BP4Action 中,调用方法 performTask() 之后,通过 saveErrors(request, errors) 保存 ActionErrors

优势

这一实践主要的优势是:避免了每个处理 ActionErrorsAction 类中的代码冗余。

 




回页首

 

结束语

对开发团队而言,构建易于维护的 Web 应用程序是一项非常具有挑战性的任务。使用 Struts 等成熟的框架有助于实现通常与构建应用程序相关的基础设施代码。Struts 框架提供了一组标准接口,用于将业务逻辑插入到应用程序中。此外,还提供了一种跨开发团队的一致机制,用于执行用户数据验证、屏幕导航等任务,以及用于简化开发屏幕的一组定制标记库。

本文给出的 4 种最佳实践对您充分利用这种框架的特性十分重要。它们不仅能够提高代码的模块化程度和应用程序的可重用性,还能减少代码冗余。对于构建可扩展的 Web 应用程序,这是至关重要的。

 

 

分享到:
评论

相关推荐

    Struts_开发的最佳实践

    本文将探讨Struts开发的最佳实践,包括Action、ActionForm、JSP定制标记库以及ActionErrors的使用。 Action类是应用程序的核心部分,它扩展自Struts的`org.apache.struts.action.Action`。每个Action类代表一个具体...

    struts2最佳实践,实例学习

    ### Struts2最佳实践与实例学习 #### 一、Struts2概述与基本概念 **Struts2**作为Java Web开发领域中一个重要的MVC框架,它的设计理念与实践方法为许多开发者提供了强大的支撑。本文旨在总结《Struts2权威指南》中...

    struts开发入门与项目实践

    在Struts开发中,需要配置struts.xml文件,该文件定义了Action(控制器)、Result(视图)和Action映射等关键组件。配置包括Action类的指定、结果页面的跳转规则以及拦截器的设置。 4. **Action与ActionForm**: ...

    Struts2、Spring、Hibernate 高效开发的最佳实践

    Struts2、Spring、Hibernate 高效开发的最佳实践

    Struts开发包

    5. **文档**:包括API文档、用户指南、教程等,帮助开发者学习和理解Struts2的使用方法和最佳实践。 6. **配置文件**:如`struts.xml`,是Struts2应用的主要配置文件,定义了Action、结果类型、拦截器栈等。 7. **...

    Struts2最佳实践之一-在复杂实体对象中,如何将页面参数转换为实体对象

    Struts2作为一款流行的Java Web框架,其在处理表单提交和实体对象绑定方面提供了强大的功能。本篇文章将深入探讨如何在...在实际应用中,结合良好的设计原则和最佳实践,可以确保Struts2项目在处理数据交互时表现出色。

    Struts开发入门与项目实践1

    9. **最佳实践**:提供关于编写可维护和可扩展的Struts1代码的建议,如避免硬编码,正确使用session和request对象等。 10. **升级到Struts2**:如果包含相关内容,可能会指导如何将现有的Struts1项目迁移到Struts2...

    struts2 开发包.zip

    Struts2是一个强大的Java web应用程序框架,用于构建和部署可维护、高性能的企业级应用程序。它在Web开发领域中被广泛使用,特别是在MVC(模型-视图...在实际开发中,还需要结合具体需求和最佳实践,灵活运用这些知识。

    struts2.2.1开发文档

    11. **最佳实践**:提供了一系列开发建议,如代码组织、性能优化、安全注意事项等,以帮助开发者遵循良好的编程习惯。 12. **示例应用**:通过实际示例演示了上述知识点的应用,帮助读者更好地理解和掌握Struts2...

    struts1 开发包

    `apps`目录下可能包含一些示例项目或应用,这些项目可以帮助开发者理解Struts1的工作原理和最佳实践。解压后,你可以通过IDE导入这些项目,或者在命令行下使用`java webapp`命令部署到应用服务器,如Tomcat。示例...

    Struts2开发jar包

    Struts2是一款强大的Java web框架,它为开发者提供了一种结构化的、可扩展的方式来构建MVC(模型-视图-控制器)模式的应用程序。...在实际开发中,结合最佳实践和不断迭代,可以不断提升应用程序的质量和用户体验。

    精通Struts 2:Web 2.0开发实战

    书中包含丰富的实际案例和最佳实践,帮助读者理解和掌握Struts 2在实际项目中的应用,提升开发技能。 总之,《精通Struts 2:Web 2.0开发实战》是一本深入浅出的教程,适合有一定Java基础的开发者学习,通过阅读...

    Struts2开发实例总结

    Struts2是一个强大的Java web应用程序框架,用于构建MVC(模型-视图-控制器)架构的应用。...在实际项目中,还需要结合其他技术和最佳实践,如错误处理、权限控制、国际化等,以构建出更加健壮和可维护的系统。

    J2EE开发最佳实践

    在J2EE(Java EE,即Java平台企业版)开发中,遵循最佳实践至关重要,因为它们可以帮助提升应用程序的性能、可维护性和可扩展性。以下是根据提供的内容所提炼的几个核心知识点: 1. **始终使用MVC模式** MVC...

    精通Struts:基于MVC的JavaWeb设计与开发(孙卫琴)

    10. **最佳实践与性能优化**:书中会介绍一些开发和部署Struts应用的最佳实践,以及如何进行性能调优,如减少不必要的请求、优化数据库操作等。 通过对《精通Struts:基于MVC的JavaWeb设计与开发》的学习,开发者...

    struts2开发遇到的问题

    Struts2 开发常见问题与解决方案 在使用 Struts2 进行开发时,开发者可能会遇到...此外,保持更新至最新稳定版本的Struts2框架,遵循最佳实践,以及使用IDE的代码检查和自动修复功能,都可以帮助减少这类问题的发生。

    三大框架中文文档中的struts2.0开发手册(程序员必看)

    通过深入阅读这份"三大框架中文文档中的struts2.0开发手册",开发者不仅可以掌握Struts2.0的基础知识,还能学习到实际项目开发中的最佳实践,提升自己的编程技能。手册中可能还会包含实例代码、常见问题解答以及调试...

Global site tag (gtag.js) - Google Analytics