【问题标题】:Why use ServletRequestAware instead of ServletActionContext?为什么使用 ServletRequestAware 而不是 ServletActionContext?
【发布时间】:2014-12-29 05:03:25
【问题描述】:

要在 Struts 2 中获取 servlet 请求,我们可以使用ServletRequestAwareServletActionContext。然而,在特定的互联网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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-07
        • 1970-01-01
        • 1970-01-01
        • 2012-05-28
        • 2021-10-12
        • 2011-10-14
        相关资源
        最近更新 更多