`
huhu0817
  • 浏览: 13855 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

JSF和Spring集成

阅读更多
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,因这能覆盖你的作用域设置.在你使用JSFEL访问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"/>
分享到:
评论

相关推荐

    JSF和Spring集成.doc

    ### JSF与Spring集成知识点详解 #### 一、概述 **JSF (JavaServer Faces)** 和 **Spring** 都是目前广泛使用的Java Web开发框架。JSF 是一个用于构建基于 Java 的 Web 应用程序的标准组件框架,而 Spring 框架则是...

    jsf+spring的jar包

    在JSF和Spring集成时,Spring可以作为JSF的后台服务层,处理业务逻辑和数据访问。通过Spring的JSF集成模块,如`spring-jsf.jar`(虽然这个文件不在当前列表中,但在实际集成中可能需要),可以使JSF和Spring之间的...

    jsf-spring:JSF 和 Spring 集成

    JSF 和 Spring 集成 本实验展示了如何设置 JSF 了解 Spring 组件以使用 Spring 依赖注入。 它是用 Maven 构建的,它使这个项目与 IDE 无关。 因此,构建和运行它很简单: mvn 全新安装 mvn码头:运行 然后,在某个 ...

    jsf+spring 实例

    SWF为JSF提供了更强大的流程控制能力,而SpringFaces则是Spring社区为了更好地集成JSF而创建的项目。 **4. 整合步骤** - 配置Spring:在Web应用的`web.xml`中配置Spring的DispatcherServlet,并添加Spring的上下文...

    JSF与Spring完美结合

    通过这个集成示例,开发者可以学习到如何在实际项目中整合JSF和Spring,以及如何在Tomcat服务器上部署和运行。这种结合使得开发人员能够利用JSF的强大UI功能和Spring的丰富企业服务,创建出高效、可维护的Web应用...

    jsf-spring-boot-starter-2.2.6.zip

    5. **配置**:集成JSF和Spring Boot时,需要配置Spring Boot的`application.properties`或`application.yml`文件,以启用JSF的Servlet和其他相关配置。 6. **开发实践**:在这样的集成环境下,开发者可以使用JSF的...

    jsf+hibernate+spring集成案例

    在这个"jsf+hibernate+spring集成案例"中,我们将看到: 1. **配置集成**:首先,我们需要在Spring配置文件中定义数据源、SessionFactory(Hibernate的核心组件)以及JSF所需的Managed Beans。这通常涉及到XML配置...

    JSF集成Spring_Framework和Hibernate开发应用实例

    【JSF集成Spring Framework和Hibernate开发应用实例】的详述 JavaServer Faces (JSF) 是一种基于MVC(Model-View-Controller)模式的Java EE应用程序用户界面框架,适用于构建复杂的Web应用。JSF提供了丰富的组件库...

    jsf-spring-4.0.3

    4. **安全整合**:如Spring Security可以与JSF集成,提供用户认证和授权功能。 5. **事务管理**:Spring的事务管理器可以控制JSF操作的数据持久化事务。 整合这两个框架可以帮助开发者利用JSF的强大UI组件和Spring...

    JSF+Spring+Hibernate的实例讲解.doc

    总之,JSF、Spring 和 Hibernate 的集成提供了强大的 Web 应用开发能力,涵盖了用户界面、业务逻辑和数据持久化的全方面需求。通过深入理解和实践这些技术,开发者可以构建出高效、可维护的大型企业级应用。如果你对...

    JSF+Spring+Hibernate(框架整合)详细过程

    1. **配置Spring**:首先,我们需要在Spring配置文件中定义Bean,包括JSF Managed Beans和Hibernate Session Factory。Bean的定义可以是XML配置或基于注解的方式。 2. **JSF与Spring的整合**:为了使JSF能够使用...

    JSF集成Spring、Hibernate

    在描述中提到的 **jar包完整版** 指的是为了运行JSF、Spring和Hibernate集成的项目,需要包含所有相关的库文件,如JSF的实现库、Spring的核心库、Hibernate的JAR文件,以及可能需要的其他依赖,如JDBC驱动(对于连接...

    jSF2.0与Spring整合实例+教程

    整合教程通常会涵盖这些步骤,指导开发者如何设置环境、配置Spring和JSF、创建并集成Managed Beans,以及处理页面事件和业务逻辑。通过学习这些教程,开发者可以有效地结合两者的优点,构建出高效、灵活且易于维护的...

    jsf+spring+hibernate

    JSF (JavaServer Faces)、Spring 和 Hibernate 是 Java 开发中的三大核心技术,常用于构建企业级的 Web 应用程序。它们各自扮演着不同的角色,共同构建了一个强大的后端架构。 1. **JSF(JavaServer Faces)**: ...

    jsf+spring 的 配置文件

    在Java世界中,JSF(JavaServer Faces)和Spring框架是两种常见的技术,它们分别用于构建用户界面和处理业务逻辑。JSF是一个用于构建MVC(Model-View-Controller)结构Web应用程序的Java标准,而Spring则是一个全面...

    jsf+springdatajpa

    在现代Web开发中,JavaServer Faces (JSF)、Spring Data JPA 和 MySQL 的组合是一种常见且强大的技术栈,用于创建数据驱动的Web应用程序。这些技术分别处理用户界面、数据访问和持久化以及关系型数据库管理,共同...

    JSF+Spring+Hibernate小例子

    5. **整合**:通过Spring的JSF集成库(如spring-jsf),将JSF的Managed Bean与Spring的bean关联起来,实现依赖注入。 6. **编写业务逻辑**:在Service层实现业务逻辑,调用DAO进行数据操作,确保事务的正确性。 7. *...

    JSF SPRING

    jsf与spring的集成的几种方式,以及jsf的一些技术

Global site tag (gtag.js) - Google Analytics