要在Struts 2中获取servlet请求,我们可以使用ServletRequestAware
或ServletActionContext
。但是,在特定互联网resource中,系统会告知应使用ServletRequestAware
代替ServletActionContext
。
这是否与ServletActionContext
将成为多线程环境中的共享资源这一事实有关,还是有其他原因?
答案 0 :(得分:4)
ServletRequestAware
是一种更好的方法,因为它将动作方法与静态访问器分离。
为了使用ServletActionContext
测试某些内容,您需要模拟静态方法和模拟请求。要测试ServletRequestAware
方法,您只需要模拟请求。
虽然存在使模拟静态方法更容易的工具,但是更容易实现接口并传入模拟请求。这是 原因ServletRequestAware
存在。
答案 1 :(得分:0)
ServletActionContext
是一个辅助类,它只包含静态方法,其中一个用于从操作上下文中检索servlet请求。
但是动作上下文是ThreadLocal,因此无法在多线程环境中共享。
除了executeAndWait
拦截器使用的后台线程外,Struts2中的每个请求也没有多线程环境。
使用ServletRequestAware
的原因是因为如果堆栈中包含servletConfig
拦截器,则可以获得获取servlet请求对象的方法。
您可以在任何地方使用ServletActionContext
,但不保证会返回请求对象而不是null
。