Servlets Struts 2中的SessionAware设计

Servlets Struts 2中的SessionAware设计,servlets,struts2,struts,httprequest,httpsession,Servlets,Struts2,Struts,Httprequest,Httpsession,我已经使用Struts 2很长时间了 在实现action类的SessionAware接口的情况下,我们将得到SessionMap但不是HttpSession对象 在ServletRequestAware和ServletResposeAware的情况下,我们得到HttpServletRequest和HttpServletResponse对象,但在SessionAware的情况下,不会得到像SessionMap这样的包装器对象 我的问题是,如果Struts给我们提供了SessionMap而不是Htt

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

在实现action类的
SessionAware
接口的情况下,我们将得到
SessionMap
但不是
HttpSession
对象

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

我的问题是,如果Struts给我们提供了
SessionMap
而不是
HttpSession
,将我们的操作类与Servlet API和Http协议解耦,那么为什么它在case
ServletRequestAware
servletresponse
中为我们提供
HttpServletRequest
ServletResponseAware
对象呢

如果Struts不想将Servlet API和HTTP协议与action类分离,那么在使用SessionAware接口的情况下,为什么它会给我们提供SessionMap

为什么我们不获取
HttpSession
对象

为什么我们不获取
HttpSession
对象

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

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

  • ServletContextAware
  • ServletRequestAware
  • ServletResponseAware
  • ParameterAware
  • RequestAware
  • SessionAware
  • ApplicationWare
  • Principalware
在ServeElectreQueestWare和ServletResposeAware的情况下,我们得到了HttpServletRequest和HttpServletRespose对象,但在SessionWare的情况下,没有像SessionMap这样的包装器对象

因为这些直接公开servlet请求和响应的情况很少,因为它们实际上是必要的(或者至少是有用的)

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

因为与实际请求或响应相比,您不太可能特别需要
HttpSession

如果struts不想将ServletAPI和HTTP协议与操作类分离,那么在SessionAware接口的情况下,为什么它会给我们SessionMap呢

出于充分的理由,它确实希望解耦Servlet API。它迫使您显式地请求Servlet API工件,因为它们是一种代码味道。它不会阻止你得到它们,因为在极少数情况下它们很重要

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