为什么使用ServletRequestAware而不是ServletActionContext?

时间:2014-11-02 11:55:51

标签: java multithreading servlets struts2 actioncontext

要在Struts 2中获取servlet请求,我们可以使用ServletRequestAwareServletActionContext。但是,在特定互联网resource中,系统会告知应使用ServletRequestAware代替ServletActionContext

这是否与ServletActionContext将成为多线程环境中的共享资源这一事实有关,还是有其他原因?

2 个答案:

答案 0 :(得分:4)

ServletRequestAware是一种更好的方法,因为它将动作方法与静态访问器分离。

为了使用ServletActionContext测试某些内容,您需要模拟静态方法模拟请求。要测试ServletRequestAware方法,您只需要模拟请求。

虽然存在使模拟静态方法更容易的工具,但是更容易实现接口并传入模拟请求。这是 原因ServletRequestAware存在。

答案 1 :(得分:0)

ServletActionContext是一个辅助类,它只包含静态方法,其中一个用于从操作上下文中检索servlet请求。 但是动作上下文是ThreadLocal,因此无法在多线程环境中共享。

除了executeAndWait拦截器使用的后台线程外,Struts2中的每个请求也没有多线程环境。

使用ServletRequestAware的原因是因为如果堆栈中包含servletConfig拦截器,则可以获得获取servlet请求对象的方法。

您可以在任何地方使用ServletActionContext,但不保证会返回请求对象而不是null