Struts 2 中的 SessionAware 设计

SessionAware design in Struts 2

我已经和Struts2一起工作了很长时间。

如果为我们的操作实现 SessionAware 接口 class 我们将得到 SessionMap 而不是 HttpSession 对象。

ServletRequestAwareServletResposeAware 的情况下,我们得到 HttpServletRequestHttpServletResponse 对象,但在 [=11= 的情况下没有像 SessionMap 这样的包装对象].

我的问题是,如果 Struts 给我们 SessionMap 而不是 HttpSession 来将我们的操作 class 与 Servlet API 和 Http 协议分离, 那么为什么它给我们 HttpServletRequestHttpServletResponse 对象以防 ServletRequestAwareServletResponseAware.

如果 Struts 不想将 Servlet API 和 HTTP 协议与操作 classes 分离,那么为什么它给我们 SessionMap 以防 SessionAware界面.

为什么我们没有得到 HttpSession 对象?

Why we don't get HttpSession object?

您可以从 servlet 的 HTTP 请求中获取此对象。没有理由定义额外的接口来将 HttpSession 注入到操作中。另一方面,Struts 为 HTTP 请求、会话、应用程序定义映射,以便使用 Map 接口更容易 access/modify 其属性。如果 servletConfig interceptor 实现了相应的 xxxAware 接口,它可以将这些对象注入到操作中。

此拦截器可以注入的接口列表:

  • ServletContextAware
  • ServletRequestAware
  • ServletResponseAware
  • ParameterAware
  • RequestAware
  • SessionAware
  • ApplicationAware
  • PrincipalAware

In case of ServlectRequestAware and ServletResposeAware we get HttpServletRequest and HttpServletRespose object but not wrapper objects like SessionMap in case of SessionAware.

因为那些在实际需要(或至少有用)的极少数情况下直接公开 servlet 请求和响应。

My question is, if struts is giving us SessionMap instead of HttpSession to decouple our action classes from Servlet API and Http protocol,then why it is giving us HttpServletRequest and HttpServletRespose objects in case ServlectRequestAware and ServletResposeAware.

因为与实际请求或响应相比,您 需要 HttpSession 的可能性

If struts don't want to decouple Servlet API and HTTP protocol from the action classes then why it is giving us SessionMap in case of SessionAware interface.

确实想要分离 Servlet API,这是有充分理由的。它迫使您明确要求 Servlet API 工件,因为它们是一种代码味道。它不会阻止你得到它们,因为在极少数情况下它们很重要。

HttpSession 几乎只是一个属性映射,它不包含通常对操作有用的信息。在更罕见的情况下,您仍然可以得到它。