16.3.JavaServer Faces
16.3. JavaServer Faces
JavaServer Faces (JSF) 是一个基于组件的,事件驱动的 Web 框架。这个框架很受欢迎。 Spring 与 JSF 集成的关键类是 DelegatingVariableResolver
。
16.3.1. DelegatingVariableResolver
将 Spring 中间层与 JSF Web 层整合的最简单办法就是使用 DelegatingVariableResolver
类。 要在应用中配置变量解析器(Variable Resolver),你需要编辑 faces-context.xml 文件。 在 <faces-config/>
元素里面增加一个 <application/>
元素和一个 <variable-resolver/>
元素。 变量解析器的值将引用 Spring 的 DelegatingVariableResolver
。
<faces-config> <application> <variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver> <locale-config> <default-locale>en</default-locale> <supported-locale>en</supported-locale> <supported-locale>es</supported-locale> </locale-config> <message-bundle>messages</message-bundle> </application> </faces-config>
DelegatingVariableResolver
首先会将查询请求委派到 JSF 实现的 默认的解析器中,然后才是 Spring 的“business context” WebApplicationContext
。 这使得在JSF 所管理的 bean 中使用依赖注射非常容易。
JSF 所管理的 bean 都定义在 faces-config.xml
文件中。 下面例子中的 #{userManager}
是一个取自 Spring 的“business context”的 bean。
<managed-bean> <managed-bean-name>userList</managed-bean-name> <managed-bean-class>com.whatever.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>
16.3.2. FacesContextUtils
如果所有属性已经映射到 faces-config.xml 文件中相关的bean, 一个自定义的 VariableResolver
也可以工作的很好。 但是有些情况下你需要显式获取一个bean。这时, FacesContextUtils
可以使这个任务变得很容易。它类似于 WebApplicationContextUtils
, 不过它接受 FacesContext
而不是 ServletContext 作为参数。
ApplicationContext ctx = FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance());
我们推荐使用 DelegatingVariableResolver
实现 JSF 和 Spring 的集成。 如果你想要更全面的集成,可以看看 JSF-Spring 这个项目。