2012-09-07 48 views
7

基於一個Java EE架構開發的應用程序這是我第一次經歷,我使用如何在Spring 3.1應用程序中聲明JSF託管bean?

  • JSF 2.0
  • 春3.1
  • JPA 2.0

我想問你請有關一個我有點困惑的問題。我想聲明我的JSF託管bean,但有很多解決方案來處理這個約束:

  1. 在faces-config.xml中聲明管理的bean。
  2. 用@ManagedBean註釋覆蓋我的控制器。
  3. 用@Controller批註覆蓋我的控制器。

我的問題是:這三種解決方案有什麼不同?以及我應該在ApplicationConfig.java或/和web.xml中做什麼更改?!關於Spring,我應該在web.xml中添加一些監聽器嗎?!

我真的試過閱讀很多教程和例子,但每次我發現自己被封鎖了!

回答

23

在集成Spring和JSF時,你真的不能成爲任何一種技術的初學者,因爲它們不能很好地協作。我對你的第一個也是最好的建議是在嘗試集成它們之前,先閱讀一些關於JSF和Spring的書籍,並且分別理解它們。

就這麼說,JSF是一個基於組件的Web框架,其重點在於MVC。 Spring是一種不依賴於Web應用程序的依賴注入和控制反轉框架。

如果你不明白,這三個條件是:控制

  • 基於組件的Web框架

  • 依賴注入

  • 反轉

然後我建議是,你只是停止你所做的事情並立即開始閱讀。

整合這兩件事情的主要問題是需要解決的兩個框架之間的責任重疊。 JSF作爲一個獨立的框架來維護自己託管的bean的範圍,而不需要單獨的DI框架。然而,當介紹Spring時,自然會有衝突。除了JSF,Spring管理自己的Beans,所以爲了引用這些ManagedBeans並將業務對象或DAO正確注入到它們中以供使用,JSF ManagedBeans需要成爲Spring控制器。

您可以用@Controller註釋聲明JSF ManagedBean。 Spring 3足夠聰明地認識到它是一個JSF託管bean,並且該bean名稱將是ManagedBean聲明的任何名稱。

@Controller 
@Scope("session") 
@ManagedBean(name="testBean") 

現在,這是處理,接下來的問題是,你的JSF實現傳來那個討厭的EL解析器。 EL解析器基本上就是這樣做的,它解決了在XHTML/JSF頁面上遇到的EL表達式。當引用testBean時,它將無法正確解析該名稱,因爲它是通過該名稱引用JSF託管bean,並且無法找到具有所需的所有Spring注入依賴項的Spring Controller。

Spring 3通過爲您提供一個自定義EL Resolver來解決此問題,以代替與您的JSF實現捆綁在一起的自定義EL Resolver。你可以聲明它被使用在faces-config.xml

<application> 
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> 
</application> 

現在總算:

要我把某種聽衆在我的web.xml?!

如果你只是整合JSF +春,而不需要任何其他彈簧控制servlet或無需Spring Security的整合則沒有你不需要在你的web.xml任何附加。您只需要聲明FacesServlet及其上下文參數,以及可能對您的情況所需的任何其他第三方組件庫servlet。

+2

很好的解釋。謝謝! – Kris