2015-09-04 136 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