将Struts应用迁移到Struts 2(一)

时间:2008-01-08 来源:IT在中国 编辑:蓝天 作者:蓝天 [ ]
  大多数人都会熟悉Struts, 无论是从项目实战中获得的经验还是从书中了解到的知识。在这一系列文章里,我们将通过一个由Struts迁移到Struts 2的简单应用例子向大家展现Struts 2的所有特征

解剖Actions

在上面介绍的请求运作流程中,我们从高层次上谈及了一些Struts和Struts 2的不同点。现在我们将较深入地探讨这两个框架中Action结构的具体差别。

让我们来回顾一下Struts的Action的主要结构。Struts Action的主要形式如下:

public class MyAction extends Action {
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// do the work
return (mapping.findForward("success"));
}
}

当你实现一个Struts Action时, 需要注意以下问题:

  1. 所有的Action都继承于Action基类。
  2. 所有的Action都必须是线程安全的,因为只产生一个Action实例。
  3. 因为所有的Action都必须是线程安全的,所有在Action处理过程中所需要的对象都必须以方法参数的形式传入。
  4. 处理Action所调用的方法必须命名为“execute”(在Struts中的DispatchAction类可以调用同一个Action的其它方法,但实际上在框架中的入口点仍然是“execute”方法)。
  5. ActionForward结果是通过ActionMapping类中的方法来产生的,通常的做法是通过调用“findForward”方法。

相比较之下,Struts 2的Action提供了更简单的实现方式。下面就是个例子:

public class MyAction {
public String execute() throws Exception {
// do the work
return "success";
}
}

    首先你会注意到的是,Struts 2中的Action不再继承于任何类或需要实现任何接口。实际上,它还远不只这些。按照惯例,只有“execute”方法能调用Action, 但在Struts 2中并非必要,任何声明为public String methodName() 方法都能通过配置来调用Action。

    另外,你会注意到返回的对象不是ActionForward,而是String。如果你不喜欢以字符串的形式出现在你的代码中,有个Helper接口Action可以以常量方式提供常见结果,如“success”、“none”、“error”、“input”和“login”。

    最后,和Struts最大的革命性的不同是,处理Action过程中调用的方法(“execute”方法)是不带参数的。那你如何获取你所需要的对象呢?答案是使用“反转控制(Inversion of Control)”,也叫“依赖注入(Dependency Injection)”的模式(想更多地了解这方面信息请看Martin Fowler的文章http://www.martinfowler.com/articles/injection.html)。Spring框架使得这个模式流行起来,然而Struts 2的前身(WebWork)也在同时应用上了这个模式。

为了更好地了解反转控制,让我们来看看一个例子,如何在Action处理过程中可以访问到当前请求HttpServerRequest对象。

在我们的例子中,我们使用的依赖注入机制是接口注入。就如其名称一样,接口注入需要的是已经被实现了的接口。这个接口包含了相应属性的setter,为Action提供值。例子中我们使用了ServletRequestAware接口,如下:

public interface ServletRequestAware {
public void setServletRequest(HttpServletRequest request);
}

上一页 [1] [2] [3] [4] [5] 下一页


访问() 相关评论() 打印资源 返回顶部 加入收藏

最新评论