- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚开始阅读 Core JavaServer Faces, 3rd Ed.他们这样说(强调我的):
为什么?他们没有提供 任何理由。我一直在 GlassFish 3 上运行的原型(prototype)应用程序中使用It is a historical accident that there are two separate mechanisms, CDI beans and JSF managed beans, for beans that can be used in JSF pages. We suggest that you use CDI beans unless your application must work on a plain servlet runner such as Tomcat.
@ManagedBean
来处理所有 bean,但我并没有真正注意到这方面的任何问题。我并不特别介意从
@ManagedBean
迁移到
@Named
,但我想知道
为什么我应该麻烦。
最佳答案
根据 JSF 2.3,@ManagedBean
已弃用。另请参阅spec issue 1417 。这意味着不再有理由选择 @ManagedBean
而不是 @Named
。这首先在 Mojarra 2.3.0 beta 版本 m06 中实现。
自 Faces 4.0 起,@ManagedBean
已按照规范 issue 1547 删除 .
核心区别是 @ManagedBean
由 JSF 框架管理,只能通过 @ManagedProperty
可用于另一个 JSF 托管 bean。 @Named
由应用程序服务器(容器)通过 CDI 框架进行管理,并通过 @Inject
可用于任何类型的容器管理工件,例如 @WebListener
、@WebFilter
、@WebServlet
、@Path
、 @Stateless
等,甚至是 JSF @ManagedBean
。从另一方面来看,@ManagedProperty
不能在 @Named
或任何其他容器管理的工件内工作。它实际上只在 @ManagedBean
内部工作。
另一个区别是,CDI 实际上会在每个请求/线程的基础上注入(inject)委托(delegate)给目标范围中当前实例的代理(就像 EJB 的注入(inject)方式一样)。此机制允许在范围较广的 bean 中注入(inject)范围较窄的 bean,而这对于 JSF @ManagedProperty
来说是不可能的。 JSF 在这里通过调用 setter 直接“注入(inject)”物理实例(这也正是需要 setter 的原因,而 @Inject
则不需要)。
虽然不是直接的缺点(还有其他方法),但 @ManagedBean
的范围只是有限的。从另一个角度来看,如果您不想为 @Inject
暴露“太多”,您也可以只保留托管 bean @ManagedBean
。这就像 protected
与公共(public)
。但这并不算什么。
至少,在 JSF 2.0/2.1 中,通过 CDI 管理 JSF 支持 Bean 的主要缺点是没有与 @ViewScoped
等效的 CDI。 @ConversationScoped
很接近,但仍然需要手动启动和停止,并且它会向结果 URL 附加一个丑陋的 cid
请求参数。 MyFaces CODI 通过完全透明地将 JSF 的 javax.faces.bean.ViewScoped
桥接到 CDI,使事情变得更容易,这样您就可以执行 @Named @ViewScoped
,但这会附加一个难看的 windowId
请求参数到结果 URL,也适用于普通的页面到页面导航。 OmniFaces通过真正的 CDI @ViewScoped
解决了这一切这确实将 bean 的范围与 JSF View 状态联系起来,而不是与任意请求参数联系起来。
JSF 2.2(在这个问题/答案 3 年后发布)提供了一个新的完全兼容 CDI 的 @ViewScoped
注释,具有 javax.faces.view.ViewScoped< 的风格。/
。 JSF 2.2 甚至附带了仅 CDI 的 @FlowScoped
,它没有等效的 @ManagedBean
,从而将 JSF 用户推向 CDI。预计 @ManagedBean
及其相关元素将根据 Java EE 8 被弃用。如果您当前仍在使用 @ManagedBean
,那么强烈建议您切换到 CDI为 future 的升级路径做好准备。 CDI 很容易在 Java EE Web Profile 兼容容器中使用,例如 WildFly、TomEE 和 GlassFish。对于 Tomcat,您必须单独安装它,就像您对 JSF 所做的那样。另请参阅How to install CDI in Tomcat?
关于jsf - 支持 Bean (@ManagedBean) 还是 CDI Bean (@Named)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4347374/
好的,这是我的 session bean。我总是可以从任何 Servlet 或过滤器中检索 currentUser。那不是问题问题是fileList和currentFile。我已经用简单的 int 和
我觉得 Java EE 6 规范有些困惑。有几组注释。 我们有javax.ejb注释如 @Stateful和 @Stateless用于创建 EJB。 还有一个@javax.annotation.Man
这个问题已经有答案了: Backing beans (@ManagedBean) or CDI Beans (@Named)? (5 个回答) 已关闭 7 年前。 我刚刚创建了一个新的 Maven 项
我正在开发一个复合组件,它必须进行一些计算才能使布局正常工作。对于 EL 来说过于复杂的计算(实际上并不复杂,但我无法通过 EL 执行它们)。我可以专门为该复合组件创建一个 ManagedBean 吗
我在@ManagedBean类中使用Bean管理事务来手动管理事务, @ManagedBean(name = "clients") @ViewScoped @URLMapping(id = "sous
这个问题在这里已经有了答案: How to inject @EJB, @PersistenceContext, @Inject, @Autowired, etc in @FacesConverter
我有一个 jsf View ,它显示了来自表中托管 bean( View 范围)的一些数据,这些数据是远程检索的。 目前,数据是通过使用 primefaces 轮询组件从客户端 View 轮询来更新的
在我的网络应用程序中,当我点击登录链接时,Tomcat 网络服务器抛出以下异常: exception javax.servlet.ServletException: /aluno_jsf.xhtml:
我对应用程序中 ManagedBeans 的使用有疑问。 我有一个页面,其中包含不同的 JSP 组件,如 autoComplete、selectOneMenu、textarea、inputFields
为了获得良好的用户反馈,我在网络应用程序的多个站点上使用消息。 要添加消息,我简单地使用: FacesContext.getCurrentInstance().addMessage(null, new
我一直在为我的 bean 使用注释(我以前没有使用过它们),我发现我必须包含一些依赖项等等,如下所示: com.sun.faces
我是 richfaces 的新手,我想使用注释而不是 xml 配置来支持 bean 类 [就像 JSF 2.0] 我正在使用 richfaces 4.0 并将所有必需的 jar 包含在我的构建路径中。
我目前正在将一个项目从 JBoss 4.2.2 迁移到 JBoss 6.0.0,我还在使用 CDI 添加依赖注入(inject)并从 JSF 1.2 迁移到 JSF 2.0。我向 ejb-packag
可以将无状态 session bean 注入(inject) jsf 托管 bean 中吗? 我有 @ManagedBean(name = "imageUpload") @RequestScoped
我有一个名为 Foo 的类。还有一个名为 FooBean 的 ManagedBean。在页面(Facelet)中,我从用户那里获取新的 Foo 信息并将其插入到数据库中。首次提交数据后,将启用打印按钮
我有fileUpload的managementBean,一旦文件上传,我需要根据从解析器下拉列表中选择的值调用不同的解析器,然后在解析器中创建DetailsClass对象,其中调用该特定类的getDe
我尝试编写一个应用程序来创建 PDF 文件,它使用 JavaServer Faces。当我将文本框的值从 bean 赋予工厂类时,我遇到了一个问题,这些值丢失了。我想知道为什么会发生这种情况,已经尝试
我想知道在两个 ViewScoped bean 之间传递数据(对象)的最佳实践是什么。 由于出色解释的问题,它们需要在 View 范围内here (简而言之:在这两个 View 中,我都在 h:dat
我有 Controller-ManagedBeans 和 Model-ManagedBeans(如 MVC 模式)。 这是我的 Controller : @ManagedBean @Req
这个问题在这里已经有了答案: Identifying and solving javax.el.PropertyNotFoundException: Target Unreachable (18 个回
我是一名优秀的程序员,十分优秀!