2

要在 Struts 2 中获取 servlet 请求,我们可以使用ServletRequestAwareServletActionContext。但是,在特定的 Internet资源中,被告知ServletRequestAware 应该使用 . 而不是ServletActionContext.

这是否与ServletActionContext 在多线程环境中将成为共享资源的事实有关,或者这背后是否有任何其他原因?

4

2 回答 2

6

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

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

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

于 2014-11-02T22:09:13.713 回答
0

ServletActionContext是一个仅包含静态方法的助手类,其中一个用于从操作上下文中检索 servlet 请求。但是动作上下文是ThreadLocal,所以不能在多线程环境中共享。

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

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

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

于 2014-11-02T12:13:16.873 回答