当前位置: 首页 > 知识库问答 >
问题:

如何在JSF 2.0/2.1中用CDI替换@ManagedBean/@ViewScope

唐修诚
2023-03-14

我目前正在使用RichFaces评估Java EE6/JSF2.1。

声明为

@ManagedBean
@ViewScoped
  1. 获取ID集(准备删除操作)。
  2. 通过JSF显示一个确认弹出窗口。
  3. 如果用户确认,则调用delete方法并删除在步骤1中存储ID的行。
@Named
@ConversationScoped

是否必须使用conversation.begin()conversation.end()方法?

如果是的话,哪里才是调用它们的好地方呢?

共有1个答案

元修然
2023-03-14

如果可以升级到JSF2.2,请立即升级。它为CDI提供了本机@viewscoped注释。

import javax.faces.view.ViewScoped;
import javax.inject.Named;

@Named
@ViewScoped
public class Bean implements Serializable {
    // ...
}

或者,安装OmniFaces,它自带CDI兼容的@viewscoped,包括工作的@predestroy(在JSF@viewscoped上中断)。

import javax.inject.Named;
import org.omnifaces.cdi.ViewScoped;

@Named
@ViewScoped
public class Bean implements Serializable {
    // ...
}

另一种选择是安装MyFaces CODI,它透明地将JSF 2.0/2.1@viewscoped连接到CDI。这只会向URL添加一个自动生成的请求参数(就像@conversationscoped所做的那样)。

import javax.faces.bean.ViewScoped;
import javax.inject.Named;

@Named
@ViewScoped
public class Bean implements Serializable {
    // ...
}

如果您确实需要使用@conversationscoped,那么您确实需要手动开始和结束它。您需要@inject一个conversation并在@postconstructend()中调用begin()(通常是重定向到新视图的操作方法)。

import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Named;

@Named
@ConversationScoped
public class Bean implements Serializable {

    @Inject
    private Conversation conversation;

    // ...

    @PostConstruct
    public void init() {
        conversation.begin();
    }

    public String submit() {
        // ...

        conversation.end();
        return "some.xhtml?faces-redirect=true";
    }

}

###另见:

  • 如何选择正确的bean作用域?
 类似资料:
  • 问题内容: 我试图将字符串分成数组并替换为,但无法做到,我也尝试了String.replaceAll这样的东西。 我想提供一个通往JNI的路径,并且它只能以这种方式读取。 问题答案: 在这种情况下不要使用- 这是用正则表达式指定的,这意味着您需要更多的转义。这应该很好: 请注意,由于Java字符串文字中的原因,反斜杠加倍-因此此处涉及的 实际 字符串是“单反斜杠”和“双反斜杠”-而不是双倍和四倍。

  • 这可能是一个很难回答的问题,但是在很多教程和示例中,我看到这些注释的使用就好像它们做了同样的事情。 但是,我使用时遇到了一些限制(尤其是依赖注入等),我找不到解释差异的源,如果有人能给出一个大致的概述,说明什么时候使用这两个,我将非常感谢。

  • 我想使用Mojarra和Weld在Apache TomEE上运行一个WebApp。 是否因为TomEE已经使用了另一个CDI-Framework(OpenWebB)而出现了问题?有可能让TomEE和Weld一起运行吗?

  • 本文向大家介绍如何在MySQL中用SPACE替换“ +”(加号)?,包括了如何在MySQL中用SPACE替换“ +”(加号)?的使用技巧和注意事项,需要的朋友参考一下 要替换,请使用MySQL中的函数。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 以下是用空格替换“ +”(加号)的查询- 让我们再次检查表记录- 这将产生以下

  • 在我的应用程序中,用户应该能够切换区域设置(用于在页面上呈现文本的语言)。大量教程使用FacesContext.get货币实例()。getViewRoot()。setLocale()。例如:http://www.mkyong.com/jsf2/jsf-2-internationalization-example/.但是,这在JSF 2.0中根本不起作用(它在1.2中确实起作用)。这种语言从不切换。

  • 问题内容: 我的场景仅包含一个ImageView,显示一个图像。我想将图像淡化为黑色(场景的指定颜色),然后过一段时间后,再次从黑色淡入图像。我发现FadeTransition非常适合此目的。这是我的一部分代码: 我的问题是异步的,因此下面的代码将在退出之前开始执行。结果,我只看到第二个过渡。如何等待第一个过渡结束,然后启动第二个过渡?我无法让线程在两者之间进入睡眠状态,因为它是主要的javafx