分享
 
 
 

JSF和Spring集成

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

JSF和Spring集成的资料比较少,原理是获得彼此的上下文引用,以此进一步获得各自管理的bean,这是可能的,因为两者是web应用框架都遵循servlet规范,为二者整合提供了可能和基础.

在Spring中ApplicationContext是相当重要的类,对于web应用,它还包装了javax.servlet.ServletContext,为web应用提供了所有可以利用的数据,包括可管理bean,Faces中通过FacesContext类可以获得所有可以利用的资源,同样包括JSF的可管理支持bean,它们都围绕着ServletContext提供了自己的门面,通过各自的门面在Servlet容器的世界里彼此相通.

本文介绍两种方式,实现二者集成:

1. 通过写自己的类来完成二者的连通,实际上只是获得彼此世界里存活的bean,对于JSF中事件处理可能需要更进一步的构思和编码,为了这点,第二个方法介绍了一种框架.

2. 使用框架完成二者集成.

一 自己动手,下面的代码以示例为主,其它涉及的类和接口略去.

这个工具类提供在JSF世界里查找Spring管理的bean.也实现在Spring中查找JSF组件的方法.

package com.skysoft.rbac.dao;

import org.springframework.context.ApplicationContext;

import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.faces.context.FacesContext;

import javax.servlet.ServletContext;

import javax.faces.el.ValueBinding;

import javax.faces.FactoryFinder;

import javax.faces.application.Application;

import javax.faces.application.ApplicationFactory;

public final class SpringFacesUtil {

public SpringFacesUtil() {

}

/**

* 从Spring中查找bean.

* @param beanname String

* @return Object

*/

public static Object findBean(String beanname) {

ServletContext context = (ServletContext) FacesContext.getCurrentInstance().

getExternalContext().getContext();

ApplicationContext appctx = WebApplicationContextUtils.

getRequiredWebApplicationContext(context);

return appctx.getBean(beanname);

}

/**

* 从JSF中查找bean.

* @param beanname String

* @return Object

*/

public static Object lookupBean(String beanname) {

Object obj = getValueBinding(getJsfEl(beanname)).getValue(FacesContext.

getCurrentInstance());

return obj;

}

private static ValueBinding getValueBinding(String el) {

return getApplication().createValueBinding(el);

}

private static Application getApplication() {

ApplicationFactory appFactory = (ApplicationFactory) FactoryFinder.

getFactory(FactoryFinder.APPLICATION_FACTORY);

//FactoryFinder.FACES_CONTEXT_FACTORY

//FactoryFinder.RENDER_KIT_FACTORY

return appFactory.getApplication();

}

private static String getJsfEl(String value) {

return "#{" + value + "}";

}

}

下面定义一个由JSF管理的bean:

package com.skysoft.rbac.dao;

import javax.servlet.ServletContext;

import org.springframework.context.ApplicationContext;

import org.springframework.web.context.support.WebApplicationContextUtils;

import org.skysoft.struts.jsf.util.FacesUtils;

public class ServiceLocatorBean

implements ServiceLocator {

private static final String DAO_SERVICE_BEAN_NAME = "userDAO";

//这个dao就是由Spring提供的管理bean,这个dao可以使用Hibernate实现.

private UserDAO dao;

public ServiceLocatorBean() {

this.dao = (UserDAO)SpringFacesUtil.findBean(DAO_SERVICE_BEAN_NAME);

}

public UserDAO getDao() {

return dao;

}

}

下面是一个使用ServiceLocatorBean的类.

public class UserDAOImp

extends HibernateDaoSupport implements UserDAO {

private UserDAO dao;

private List list;

public UserDAOImp() {}

public List getList() {

if (list == null) {

list = dao.getList();

}

return list;

}

public UserDAO getDao() {

return dao;

}

public void setDao(UserDAO dao) {

this.dao = dao;

}

}

在faces-config.xml中的配置:

<managed-bean>

<managed-bean-name>serviceLocatorBean</managed-bean-name>

<managed-bean-class>com.skysoft.rbac.dao.ServiceLocatorBean</managed-bean-class>

<managed-bean-scope>session</managed-bean-scope>

</managed-bean>

<managed-bean>

<managed-bean-name>User</managed-bean-name>

<managed-bean-class>com.skysoft.rbac.User</managed-bean-class>

<managed-bean-scope>request</managed-bean-scope>

<managed-property>

<property-name>serviceLocator</property-name>

<property-class>com.skysoft.rbac.dao.ServiceLocatorBean</property-class>

<value>#{serviceLocatorBean}</value>

</managed-property>

</managed-bean>

在applicationContext.xml中的配置:

<bean id="userDAO" class="com.skysoft.rbac.dao.UserDAOImp">

<property name="sessionFactory">

<ref local="sessionFactory" />

</property>

</bean>

二 使用框架

1 介绍

这个框架是Spring相关项目,提供一个包de.mindmatters.faces.spring,这个包包含JSF和Spring框架综合集成的粘合代码,这些代码以独立于一个实现的方式完成,这样它能和任何JSF实现一起使用.

本包的提供的代码主要目的是尽可能透明的集成两个框架,主要特征:

l JSF/JSP开发者应该能访问Spring管理的Beans,就好象它们是由JSF管理的.

l JSF可管理beans应能集成入Spring.

l RequestHandledEvent事件也应该能被发布到Spring.

2 JSF配置集成

本包构造了一个基于faces配置文件(e.g. /WEB-INF/faces-config.xml)的WebApplicationContext类, 让它成为遵循"spring-beans" DTD配置文件(e.g. defined in /WEB-INF/applicationContext.xml)来配置的ApplicationContext的孩子,这样依从"faces-config" DTD的WebApplicationContext就是全特征的,即自动拥有如下功能:

l JSF可管理beans实现了Spring的*Aware interfaces:

ApplicationContextAware

BeanFactoryAware

BeanNameAware

ResourceLoaderAware

ServletContextAware

l JSF可管理beans实现Spring的lifecycle interfaces:

InitializingBean

DisposableBean

l 实现Spring的FactoryBean interface

l 实现Spring的ApplicationListener interface

l 发布ApplicationEvent事件.

l 从资源中读取消息.

等等,更多可看Spring.

3 访问方式

1) 从JSF中程序化的访问Spring管理的beans.

因为在FacesWebApplicationContext和ApplicationContext之间有层次关系,所以你的JSF可管理支持beans能容易的实现ApplicationContextAware接口,并能通过getBean方法访问它而不管它是否定义在FacesWebApplicationContext中还是定义在父ApplicationContext类对象中.

2) 通过JSF EL从JSF中访问Spring管理的beans.

能够使用JSF EL访问beans无论你引用的bean由JSF管理还是由Spring管理.两个bean上下文在存取时间合并.

a) 直接访问:

如果一个带有请求名字的bean只存在于Spring上下文内的话,这个bean被使用,bean的singleton属性设置被完全保持.

b) 区域化访问(scoped access):

如果你要从JSF定义bean的作用域的能力上得益还想让那个bean由Spring管理,那么就要在两个上下文中定义,只是对于JSF上下文中的定义的类类型要使用de.mindmatters.faces.spring.SpringBeanFactory类,你还应该设置那个bean的singleton属性到false,因这能覆盖你的作用域设置.在你使用JSF EL访问bean时,你总能获得一个遵从你在JSF上下文中定义的作用域设置的由Spring管理的bean的实例.

三 用法

通常,就象设置任何其它JSF web应用一样设置你的web应用,下面的样例配置展示怎样使能上面提到的特征。

在web.xml配置中必须加入下列配置条目,同时注意把该库的jsf-spring.jar放在适当的位置.

<web-app>

.........

<!--

过滤器用于向Spring发布RequestHandledEvent,它应该影射到和FacesServlet url相同的模式.

-->

<filter>

<filter-name>RequestHandled</filter-name>

<filter-class>de.mindmatters.faces.spring.support.RequestHandledFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>RequestHandled</filter-name>

<url-pattern>*.faces</url-pattern>

</filter-mapping>

<!--

这个侦听器用于装入Spring beans的父应用上下文.

-->

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

.........

</web-app>

下面的一些说明,都可以通过下载这个Spring相关项目得到,列在这里只为演示上面的说明的功能.

WEB-INF/faces-config.xml

<!-- 一个纯JSF管理的bean -->

<managed-bean>

<managed-bean-name>jsfBean</managed-bean-name>

<managed-bean-class>example.NameBean</managed-bean-class>

<managed-bean-scope>session</managed-bean-scope>

<managed-property>

<property-name>name</property-name>

</managed-property>

</managed-bean>

<!--一个SpringBeanScope用来定义Spring可管理bean的作用域.-->

<managed-bean>

<managed-bean-name>scopedAccessSpringBean</managed-bean-name>

<managed-bean-class>de.mindmatters.faces.spring.SpringBeanScope</managed-bean-class>

<managed-bean-scope>session</managed-bean-scope>

</managed-bean>

<!-- 这是一个纯JSF可管理bean,它持有一个到Spring可管理bean的一个引用. -->

<managed-bean>

<managed-bean-name>referencingBean</managed-bean-name>

<managed-bean-class>example.ReferencingBean</managed-bean-class>

<managed-bean-scope>session</managed-bean-scope>

<managed-property>

<property-name>referencedBean</property-name>

<value>#{managedPropertyAccessSpringBean}</value>

</managed-property>

</managed-bean>

WEB-INF/applicationContext.xml (partial)

<!-- 一个纯Spring的可管理bean -->

<bean id="directAccessSpringBean" class="example.NameBean"/>

<!-- 一个向JSF作用域提供的可管理bean. -->

<bean id="scopedAccessSpringBean" class="example.NameBean" singleton="false"/>

<!-- 一个纯Spring的可管理bean,它由一个JSF可管理bean引用.(当然了,它也能被直接访问啦.) -->

<bean id="managedPropertyAccessSpringBean" class="example.NameBean" singleton="false"/>

参考:

http://jsf-spring.sourceforge.net/ JSF-Spring,Spring相关项目官方站点,提供本文介绍的框架下载以及实例下载.

http://www.javaworld.com/javaworld/jw-07-2004/jw-0719-jsf.html 一篇关于JSF和Spring的文章.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有