<form:form action="join.do" focus="email" >
- JSP <form> 标记和属性替代了 HTML <form> 标记和属性。 <form action="join.jsp" name="join"> 已更改为 <form:form action="join.do" focus="email" > 。
- HTML <input> 标记已替换为 <form:text/> 。
- HTML <submit> 标记已替换为 <form:submit/> 。
模型 -- 会话状态
JoinForm 扩展了 ActionForm 并包含表单数据。本例中的表单数据只有电子邮件地址。我已为电子邮件地址添加了一个写方法和读方法,以供框架访问。为了便于说明,我重写了 validate() 方法,并使用了 Struts 的跟踪功能。Struts 将创建 JoinForm 并设置状态信息。
模型 -- 业务逻辑
如前所述, Action 是控制器和实际业务对象之间的接口。 JoinAction 包装了对 business.jar 的调用,这些调用最初在 join.jsp 文件中。 JoinAction 的 perform() 方法在清单 5 中列表。
清单 5. - JoinAction.perform()
public ActionForward perform(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
// 抽取我们将会用到的属性和参数
JoinForm joinForm = (JoinForm) form;
String email = joinForm.getEmail();
ActionErrors errors = new ActionErrors();
// 存储输入....
try {
business.db.MailingList.AddEmail(email);
} catch (Exception e) {
// 记录日志,打印栈
// 将错误回显给用户
errors.add("email",new ActionError("error.mailing.db.add"));
}
// 如需任何消息,请将指定的错误消息键保存到
// HTTP 请求中,以供 <struts:errors> 标记使用。
if (!errors.empty()) {
saveErrors(request, errors);
// 返回到初始表单
return (new ActionForward(mapping.getInput()));
}
// 将控制权转交给 Action.xml 中指定的 'success' URI
return (mapping.findForward("success"));
}
注: perform() 返回一个称为 ActionForward 的类,该类通知控制器下一步该执行什么操作。在本例中,我使用从控制器传入的映射来决定下一步的操作。
控制器
我已修改了 JSP 文件,并创建了两个新类:一个类用来包含表单数据,一个类用来调用业务包。最后,我通过修改配置文件 struts-config.xml 将它们整合起来。清单 6 显示了我添加的 action 元素,这个元素用来控制 joinMVC.jsp 的流程。
清单 6. Action 配置
<action path="/join"
name="joinForm"
type="web.mailinglist.JoinAction"
scope="request"
input="/joinMVC.jsp"
validate="true">
<forward name="success" path="/welcome.html"/>
</action>
action 元素描述了从请求路径到相应的 Action 类的映射,应该用这些类来处理来自这个路径的请求。每个请求类型都应该有相应的 action 元素,用来描述如何处理该请求。对于 join 请求:
- joinForm 用来容纳表单数据。
- 因为 validate 被标记为 true,所以 joinForm 将试图进行自我验证。
- web.mailinglist.JoinAction 是用来处理对这个映射的请求的 action 类。
- 如果一切顺利,该请求将转到 welcome.jsp 。
- 如果出现业务逻辑故障,流程将返回到 joinMVC.jsp ,这是最初发出请求的网页。为什么会这样呢?在清单 6 的 action 元素中,有一个称为 input 的属性,其值为 "/joinMVC.jsp" 。在我的 JoinAction.perform() (如清单 5 所示)中,如果业务逻辑失败, perform() 就返回一个 ActionForward ,并以 mapping.getInput() 作为参数。本例中的 getInput() 是 "/joinMVC.jsp" 。如果业务逻辑失败,它将返回到 joinMVC.jsp ,这是最初发出请求的网页。
使用 Struts 前后的比较
正如我们在图 9 中所看到的那样,复杂性和层都有显著增加。不再存在从 JSP 文件到 Service 层的直接调用。

图 9. 使用 Struts 前后的比较
Struts 的优点
- JSP 标记机制的使用
标记特性从 JSP 文件获得可重用代码和抽象 Java 代码。这个特性能很好地集成到基于 JSP 的开发工具中,这些工具允许用标记编写代码。 - 标记库
为什么要另发明一种轮子,或标记库呢?如果您在库中找不到您所要的标记,那就自己定义吧。此外,如果您正在学习 JSP 标记技术,则 Struts 为您提供了一个起点。 - 开放源码
您可以获得开放源码的全部优点,比如可以查看代码并让使用库的每个人检查代码。许多人都可以进行很好的代码检查。 - MVC 实现样例
如果您希望创建您自己的 MVC 实现,则 Struts 可增加您的见识。 - 管理问题空间
分治是解决问题并使问题可管理的极好方法。当然,这是一把双刃剑。问题越来越复杂,并且需要越来越多的管理。

RSS订阅




