JSF和Spring的集成

JSF 和 Spring 集成 JSF和Spring集成的资料比较少,原理是获得彼此的上下文引用,以此进一步获得各自管理的bean,这是可能的,因为两者是web应用框架都遵循servlet规范,为二者整合提供了可能和基础. 立即下载
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;  
      }  
    } 
下面是一个使用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实现一起使用.
本包的提供的代码主要目的是尽可能透明的集成两个框架,主要特征:
◆JSF/JSP开发者应该能访问Spring管理的Beans,就好象它们是由JSF管理的.
◆JSF可管理beans应能集成入Spring.
◆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就是全特征的,即自动拥有如下功能:

1)JSF可管理beans实现了Spring的*Aware interfaces:
◆ApplicationContextAware
◆BeanFactoryAware
◆BeanNameAware
◆ResourceLoaderAware
◆ServletContextAware

2)JSF可管理beans实现Spring的lifecycle interfaces:
InitializingBean
DisposableBean
◆实现Spring的FactoryBean interface
◆实现Spring的ApplicationListener interface
◆发布ApplicationEvent事件.
◆从资源中读取消息.
等等,更多可看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> 
        .........  
             
        <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> 
       
         
        <listener> 
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
        </listener> 
        .........  
    </web-app> 
下面的一些说明,都可以通过下载这个Spring相关项目得到,列在这里只为演示上面的说明的功能.
WEB-INF/faces-config.xml

<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> 
 
       <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> 
 
<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) 
<bean id="directAccessSpringBean" class="example.NameBean"/> 
<bean id="scopedAccessSpringBean" class="example.NameBean" singleton="false"/> 
<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的文章.



JSF2整合Spring3------JSF学习笔记4 NULL 博文链接:https://miaoxianjie.iteye.com/blog/1571298 立即下载

相关推荐

Vscode+ROS/ROS2 开发调试基于ROS/ROS2应用环境配置

在ROS操作系统开发应用程序时,我们常常需要调试代码,验证程序的正确性。但是在用rosrun或者roslaunch启动节点后,若程序运行过程中发生错误而导致发生出错停止工作,这时候终端并不会输出具体的信息指出在何处发生了错误,具体错误的原因又是什么。往往仅仅是core dump 或者segmentation fault 等等一类的模糊提示。

Chasinglight的博客 5800

实现在js客户端对Spring的动态调用(一)

  一、目的: JS客户端在编写程序时,可以像调用本地方法一样调用服务器端的Spring中Bean的方法,实现对Spring的动态调用,从而减少客户端的每个请求都要配置成action的麻烦,使业务模块的开发只关注业务逻辑的展示页面的开发。 二、设计思路:1.服务器端利用Struts机制,提供统一的动态action,名称为DynamicAjaxAction,接收客户端的请求,并返回处理结果;...

开心就好 555

1991-2020年气候背景数据集

2011 年,国家气象信息中心对 1951-2010 年 2400 余个地面站气温、气压、降水、湿度、日照等 19 大要素项的定时观测资料和日极值资料中由数字化过程中引起的系统性问题(例如数字化遗漏、整段拷贝等问题)进行质量检测、质量控制和错误数据的更正,形成较高质量的地面基础资料集。1991-2020年中国地面气候值数据集提供了中国2438个站点的气温、降水、气压、风向风速、相对湿度、水汽压、云、天气现象、能见度、蒸发、积雪、地温、冻土、日照共14个要素的气候背景信息。数据时间:30年平均。

地球资源数据云的官方博客 1597

Spring JavaScript Quick Reference

11.1. Introduction Spring Javascript (spring-js) is a lightweight abstraction over common JavaScript toolkits such as Dojo. It aims to provide a common client-side programming model fo...

teamojiao的专栏 227

APM 飞行模式切换--源码详解

APM飞控中有很多种方式可以改变飞行模式。其中最常见的为遥控器切换和地面站切换两种方式。 下面以遥控器切换为例详解飞行模式切换逻辑。 APM遥控器切换飞行模式的源代码在RC_Channel.cpp文件中的RC_Channel_Copter::do_aux_function_change_mode()函数中。 const bool success = copter.set_mode()调用Copter::set_mode()函数,在set_mode()函数中调用mode_fro...

qq_30623591的博客 2440

Docker网络教程(四)macvlan 网络教程

在这种网络下,Docker 宿主机在它的IP之上,允许接受多个 MAC 地址的请求,然后再将这些请求路由至对应的容器里。流通,Docker 会用它的 MAC 地址,把流量路由进你的容器里。对于网络上的网络设备来说,你的容器似乎是物理上连接到网络上的。),Docker使用其MAC地址将流量路由到你的容器。对于网络上的网络设备来说,你的容器似乎是物理上连接到网络上的。你需要 3.9 或者更高版本的 Linux 内核,4.0 以及以上的版本是更好的。如果你的设备叫别的名字,用对应的名字代替。

weixin_42445065的博客 4132

spring js

http://stsmedia.net/spring-finance-part-4-spring-js-dojo-bean-validation/ 转载于:https://www.cnblogs.com/zhangliang0115/archive/2012/02/23/2365147.html

weixin_30617695的博客 842

YOLO26涨点改进 | 全网独家创新,注意力改进篇| SCI一区Top | 引入AFCA自适应细粒度通道注意力,联合建模全局与局部通道依赖关系,适合目标检测、图像去雾、关键点检测、图像分类、图像分割

🔥本文提出了一种基于AFCA(自适应细粒度通道注意力)模块改进的YOLO26目标检测网络。AFCA通过联合建模全局与局部通道依赖关系,实现了更精细的通道注意力分配,能够增强目标相关特征并抑制背景噪声。该模块采用自适应融合策略动态平衡通道权重,在保持轻量级结构的同时,显著提升了小目标和复杂背景下的检测性能。文章详细介绍了AFCA的结构原理、实现优势,并提供了完整的代码实现和YAML配置文件,指导读者如何将该模块集成到YOLO26框架中。实验结果表明,AFCA在检测精度和鲁棒性方面优于传统注意力机制。

Ai缝合怪、助力小伙伴高效发论文 302

spring 关于引入js、css文件问题

最近项目中遇到引入JS文件失败,页面调式发现404错误,提示找不到引入文件,之前对这一部分一知半解,为此现在查看了很多资料和书籍,网上参考如下: http://www.cnblogs.com/shinejaie/p/5258630.html http://blog.youkuaiyun.com/taijianyu/article/details/44672035 http://blog.csdn.n

qq_36856975的博客 509

手把手教你学Simulink--基于储能系统的建模与仿真场景:-锂电池储能系统充放电管理策略仿真

《锂电池储能系统充放电管理的Simulink建模与仿真》摘要 本文详细介绍了使用Simulink+SimscapeElectrical对锂电池储能系统进行充放电管理策略建模的全过程。从系统结构设计入手,重点阐述了锂电池模型、充放电控制器、热管理系统等核心模块的搭建方法,并提供了完整的仿真流程。文章详细说明了如何实现荷电状态管理、温度控制和功率限制等关键策略,通过仿真分析了电池电压、电流、SoC和温度等关键指标的变化规律。最后提出了基于仿真结果的优化建议,包括参数整定、算法改进等方面,为锂电池储能系统的安全高

MHD0815的博客 1万+

Python 爬虫实战:抓取应届生求职网校招岗位信息,助力学子就业

应届生求职网作为国内知名的招聘平台,汇聚了大量企业的校招岗位信息。了解这些岗位信息,对于应届毕业生制定求职策略、企业制定招聘计划以及相关就业市场分析等都具有重要意义。因此,本文将深入探讨如何运用 Python 爬虫技术从应届生求职网平台抓取校招岗位信息,为应届毕业生提供有益的就业信息支持。本文深入探究了利用 Python 爬虫技术从应届生求职网平台抓取校招岗位信息的全流程。从前期的环境搭建、模拟登录,到核心的数据抓取、存储,再到后续的数据分析与可视化,都详细展开讲解并提供代码支持。

u014481728的博客 1300

Spring的基本使用

??

m0_67393619的博客 356

【人工智能之深度学习】23. 推荐系统升级实战:LightGCN重构协同过滤全流程(Amazon-Beauty数据集+完整代码)

摘要:传统协同过滤(如矩阵分解)在电商推荐中存在三大痛点:忽略用户-物品高阶关联、交互数据稀疏导致冷启动、特征工程依赖人工设计。本文基于Amazon-Beauty数据集(含20万+用户交互),用LightGCN图神经网络重构推荐系统:1)构建用户-物品二部图,通过3层图卷积捕捉“用户→物品→用户”的多跳关联;2)采用BPR负采样损失优化嵌入学习,缓解数据稀疏;3)端到端输出用户/物品嵌入,无需人工特征。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1493

JSF和Spring的集成之一

JSF和Spring集成的资料比较少,原理是获得彼此的上下文引用,以此进一步获得各自管理的bean,这是可能的,因为两者是web应用框架都遵循servlet规范,为二者整合提供了可能和基础。   在 Spring中ApplicationContext是相当重要的类,对于web应用,它还包装了 javax.servlet.ServletContext,为web应用提供了所有可以利用的数据,包括可...

yingfang05 125

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jsf集成spring_Spring和JSF集成:导航

jsf集成spring 我希望这是有关我在Spring和JavaServer Faces之间提供深度集成的努力的一系列博客中的第一篇。 这里提到的所有内容都是“正在进行中的工作”,因此,如果您签出代码,请注意它是一个不断变化的目标。 期待一些粗糙的边缘,如果有时会断裂,不要感到惊讶。 您已经可以很轻松地将Spring与JSF结合使用,Spring可以管理bean,而JSF可以处理屏幕。 Sp...

最佳 Java 编程 238

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jsf集成spring_Spring和JSF集成:转换器

jsf集成spring 使用任何Web框架时,都不可避免地需要将用户输入的数据从String为其他类型。 尽管Spring和JSF在设计和功能上确实有很大的不同,但它们都具有转换器策略来处理此问题。 让我们从春天开始。 Spring 3引入了一个全新的转换框架,该框架允许将任何类型的对象转换为任何其他类型(只要注册了适当的转换器)。 基思·唐纳德(Keith Donald)撰写了有关新转换过...

最佳 Java 编程 192

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Spring和JSF集成:导航

我希望这是有关我在Spring和JavaServer Faces之间提供深度集成的努力的一系列博客中的第一篇。 这里提到的所有内容都是“正在进行中的工作”,因此,如果您签出代码,请注意它是一个不断变化的目标。 期待一些粗糙的边缘,如果有时会断裂,不要感到惊讶。 您已经可以很轻松地使用带有JSF的Spring,Spring可以管理bean和JSF来处理屏幕。 Spring Web Flow中...

最佳 Java 编程 260

jsf集成spring_Spring和JSF集成:异常处理

jsf集成spring 大多数JSF开发人员都会熟悉“发生错误”页面,当在他们的代码某处引发意外异常时,该页面就会显示。 该页面在开发时确实很有用,但对于生产应用程序通常不是您想要的。 通常,在使用库存JSF替换此页面时,通常有两种选择。 您可以在web.xml中使用定义一些HTML <error-page>元素, 也可以 编写自定义ExceptionHandler 这两个选项都...

最佳 Java 编程 142

JSF和Spring集成

JSF和Spring集成的资料比较少,原理是获得彼此的上下文引用,以此进一步获得各自管理的bean,这是可能的,因为两者是web应用框架都遵循servlet规范,为二者整合提供了可能和基础. 在Spring中ApplicationContext是相当重要的类,对于web应用,它还包装了javax.servlet.ServletContext,为web应用提供了所有可以利用的数据,包括可管理bean

keepeye的专栏 3060

Spring和JSF集成:分页

处理大型数据集时,通常需要以分页格式显示数据。 分页是一个有趣的问题,因为它倾向于跨越应用程序的所有层,从视图层通过应用程序服务一直到对数据库的原始调用。 在获取分页数据时,有一些非常好的解决方案。 如果您使用的是JPA,则可能熟悉javax.persistence.Query可用的setFirstResult()和setMaxResult()方法。 更好的Spring Data J...

最佳 Java 编程 165

jsf集成spring_JSF 2,PrimeFaces 3,Spring 3和Hibernate 4集成项目

jsf集成spring 本文展示了如何集成JSF2,PrimeFaces3,Spring3和Hibernate4技术。 它为Java开发人员提供了一个通用的项目模板。 另外,如果Spring不用于业务和数据访问层,则可以提供JSF – PrimeFaces和Hibernate集成项目。 二手技术: JDK 1.6.0_31 春天3.1.1 JSF 2.1 Hiber...

最佳 Java 编程 154
上一篇: secureCRT的使用
下一篇: Ajax4Jsf 简单介绍
普通网友
博客等级 码龄15年 4粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值