2010-02-26 54 views
3

我剛剛開始使用JavaServer Faces,它看起來非常有吸引力。不過,我想在JSF的同一個Web應用程序中使用自己的servlet。如何將JSF與自定義servlet集成?

這可能非常明顯,但將JSF與「普通」基於servlet的應用程序集成的最佳實踐是什麼?這將包括從servlet訪問JSF數據(請閱讀並編寫)。

回答

8

如果你的servlet的寫得很好,他們應該已經有任何業務邏輯裏面,但只是單純的請求/響應控制/預處理/後處理邏輯。業務邏輯應該已經放置在獨立的類似於javabean的域/模型類中。數據庫邏輯應該已經放置在獨立的DAO類中。等等。你可以只用重用他們都在JSF中。也就是說,最好知道JSF(當在Servlet API之上運行時 - 通常情況下)管理請求範圍的bean作爲屬性HttpServletRequest,會話範圍的bean作爲屬性HttpSession,應用程序作爲ServletContext的屬性。通過ExternalContext#getRequestMap(),#getSessionMap()#getApplicationMap()可以獲得所有這些請求,會話和應用程序屬性也是很好的。您現在應該意識到,您可以從servlet內部以通常的方式訪問它們。

在任何情況下,當有技術需要訪問ServletFilterFacesContext,然後立即基於上述事實,停止編碼,並重新考慮你的方法。難道不應該在新的託管bean中完成嗎?或者可能是PhaseListener

+0

同意bean中的業務邏輯。我的方案更多地涉及到如何將用戶發送給servlet並向該servlet提供(可能有很多)參數。我認爲把它們放在請求中並轉發到servlet是有意義的。 我有些害怕JSF可能會使用一些奇怪的命名約定或某些東西(你知道,「_id0:_id0」),所以我期望不得不繞過來找到「user」bean的真實名稱。你的回答澄清了這一點。謝謝! – 2010-02-26 15:36:06

1

您不必將servlet與JSF集成。這與JSF的性質相反,JSF是「基於組件」而不是「基於行動」。

JSF已經管理了當您按下按鈕時調用其方法的bean。您同時具有請求和響應(使用FacesContext.getCurrentContext().getExternalContext()),但它們不是真的需要 - 所有數據都由JSF自動填充到託管bean的字段中。

如果你想不與JSF,但在相同的應用集成工作的servlet,那麼你就必須將它們映射到不與JSF Servlet的URL衝突的URL。