2015-09-04 46 views
2

我一直在使用Struts 2很长一段时间。Struts 2中的SessionAware设计

如果执行SessionAware接口我们的动作类我们会得到SessionMap但不是HttpSession对象。

ServletRequestAwareServletResposeAware情况下,我们得到的SessionAware情况下,像SessionMapHttpServletRequestHttpServletResponse对象,但没有包装对象。

我的问题是,如果Struts是给我们SessionMap而不是HttpSession脱钩我们从Servlet API中和HTTP协议操作类,那么为什么它给我们的情况下,ServletRequestAwareServletResponseAwareHttpServletRequestHttpServletResponse对象。

如果Struts不希望将Servlet API和HTTP协议从操作类中分离出来,那么为什么它在SessionAware接口的情况下给我们提供了SessionMap

为什么我们不会得到HttpSession对象?

回答

2

在ServlectRequestAware和ServletResposeAware的情况下,我们得到HttpServletRequest和HttpServletRespose对象,但在SessionAware的情况下,不包装器像SessionMap对象。

因为那些直接暴露在罕见的情况,其中它们实际上是必要的(或至少是有用的)的的servlet请求和响应。

我的问题是,如果支柱是给我们SessionMap而非HttpSession中解耦我们从Servlet API中和HTTP协议操作类,那么为什么它给我们的情况下,ServlectRequestAware和ServletResposeAware HttpServletRequest和HttpServletRespose对象。

因为它是不太可能你会特别需要HttpSession比实际请求或响应。

如果struts不希望从动作类中分离Servlet API和HTTP协议,那么为什么它在SessionAware接口的情况下给我们SessionMap。

确实想要解耦Servlet API,原因很充分。它迫使你明确地要求Servlet API工件,因为它们是代码味道。它不会阻止你没有得到它们,因为在极少数情况下它们很重要。

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

1

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

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

,可以通过这个拦截注入的接口列表:

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