JSF 2:ViewScoped问题,重新显示同一页面时bean没有保留

时间:2010-12-24 04:53:07

标签: jsf jsf-2 primefaces

3 个答案:

答案 0 :(得分:6)

问题似乎是您声明您的bean是 CDI 托管bean,而不是 JSF 托管bean。 @ViewScoped是一个特定于JSF的范围,CDI本身不支持。

CDI允许您创建自定义范围,因此您可以为其构建支持。事实上,这已经完成了。请参阅:http://seamframework.org/Community/JSF2ViewScopeInCDI

不使用任何扩展程序,以下代码运行良好:

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class MyBean {

    String state = "";

    @PostConstruct
    public void test() {
        System.out.println("pc called");
        state = "state set";
    }

    public String getState() {
        return state;
    }

    public String action() {
        return "";
    }
}

以下Facelet:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">
    <h:body>

        #{myBean.state}

        <h:form>
            <h:commandButton value="test" action="#{myBean.action}"/>
        </h:form>
    </h:body>
</html>

post构造方法现在只调用一次,按下命令按钮后页面将刷新,但状态将被保留。

答案 1 :(得分:2)

Seam Faces 3为CDI bean提供了@ViewScoped注释,以及大量其他功能,以弥合CDI和JSF之间的差距。

答案 2 :(得分:1)

根据此处发布的建议,我已开始使用MyFaces CODI来解决此问题。我不能告诉你Seam或CODI是否更好,但至少它让我过去试图解开范围并继续编写应用程序。