JSF與Spring的集成
JavaServer Faces (JSF) 是一個基于組件的事件驅(qū)動框架。JSF 的組件集包含一個事件發(fā)布模型、一個輕量級的 IOC 容器和很多用于幾乎所有其他公共 GUI 特性的組件,這些特性包括可插入呈現(xiàn)、服務(wù)器端驗證、數(shù)據(jù)轉(zhuǎn)換、頁面導航管理等等,在某些場景下,將JSF與Spring進行集成是有意義的。
由于JSF與Spring均遵循Servlet,因此二者的集成是簡單的。JSF與Spring進行集成的關(guān)鍵類是DelegatingVariableResolver。
為了在JSF應(yīng)用程序中配置這個解析器,需要修改JSF的faces-context.xml文件。在<faces-config>元素中增加<application>和<variable-resolver>元素,而其中<variable- resolver>的值必須引用Spring的DelegatingVariableResolver。示例如下:
- <faces-config>
- <application>
- <variable-resolver>org.springframework.web. jsf.DelegatingVariableResolver</variable-resolver>
- <locale-config>
- <default-locale>zh_CN</default-locale>
- <supported-locale>en</supported-locale>
- <supported-locale>zh_CN</supported-locale>
- </locale-config>
- <message-bundle>messages</message-bundle>
- </application>
- </faces-config>
DelegatingVariableResolver類將首先在JSF實現(xiàn)中查找缺省的解析器,其后在Spring的WebApplicationContext中去查找,從而開發(fā)人員可以通過配置文件將對象依賴注入到JSF管理的bean。被管理的bean定義在faces-config.xml文件內(nèi)。下例說明了如何從Spring的業(yè)務(wù)環(huán)境中檢索名為#{userManager}的bean:
- <managed-bean>
- <managed-bean-name>userList</managed-bean-name>
- <managed-bean-class>com.example.jsf.UserList</managed-bean-class>
- <managed-bean-scope>request</managed-bean-scope>
- <managed-property>
- <property-name>userManager</property-name>
- <value>#{userManager}</value>
- </managed-property>
- </managed-bean>
此外需要在web.xml配置文件中加入如下代碼:
- <listener>
- <listener-class>org.springframework.web.context. ContextLoaderListener</listener-class>
- </listener>
- <context-param>
- <param-name>javax.faces.CONFIG_FILES</param-name>
- <param-value>
- /WEB-INF/faces-config.xml
- </param-value>
- </context-param>
- <context-param>
- <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
- <param-value>client</param-value>
- </context-param>
- <servlet>
- <servlet-name>Faces Servlet</servlet-name>
- <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>Faces Servlet</servlet-name>
- <url-pattern>*.jsf</url-pattern>
- </servlet-mapping>
注意Listener是Servlet API的V2.3版本后才引入的特性,如果使用Servlet 2.2容器,則需要使用ContextLoaderServlet來實現(xiàn)同樣的功能。
現(xiàn)在網(wǎng)上有些關(guān)于JSF前景的爭議,尤其SUN在這方面工作的滯后更令人非議。而似乎Spring的WebFlow將會更加流行。其實爭議與否,就具體的應(yīng)用而言,只要能夠滿足用戶的需求即可,其余的都不是主要的因素。
【編輯推薦】