您的位置:IT在中国 >> 在线课堂 >> JSP >> 正文
当我们继承这个接口后,我们原本简单的Action看起来有点复杂了,但是这时我们可以获取HttpServerRequest对象来使用了。
public class MyAction implements ServletRequestAware {
private HttpServletRequest request;
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public String execute() throws Exception {
// do the work using the request
return Action.SUCCESS;
}
}看起来现在这些属性是类级别的,并不是线程安全的,会出现问题。其实在Struts 2里并没有问题,因为每个请求过来的时候都会产生一个新的Action对象实例,它并没有和其他请求共享一个对象,所以不需要考虑线程安全问题。现在我们还有最后一步,就是为这个Action关联上ServletConfigInterceptor拦截器。这个拦截器提供了一系列功能去获取HttpServletRequest,并可以把它注入到实现了ServletRequestAware接口Action中。这时你并不需要担心如何配置这些,我们将在下一篇文章中有具体讲述。最重要的是让我们明白到是拦截器和接口共同合作下为Action提供了反转控制功能的。
这个设计的好处是能让Action和框架完全解耦。Action仅仅是一个与框架无关的简单POJO。这给单元测试带来极大的好处,Struts 2 Action的单元测试远比Struts Action使用StrutsTestCase或MockStrutsTestCase的单元测试简单。
总结/综述
到现在为止,你应该对Struts2的基础有所了解了——包括高层的框架概念和基础的请求流程。你也应该能自己动手在Servlet容器里配置Struts 2,并理解Struts和Struts 2两者之间在Action方面的差别了。
在下篇文章中,我们将会介绍一个详细的迁移的例子,同时我们也在这章学到的知识基础上,演示如何由Struts向Struts 2的Action迁移。在最后讲述如何在应用中使用JSTL、JSP和Struts2。我们会进一步探讨Struts和Struts 2在Action上的区别,Struts 2的配置和其他框架元素,和谈到更多的Action相关的框架特征。