JSF与Spring的集成
参考出处:
http://www.jroller.com/page/cagataycivici?entry=integrating_jsf_and_spring
http://www.springframework.org/docs/api/org/springframework/web/jsf/package-summary.html
今天看了一篇叙述JSF与Spring framework结合的文章,其实Spring的org.springframework.web.jsf 包里正是包含三个类来支持JSF web层与位于Spring中间层(位于Spring根节点WebApplicationContext)相集成, 和通过JSF的EL表达式访问位于WebApplicationContext中的bean。
使用上述的包可以有两种不同的方法来访问Spring管理下的bean。一种是使用delegating resolver,另一种使用FacesContextUtils。
方法1)Delegating Resolver
假设在JSF的managed bean当中使用一个FacadeService来委派各个action的任务到业务层,而且FacadeService依赖于另一个服务“SomeService”实现了接口“ISomeService”。“SomeService” 是通过Spring来管理。那么先定义FacadeService:
package yourpackagename;
public class FacadeService {
private ISomeService someService;
public ISomeService getSomeService() {
return someService;
}
public void setSomeService(ISomeService someService) {
this.someService = someService;
}
}
然后在faces-config.xml中定义FacadeService:
<managed-bean>
<managed-bean-name>facadeService</managed-bean-name>
<managed-bean-class>
yourpackagename.FacadeService
</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
<managed-property>
<property-name>someService</property-name>
<property-class>
packagename.ISomeService
</property-class>
<value>#{someService}</value>
</managed-property>
</managed-bean>
同时也要在faces-config.xml中定义delegating resolver,这里用spring的DelegatingVariableResolver来代替JSF默认的变量解析(variable resolver):
<code><variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver></code>
接下来定义spring bean xml让Spring来管理SomeService:
<code><bean id="someService" class="yourpackagename.SomeService"></bean></code>
以上就是所有需要配置的地方,最后仅仅需要把FacadeService加入到JSF后的代码里面:
protected FacadeService facadeService;
public FacadeService getFacadeService() {
if (facadeService == null) {
facadeService = (FacadeService) getFacesContext().getApplication()
.createValueBinding("#{facadeService}").getValue(getFacesContext());
}
return facadeService;
}
public void setFacadeService(FacadeService facadeService) {
this.facadeService = facadeService;
}
之后在任何jsf的code中访问spring中的bean就变为:
getFacadeService().getSomeService().someMethod();
这样就实现了JSF-Spring集成,Spring使用了inversion of control(IOC), 而facadeservice由Faces管理,以上全部都由spring的delegating variable resolver联系起来。
方法2)使用FacesContextUtils
FacesContextUtils是一个spring中的工具类,作用是便于获得一个给定的FacesContext中的根节点WebApplicationContext。
在spring配置xml中加入:
<bean id="someService" class="yourpackagename.SomeService"></bean>
在jsf应用的任何地方加入:
ISomeService someService = (ISomeService) FacesContextUtils
.getWebApplicationContext(FacesContext.getCurrentInstance())
.getBean("someService");
someService.someMethod();