JSF与Spring的整合原理

该文章转自iteye博客的kevinkevin1979

他的这篇文章写得挺好的,理解也挺到位,所以抄过来自己存储以便复习。

最近在学习JSF框架,还没有弄明白JSF中请求路径的处理,和页面与后台之间的参数传递。


Jsf做为Web框架,Spring做为业务层框架,两者可以结合起来用。只要在faces-config.xml中做一个很简单的配置: 


<faces-config> 
  <application> 
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> 
    ... 
  </application> 
</faces-config> 

理解这个配置,就需要接触到Java平台中一个常用的概念:Resolver。它的意思是“解决者”。
遇到一个陌生的东西,怎么 处理就需要找相应的Resolver。比如在一个视图文件jsp中,有这么一行: 


<h:outputText value="#{welcome.hello}"/> 

其中welcome是注册在Spring中的一个组件,并没有注册成Jsf的managed bean。当解析到#{welcome.hello}时候,Jsf框架去找注册的managed bean,当然它会找不到,系统在这个位置不会有任何显示。而当我们加上上面的el-resolver时,Jsf框架会在Spring框架中找。 

当然你也可以在managed bean配置中注入Spring管理的bean,例如: 
   <managed-property> 
      <property-name>welcome</property-name> 
      <property-class>guessNumber.Welcome</property-class> 
      <value>#{welcome}</value> 
    </managed-property> 

Jsf框架读取这个配置文件,也会到Spring中找到名字为“welcome”的bean. 

Jsf寻找的过程是一个职责链模式,它从一系列的Resolver中寻找需要的东西,一旦找到,即返回。这个链是有顺序的,这个顺序在Jsf Spec中有清晰的定义。比如有两个不同bean, 一个注册在Sping中,另一个注册在Jsf中,你不小心给了相同的名字,它会先去Sping中找,最终Spring中注册的bean起了作用。 

打开SpringBeanFacesELResolver源代码,我们可以看到它最终继承了一个抽线类:ELResolver。这个类中的方法都有一个参数ELContext,从ELContext中顺藤摸瓜得到servletContext,然后取出名字为"org.springframework.web.context.WebApplicationContext.ROOT"的变量,此变量即为Sping中的WebApplicationContext,有了这个,万事大吉,我们可以从中取出所有注册过的bean.那么又是谁把这个变量放到servletContext中了呢,当然是"org.springframework.web.context.ContextLoaderListener"了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值