我已经使用 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 这样的包装对象。
因为它们在极少数情况下确实有必要(或至少有用),直接公开servlet
请求和响应。
我的问题是,如果struts给我们SessionMap而不是HttpSession来将我们的动作类与Servlet API和Http协议解耦,那么为什么它给我们HttpServletRequest和HttpServletRespose对象以防ServlectRequestAware和ServletResposeAware。
因为与实际请求或响应相比,您特意需要
SessionAware
的可能性较小。 如果 struts 不想将 Servlet API 和 HTTP 协议与操作类解耦,那么为什么它在 SessionAware 接口的情况下为我们提供 SessionMap。
它确实
想要解耦 Servlet API,这是有充分理由的。它迫使您显式请求 Servlet API 工件,因为它们有代码味道。它不会阻止
您获得它们,因为在极少数情况下它们很重要。
HttpSession
几乎只是一个属性映射,它不包含在操作中通常有用的信息。在更罕见的情况下,您仍然可以得到它。
为什么我们没有得到
HttpSession
对象?您可以从servlet的HTTP请求中获取该对象。没有理由定义额外的接口来将
HttpSession
注入到操作中。另一方面,Struts 定义了 HTTP 请求、会话、应用程序的映射,以便使用HttpSession
接口更轻松地访问/修改其属性。如果
HttpSession
拦截器实现了相应的
Map
接口,则可以将这些对象注入到操作中。
该拦截器可以注入的接口列表:
servletConfig
xxxAware
ServletContextAware
ServletRequestAware
ServletResponseAware
ParameterAware
RequestAware
SessionAware