java

位置:IT落伍者 >> java >> 浏览文章

Struts 开发的最佳实践


发布日期:2019年06月27日
 
Struts 开发的最佳实践

本文向您讲解了如何使用灵活的 Struts 框架调节 Web 应用程序开发在这里本文作者向您展示了一些最佳实践您可以遵循这些实践来优化这个成熟的开源框架此外您还可以学习使用一些十分有价值的标准 Struts 组件包括 ActionFormAction 类和 ActionErrors

Struts简介

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

Struts 和 MVC

Struts 组件概览

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

Action

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

ActionForm

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

JSP 定制标记库

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

ActionErrors

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

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

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

清单 使用 ActionForm

<html:form action=/bp>

<html:text property=attrib />

</html:form >

这个 ActionForm 被称为 BPAForm它包括属性 attrib 及其 getter 和 setter 方法在配置文件 strutsconfigxml 中行为 /bp 通过 name 属性映射到 bpAForm这有助于在 JSP 中显示数据

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

创建一个 JavaBean(BPBForm)且其属性是 BPAForm 属性的子集还要创建这些属性的 getter 和 setter 方法

通过将这个 bean 与 BPAForm 关联用 bean BPBForm 的属性替代 BPAForm 中的属性现在就可以通过 BPBForm 访问 BPAForm 中的属性子集了清单 展示了访问的方式

清单 访问 JSP 中的表单属性

<html:form action=/bp>

<bean:define name=bpAForm property=bpBForm id=bpB

type=comibmdwwebarchstrutsBPBForm />

<html:text name=bpB property=subsetAtt />

</html:form >

要点

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

● Struts 实现 <beandefine/> 标记

● 当代码 <%@ taglib uri=strutsbeantld prefix=bean %> 指向 strutsbeantld 时<beandefine/> 标记开始在 JSP 组件内工作

● 由 ActionForm 扩展而来的 BPAForm 验证框架必须验证 BPBForm 的数据

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

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

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

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

通过扩展 orgapachestrutsactionAction 创建一个 Action 类比如 BPAction

通过扩展 BPAction 在 Web 应用程序中创建所有其他 Action 类

在 BPAction 类中创建一个方法 performTask()就像在公共抽象类 ActionForward performTask(ActionMapping mapping ActionForm form HttpServletRequest request HttpServletResponse response) throws IOException ServletException 中一样

在 BPAction 类中向应用程序添加一个或多个泛型方法比如 serverSideValidate()考虑以下因素后决定方法的访问修饰符

● 如果所有 Action 类都必须实现此方法则让其为抽象

● 如果某些 Action 类提供一个特定的实现则将此方法声明为受保护并给它一个默认实现

在 BPAction 类中将方法 perform() 声明为 final调用上述的泛型方法(通常在处理请求前调用该方法)现在调用 步骤 中创建的方法 performTask()

在每个扩展 BPAction 的 Action 类添加具有特定实现的方法 performTask()

优势

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

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

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

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

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

通过扩展 orgapachestrutsactionActionForm 创建一个名为 BPForm 的抽象类

在 BPForm 类中添加具有访问修饰语的方法就像在公共抽象类 void toSession(SessionData sessionData) 和 void fromSession(SessionData sessionData) 中一样

在每个 ActionForm 类中扩展 BPForm 并实现这些抽象方法(表单数据通过它们传递到会话或从会话传回)

相应的 Action 类可以决定这些方法的调用顺序例如可以在决定 actionForward 之前调用 ActionForm 上的方法 toSession()

何时使用这一实践

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

最佳实践 有效处理异常

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

清单 Action 类中的异常处理

try {

//Code in Action class

}

catch (ApplicationException e) {

//log exception

ActionErrors actionErrors = new ActionErrors();

ActionError actionError = new ActionError(egetErrorCode());

actionErrorsadd(ActionErrorsGLOBAL_ERROR actionError);

saveErrors(request actionErrors);

}

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

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

通过扩展 orgapachestrutsactionAction 创建一个 Action 类比如 BPAction

通过扩展 BPAction 在 Web 应用程序中创建所有其他 Action 类

在 BPAction 中声明变量 ActionErrors actionErrors = new ActionErrors()

在 BPAction 中创建方法 performTask()就像在公共抽象类 ActionForward performTask(ActionMapping mapping ActionForm form HttpServletRequest request HttpServletResponse response ActionErrors actionErrors) throws IOException ServletException 中一样

在 BPAction 中将方法 perform() 声明为 final然后调用泛型方法(这些方法总是在处理请求前调用)现在调用在前一个步骤中创建的 performTask()

在每个 Action 类中实现方法 performTask() 的同时(通过扩展 BPAction)像清单 那样处理应用程序异常

清单 有效使用 ActionErrors

try { //Code in Action class } catch(ApplicationException appException) { //Log exception //Add error to actionErrors actionErrorsadd(ActionErrorsGLOBAL_ERROR new ActionError(appExceptiongetErrorCode())); }

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

优势

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

结束语

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

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

上一篇:学习Jakarta Struts 1.1 (二)

下一篇:Struts常见的11个错误汇总