【问题标题】:Why use ServletRequestAware instead of ServletActionContext?为什么使用 ServletRequestAware 而不是 ServletActionContext?
【发布时间】:2014-12-29 05:03:25
【问题描述】:
要在 Struts 2 中获取 servlet 请求,我们可以使用ServletRequestAware 或ServletActionContext。然而,在特定的互联网resource 中,它被告知应该使用ServletRequestAware 而不是ServletActionContext。
这是否与ServletActionContext 将成为多线程环境中的共享资源这一事实有关,或者这背后是否有任何其他原因?
【问题讨论】:
标签:
java
multithreading
servlets
struts2
actioncontext
【解决方案1】:
ServletRequestAware 是一种更好的方法,因为它将操作方法与静态访问器分离。
为了使用ServletActionContext 进行测试,您需要模拟静态方法并模拟请求。要测试 ServletRequestAware 方法,您只需要模拟请求。
虽然存在使模拟静态方法更容易的工具,但实现接口并传入模拟请求更容易。这是ServletRequestAware 存在的原因。
【解决方案2】:
ServletActionContext 是一个仅包含静态方法的助手类,其中一个用于从操作上下文中检索 servlet 请求。
但是action context是ThreadLocal,所以不能在多线程环境下共享。
在 Struts2 中,每个请求也没有多线程环境,除了 execAndWait interceptor 使用的后台线程。
之所以使用ServletRequestAware是因为如果堆栈中包含servletConfig拦截器,它是获取servlet请求对象的保证方法。
您可以在任何地方使用ServletActionContext,但它不保证会返回请求对象而不是null。