- 向后兼容。 支持JSF 1.2涉及的工作太多,而Spring 3.1中出現了太多的好東西,可以忽略。
- MVC注釋為王。
@RequestMapping
似乎是大多數人的首選方法。 讓我們僅支持此功能,并將所有自定義注釋保持在最低限度。 - 減少依賴性。 重用東西很好,但這是一個集成項目,因此集成越少越好。
考慮到這一點,我決定以Web Flow的org.springframework.faces.mvc.JsfView
類為靈感。 該類非常好用,因為它只處理MVC
的View
,而Model
和Controller
完全保留在Spring領域中。 JsfView
的唯一問題是缺少回發支持。 我們需要以某種方式檢測對視圖的初始請求和任何后續的JSF回發之間的差異。
由于Spring MVC具有非常靈活的架構,因此這是完全可能的。 我們可以在DispatcherServlet
注冊多個HandlerMapping
和HandlerAdapter
bean。 為了支持JSF,我們需要在此鏈中的某個較高層來檢測和處理回發,而將不是回發的所有內容以常規方式處理。 這是事件的一般順序:
user dispatcher @controller| /some/request | ||-------------------->| maps to || |------------->| creates| | |------------> FacesView| | (/pages/file.xhtml)| | render || |-------------------------------->|| | [Delegate to JSF]| response |<--------------------------------||<--------------------|| || || /some/request || (postback) ||-------------------->| postback handler| |--------->|| | [Delegate to JSF]| response |<---------||<--------------------| || | |
回發處理程序有幾個有趣的問題要處理。 1)我們怎么知道我們是回發。 2)我們如何知道要還原的視圖。 顯然,回發將是HTTP POST
操作,但是我們不能盲目地假設所有POST
都是JSF回發。 我們還需要知道要還原的XHTML文件,但是該文件基于最后一個請求的@Controller
做出的決定。
這兩個問題的答案是編寫我們自己的JSF ResponseStateManager
。 ResponseStateManager
是JSF狀態管理基礎結構的一部分,并負責讀取和寫入組件狀態。 通常,JSF會將狀態數據保存在HTTP會話中,并在頁面內寫入一個隱藏的表單字段,以便以后可以還原。 使用這種機制,我們可以為MVC編寫一個附加字段,該字段的存在使我們知道我們有一個回發,而且該值還將使我們知道要還原的XHTML文件。
有了回發處理程序,我們現在可以充分利用Spring和JSF的優勢。 我們可以使用@RequestMapping
批注來構建富有表現力的URL,并使用JSF組件來呈現復雜的網頁。 如果愿意,我們甚至可以基于完全不同的技術為同一URL返回不同的視圖(例如,通過檢查HTTP標頭,我們可能決定返回JSF頁面或XML文檔)。
如果要查看回發處理程序代碼,可在此處獲得 。 通常是將代碼庫移動的注意事項。
參考: 集成Spring和JavaServer Faces: JCG合作伙伴 Phillip Webb的 MVC 細節 ? 在Phil Webb的Blog上 。
翻譯自: https://www.javacodegeeks.com/2012/03/spring-jsf-integration-mvc-nuts-and.html