Struts 2 中的 SessionAware 设计
SessionAware design in Struts 2
我已经和Struts2一起工作了很长时间。
如果为我们的操作实现 SessionAware
接口 class 我们将得到 SessionMap
而不是 HttpSession
对象。
在 ServletRequestAware
和 ServletResposeAware
的情况下,我们得到 HttpServletRequest
和 HttpServletResponse
对象,但在 [=11= 的情况下没有像 SessionMap
这样的包装对象].
我的问题是,如果 Struts 给我们 SessionMap
而不是 HttpSession
来将我们的操作 class 与 Servlet API 和 Http 协议分离, 那么为什么它给我们 HttpServletRequest
和 HttpServletResponse
对象以防 ServletRequestAware
和 ServletResponseAware
.
如果 Struts 不想将 Servlet API 和 HTTP 协议与操作 classes 分离,那么为什么它给我们 SessionMap
以防 SessionAware
界面.
为什么我们没有得到 HttpSession
对象?
Why we don't get HttpSession
object?
您可以从 servlet 的 HTTP 请求中获取此对象。没有理由定义额外的接口来将 HttpSession
注入到操作中。另一方面,Struts 为 HTTP 请求、会话、应用程序定义映射,以便使用 Map
接口更容易 access/modify 其属性。如果 servletConfig
interceptor 实现了相应的 xxxAware
接口,它可以将这些对象注入到操作中。
此拦截器可以注入的接口列表:
ServletContextAware
ServletRequestAware
ServletResponseAware
ParameterAware
RequestAware
SessionAware
ApplicationAware
PrincipalAware
In case of ServlectRequestAware and ServletResposeAware we get HttpServletRequest and HttpServletRespose object but not wrapper objects like SessionMap in case of SessionAware.
因为那些在实际需要(或至少有用)的极少数情况下直接公开 servlet 请求和响应。
My question is, if struts is giving us SessionMap instead of HttpSession to decouple our action classes from Servlet API and Http protocol,then why it is giving us HttpServletRequest and HttpServletRespose objects in case ServlectRequestAware and ServletResposeAware.
因为与实际请求或响应相比,您 需要 HttpSession
的可能性 多 。
If struts don't want to decouple Servlet API and HTTP protocol from the action classes then why it is giving us SessionMap in case of SessionAware interface.
它确实想要分离 Servlet API,这是有充分理由的。它迫使您明确要求 Servlet API 工件,因为它们是一种代码味道。它不会阻止你得到它们,因为在极少数情况下它们很重要。
HttpSession
几乎只是一个属性映射,它不包含通常对操作有用的信息。在更罕见的情况下,您仍然可以得到它。
我已经和Struts2一起工作了很长时间。
如果为我们的操作实现 SessionAware
接口 class 我们将得到 SessionMap
而不是 HttpSession
对象。
在 ServletRequestAware
和 ServletResposeAware
的情况下,我们得到 HttpServletRequest
和 HttpServletResponse
对象,但在 [=11= 的情况下没有像 SessionMap
这样的包装对象].
我的问题是,如果 Struts 给我们 SessionMap
而不是 HttpSession
来将我们的操作 class 与 Servlet API 和 Http 协议分离, 那么为什么它给我们 HttpServletRequest
和 HttpServletResponse
对象以防 ServletRequestAware
和 ServletResponseAware
.
如果 Struts 不想将 Servlet API 和 HTTP 协议与操作 classes 分离,那么为什么它给我们 SessionMap
以防 SessionAware
界面.
为什么我们没有得到 HttpSession
对象?
Why we don't get
HttpSession
object?
您可以从 servlet 的 HTTP 请求中获取此对象。没有理由定义额外的接口来将 HttpSession
注入到操作中。另一方面,Struts 为 HTTP 请求、会话、应用程序定义映射,以便使用 Map
接口更容易 access/modify 其属性。如果 servletConfig
interceptor 实现了相应的 xxxAware
接口,它可以将这些对象注入到操作中。
此拦截器可以注入的接口列表:
ServletContextAware
ServletRequestAware
ServletResponseAware
ParameterAware
RequestAware
SessionAware
ApplicationAware
PrincipalAware
In case of ServlectRequestAware and ServletResposeAware we get HttpServletRequest and HttpServletRespose object but not wrapper objects like SessionMap in case of SessionAware.
因为那些在实际需要(或至少有用)的极少数情况下直接公开 servlet 请求和响应。
My question is, if struts is giving us SessionMap instead of HttpSession to decouple our action classes from Servlet API and Http protocol,then why it is giving us HttpServletRequest and HttpServletRespose objects in case ServlectRequestAware and ServletResposeAware.
因为与实际请求或响应相比,您 需要 HttpSession
的可能性 多 。
If struts don't want to decouple Servlet API and HTTP protocol from the action classes then why it is giving us SessionMap in case of SessionAware interface.
它确实想要分离 Servlet API,这是有充分理由的。它迫使您明确要求 Servlet API 工件,因为它们是一种代码味道。它不会阻止你得到它们,因为在极少数情况下它们很重要。
HttpSession
几乎只是一个属性映射,它不包含通常对操作有用的信息。在更罕见的情况下,您仍然可以得到它。