JavaServer Faces (JSF) 是一个基于组件的,事件驱动的 Web 框架。这个框架很受欢迎。
Spring 与 JSF 集成的关键类是 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>
如果所有属性已经映射到 faces-config.xml 文件中相关的bean,
一个自定义的 VariableResolver 也可以工作的很好。
但是有些情况下你需要显式获取一个bean。这时,
FacesContextUtils 可以使这个任务变得很容易。它类似于
WebApplicationContextUtils,
不过它接受 FacesContext 而不是 ServletContext 作为参数。
ApplicationContext ctx = FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance());
我们推荐使用 DelegatingVariableResolver 实现 JSF 和 Spring 的集成。
如果你想要更全面的集成,可以看看
JSF-Spring 这个项目。