为什么 SessionAware 在 Struts 2 中注入 SessionMap 而不是 HttpSession?

问题描述 投票:0回答:2

我已经使用 Struts 2 很长时间了。

如果在我们的操作类中实现

SessionAware
接口,我们将得到
SessionMap
,但不是
HttpSession
对象。

ServletRequestAware
ServletResposeAware
的情况下,我们得到
HttpServletRequest
HttpServletResponse
对象,但在
SessionMap
的情况下,不会得到像
SessionAware
这样的包装对象。

我的问题是,如果 Struts 为我们提供

SessionMap
而不是
HttpSession
来将我们的操作类与 Servlet API 和 HTTP 协议解耦,那么为什么它在
HttpServletRequest
HttpServletResponse
如果 Struts 不想将 Servlet API 和 HTTP 协议与操作类解耦,那么为什么它在 
ServletRequestAware
接口的情况下为我们提供

ServletResponseAware

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


  

在 ServlectRequestAware 和 ServletResposeAware 的情况下,我们得到 HttpServletRequest 和 HttpServletRespose 对象,但在 SessionAware 的情况下,没有像 SessionMap 这样的包装对象。
servlets struts2 struts httprequest httpsession
2个回答
2
投票
因为它们在极少数情况下确实有必要(或至少有用),直接公开

servlet

请求和响应。

我的问题是,如果struts给我们SessionMap而不是HttpSession来将我们的动作类与Servlet API和Http协议解耦,那么为什么它给我们HttpServletRequest和HttpServletRespose对象以防ServlectRequestAware和ServletResposeAware。

因为与实际请求或响应相比,您特意

需要

SessionAware

的可能性较小。 如果 struts 不想将 Servlet API 和 HTTP 协议与操作类解耦,那么为什么它在 SessionAware 接口的情况下为我们提供 SessionMap。


确实
想要解耦 Servlet API,这是有充分理由的。它迫使您显式请求 Servlet API 工件,因为它们有代码味道。它不会

阻止

您获得它们,因为在极少数情况下它们很重要。

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

为什么我们没有得到
HttpSession

对象?

1
投票
您可以从servlet的HTTP请求中获取该对象。没有理由定义额外的接口来将

HttpSession

 注入到操作中。另一方面,Struts 定义了 HTTP 请求、会话、应用程序的映射,以便使用 
HttpSession

接口更轻松地访问/修改其属性。如果

HttpSession

拦截器
实现了相应的
Map
接口,则可以将这些对象注入到操作中。
该拦截器可以注入的接口列表:
servletConfig

    xxxAware
  •  
      
  • ServletContextAware
  •  
      
  • ServletRequestAware
  •  
      
  • ServletResponseAware
  •  
      
  • ParameterAware
  •  
      
  • RequestAware
  •  
      
  • SessionAware
  •  
      
© www.soinside.com 2019 - 2024. All rights reserved.