在上面介绍的请求运作流程中,我们从高层次上谈及了一些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时, 需要注意以下问题:
相比较之下,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] 下一页