如何以编程方式注册 JSF 托管 bean?

2023-11-25

我想以编程方式(从 Servlet init() 内)将托管 Bean 类注册/添加到应用程序范围中。 我如何使用 JSF 1.2 做到这一点?


对于所有范围的托管 bean,不太可能从您的应用程序中以编程方式执行此操作。 BalusC 已经指出了如何对应用程序范围的托管 bean 执行此操作。

了解了如何在 Mojarra 2.1(JSF 2.1 实现)中注册托管 bean;没有很多优雅的选项可用于以编程方式注册会话和请求范围的 bean。简而言之,您要么必须调用实现特定的类,要么必须创建和销毁,即自己管理 bean,而不是依赖 JSF 实现来执行此操作。

使用 bean 填充请求和会话范围(非托管方式)

注意 - 这称为“非托管方式”,因为您正在构建 bean,而不是容器。注释如@PostConstruct and @PreDestroy除非您自己处理它们并调用适当的方法,否则将不起作用。即使依赖注入也不起作用。

EL 表达式总是在运行时求值,因此它为您提供了足够的机会在求值之前用 beans 填充作用域(如果您有机会这样做,这可能会搬起石头砸自己的脚)。在 Mojarra(可能还有其他 JSF 实现)中,EL 解析器将依赖 ScopeHandler(或等效类)的服务来解析 EL 表达式值。 Mojarra 使用类ApplicationScopeHandler, RequestScopeHandler and SessionScopeHandler获取不同范围的值。

您可以在创建新会话之后或在 JSF 实现处理请求之前填充 Session 和 Request 范围的内容。

可以完成会话范围填充(理想情况下使用HttpSessionListener) using:

HttpSession session = request.getSession(false);
session == null ? null : session.setAttribute("<keyname>", new Bean());

The keyname必须与您用于在 EL 表达式中引用 bean 的值匹配。

以类似的方式,您可以使用以下方式填充请求范围(最好在过滤器中完成):

ServletRequest request = ... // get the reference to the servlet request object
request.setAttribute("<keyname>", new Bean());

如果您需要了解这是如何工作的,您应该看看这些类com.sun.faces.context.SessionMap, com.sun.faces.context.RequestMap and com.sun.faces.context.ApplicationMap看看上下文映射是如何在内部管理的,以及如何被使用的SessionScopeHandler, RequestScopeHandler and ApplicationScopeHandler属于静态内部类的类ScopeManager(另一个静态内部)类com.sun.faces.mgbean.BeanManager班级。这BeanManagerclass 是包含托管 bean 注册的类,下一节将讨论如何“侵入”Mojarra 的注册过程。

使用 Mojarra 类来注册 Bean

Mojarra 实现中托管 Bean 的注册是由public void register(ManagedBeanInfo beanInfo)的方法com.sun.faces.mgbean.BeanManager班级。访问该系统并非易事BeanManager单独使用 JSF 或 Servlet API 的类。然而有ApplicationAssociateMojarra 类创建了BeanManager实例,并且可以使用getCurrentInstance()方法。 Thomas 的另一个答案已经演示了如何以编程方式注册托管 bean:

ApplicationAssociate.getCurrentInstance().getBeanManager().register(...)

上述方法有一个警告。这种方法不太可能在 init 方法中起作用Servlet原因很简单getCurrentInstance方法依赖于 ThreadLocal 变量来检索ApplicationAssociate实例。线程局部变量由com.sun.faces.application.WebappLifecycleListener类,因此您必须重现所使用的机制WebappLifecycleListener类,调用ApplicationAssociate getInstance(ServletContext context)方法,以获得对ApplicationAssociate实例。因此,下面的代码,might be(因为我没有尝试使用它)一个更好的,如果你愿意使用 Mojarra 特定的类:

ServletContext sc = ... //get the ServletContext reference;
ApplicationAssociate.getInstance(sc).getBeanManager().register(...)

您仍然必须注意此机制产生的怪癖,因为很可能某些 Mojarra 类和实例不会在您的 Servlet 之前加载或初始化。因此,我建议加载并尝试配置您的 servletload-on-startup值高于所使用的值FacesServlet.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何以编程方式注册 JSF 托管 bean? 的相关文章

随机推荐

  • 使用外部 js 库在 Amazon Lambda 中将 XML 解析为 JSON

    我正在尝试将从服务器获取的 XML 字符串转换为 Lambda 函数内的 JSON 我设置了这个相当简单的示例来模拟使用 DynamoDB 从服务器获取的 XML 答案 目前我只是想继续进行转换 use strict var AWS req
  • 如何使用 C 在 Linux 上以编程方式终止进程树

    我正在尝试编写一个函数来生成一个子进程 让它运行一段时间 然后在它尚未完成时杀死它 int sysExecTimeout const char exePath int timeoutSec 在函数中 我使用fork and execl生成孩
  • 获取当前请求URL的scheme

    在 Ruby Rack 中 我能够获取当前请求 URL 的方案scheme request 然而 在围棋中 http Request URL Scheme返回一个空字符串 package main import fmt log net ht
  • 为什么 Ansible 显示“错误!任务中未检测到任何操作”错误?

    Ansible 显示错误 错误 任务中未检测到任何操作 这通常表示模块名称拼写错误或模块路径不正确 怎么了 准确的文字记录是 ERROR no action detected in task This often indicates a m
  • 如何使 findpeak 函数检测负峰值而不是正峰值

    我想知道我该怎么做findpeak函数检测负峰而不是正峰 它检测下图所示的红色峰 我需要检测蓝色峰 有什么想法吗 非常感谢 如前所述 你必须使用 data 这是一个例子 x 0 1e 3 5 pi t 0 length x 1 1e 3 y
  • 支持多界面,但主屏幕只有单一界面,在 iOS8 + iPhone 中不工作

    我有如下所示的视图结构 HomeView Support only portrait mode V View1 Support all orientation V View2 Support all orientation 问题 当我com
  • 首先使用代码在实体框架中建模关系问题

    我试图首先在实体框架中学习代码 但在建模关系时遇到问题 它是一个基本的人力资源数据库 因此有两个实体 员工和部门 员工属于一个部门 该部门有一名团队管理员和一名经理 他们实际上都是员工 我尝试使用以下方法对此进行建模 EMPLOYEE pu
  • BackgroundWorker & Timer,只读取日志文件的新行?

    我的应用程序写入一个日志文件 当前使用log4net 我想设置一个计时器和一个后台工作人员来读取日志文件并将其内容打印到我的表单中的某些控件中 同时写入日志文件 我无法使用文件系统观察者类因为似乎被破坏了 有时事件 改变 会触发 有时则不会
  • 删除 CR 行终止符

    首先我想说我已经读过这个帖子但是我仍然有问题CR line terminators 有一个文件叫build test sh 我编辑于leafpad它可以直接显示在Vim cp moonbox llvm 2 9 lib Transforms
  • 如何在B类中定义A类,在A类中定义B类?

    我有两种类型 一种类型 A 一种类型 B 问题类型 A 包含类型 B 类型 B 包含类型 A 这样的事情是行不通的 type typeA record test1 typeB end type typeB record test2 type
  • 使用哪款 Android 手机进行开发...? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我计划将一些游戏从 iPh
  • 免费的 UML 工具,非常适合 .NET [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 谁能推荐一款您曾经使用过并
  • 错误:TypeError:$(...).dialog 不是函数

    我在获取对话框作为基本功能时遇到问题 这是我的 jQuery 源导入 Html
  • 如何使用硬件视频缩放器?

    现代显卡具有硬件视频缩放器 例如作为 AMD Avivo NVIDIA PureVideo 或 Intel ClearVideo 的一部分 例如 AMD 的Avivo 白皮书 says 图像输出缩放器支持最多 6 个垂直滤波器抽头及以上 至
  • 基于区域设置的python csv列表分隔符

    如何使用Python检测用户机器中的列表分隔符 需要在用户计算机上创建 CSV 文件 并且必须自动检测列表分隔符 以便 Excel 可以读取 CSV 文件 我发现 Excel 从 区域选项 gt 数字 gt 列表分隔符 中获取 CSV 元素
  • d3 重置范围后保留比例/平移

    我有一个
  • 如何将组件引用传递给 onPress 回调?

    我确实使用 onPress 处理程序 渲染了以下类型的列表 我意识到 onPress 处理程序是无用的 因为我无法获取按下种族的参考 我收到 ref 未定义错误 var races Engine possibleRaces function
  • 来自不受信任的 UID 的呼叫

    当我在 Android Studio 中运行 UIAutomator 时 有时会出现崩溃 W ActivityManager Crash of app com example testsample running instrumentati
  • 替代 NSData 已弃用的 dataWithContentsOfMappedFile

    So id dataWithContentsOfMappedFile NSString 路径自 iOS 5 0 以来显然已被弃用 在我看来 我应该避免使用它 但是我应该使用什么来代替呢 我使用 mmap 来创建内存映射文件 它适用于 iOS
  • 如何以编程方式注册 JSF 托管 bean?

    我想以编程方式 从 Servlet init 内 将托管 Bean 类注册 添加到应用程序范围中 我如何使用 JSF 1 2 做到这一点 对于所有范围的托管 bean 不太可能从您的应用程序中以编程方式执行此操作 BalusC 已经指出了如