2009-11-02 66 views
1

在MVC應用程序的多個視圖之間共享公共對象的最佳方式是什麼?假設我有一個LoginController,它接受用戶名和密碼並對用戶進行身份驗證並加載其數據(帳戶信息,全名等)。我想在每個頁面上顯示此內容 - 例如「Welcome <user name>」的標題,您的賬戶中有<account value>。「我認爲我不應該將該用戶對象存儲在會話中。每個控制器都必須返回嗎?如何在MVC應用程序的多個視圖中顯示公共信息?

我對這個應用程序使用Spring框架,但我認爲不重要。必須有一些通用的方式來處理這個常見的用例。

更新

不知道這事,但我還需要用戶名作爲參數到其他控制器(主鍵返回在登錄時)。由於這只是返回但未顯示的用戶對象的另一個值,因此我認爲答案與顯示的數據相同。

+0

我認爲這個框架很重要 - 它會幫助某個人(他知道java比我更好)爲你提供更快的答案。在asp.net-mvc版本中,我們使用html助手來呈現常見的UI元素(例如登錄歡迎我們描述) – 2009-11-02 17:06:58

回答

2

你並不真正分享共同的對象 - 這是常見的數據(是的,被對象包裹)。比方說,你有一個最小的UserInfo類和一個相應的模板片段來顯示它。該片段將包含在您的觀點中。

但無論框架(以及如何將這個常見片段添加到視圖中),框架/模板引擎都需要找到'userInfo'綁定並獲取必需的字段。

除非您打算在每個頁面請求中打開您的(db)後端以獲取該信息,否則您需要將其緩存。通常這將在會議中。

1

如果有相當多的邏輯與通用元素相關聯,那麼使用ServletRequest.getRequestDispatcher()又名<jsp:include />執行子請求可能會更容易,那麼您可以通過「子控制器」再次完成整個請求處理循環,和「子視圖」。

編輯:看看Spring MVC HandlerInterceptor小號

0

我之前在Spring MVC應用程序由具有HandlerInterceptorJavadoc link)處理這個確切的使用情況下添加這些細節ModelAndView的所有頁面中我需要它。

由於HandlerInterceptor的整個目的是能夠通過一段代碼將許多請求和/或響應應用於通用功能,所以這是非常合適的。攔截器允許您掛接控制器的預處理或後處理步驟;並且您可以將您的UrlHandlerMapping配置爲只將攔截器應用於某些URL(或URL的模式),如果您願意的話。

+0

這看起來有助於通用邏輯,但是如何從HandlerInterceptor訪問用戶信息?我必須將它存儲在HandlerInterceptor可訪問的所有視圖中,對吧? – 2009-11-02 17:27:28

+0

是的。如果你正在使用Spring Security,那麼當前線程的主體很容易獲得(靜態的,這可能會讓人覺得奇怪) - SecurityContextHolder.getContext()。getAuthentication()。getPrincipal() – 2009-11-02 17:49:57

相關問題