我已经和Struts 2合作了很长时间。
如果我们的操作类实现了IsIndeterminate
接口,我们将获得SessionAware
但不会获得SessionMap
个对象。
如果是HttpSession
和ServletRequestAware
,我们会获得ServletResposeAware
和HttpServletRequest
个对象,但HttpServletResponse
的情况下不会包含SessionMap
等包装对象。
我的问题是,如果Struts给我们SessionAware
而不是SessionMap
来将我们的操作类与Servlet API和Http协议分离,那么为什么它会给我们HttpSession
和{{ 1}} HttpServletRequest
和HttpServletResponse
中的对象。
如果Struts不想将Servlet API和HTTP协议从动作类中解耦,那么为什么在ServletRequestAware
接口的情况下它会给我们ServletResponseAware
。
为什么我们没有得到SessionMap
对象?
答案 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