Struts 2中的SessionAware设计

时间:2015-09-04 15:01:20

标签: servlets struts2 struts httprequest httpsession

我已经和Struts 2合作了很长时间。

如果我们的操作类实现了IsIndeterminate接口,我们将获得SessionAware但不会获得SessionMap个对象。

如果是HttpSessionServletRequestAware,我们会获得ServletResposeAwareHttpServletRequest个对象,但HttpServletResponse的情况下不会包含SessionMap等包装对象。

我的问题是,如果Struts给我们SessionAware而不是SessionMap来将我们的操作类与Servlet API和Http协议分离,那么为什么它会给我们HttpSession和{{ 1}} HttpServletRequestHttpServletResponse中的对象。

如果Struts不想将Servlet API和HTTP协议从动作类中解耦,那么为什么在ServletRequestAware接口的情况下它会给我们ServletResponseAware

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

2 个答案:

答案 0 :(得分:2)

  

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

因为那些直接暴露 servlet 请求和响应的极少数情况下他们确实需要(或至少是有用的)。

  

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

因为

  

如果struts不想将Servlet API和HTTP协议与动作类分离,那么为什么它会在SessionAware接口的情况下为我们提供SessionMap。

希望解析Servlet API,原因很简单。它强制您明确要求Servlet API工件,因为它们具有代码味道。它并没有阻止你获得它们,因为在极少数情况下它们非常重要。

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

答案 1 :(得分:1)

  

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

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

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

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