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 这个项目。