为什么我的ViewScoped bean无法生存h:commandButton?

时间:2012-03-25 15:02:20

标签: jsf-2

在JBoss AS 7.1.0.Final上部署。

我有一个非常简单的测试应用程序。它正在按预期工作直到前一天(着名的最后一句话)并且不再做最基本的事情,即设置输入组件的值并在动作组件中使用它。我把这件事情剥夺了基础,无法弄清楚发生了什么。

index.xhtml就在这里

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html">

<h:head>
  <title>contacts</title>
</h:head>
<h:form>
    <h:outputLabel value="Message:" />
    <h:inputText value="#{contactView.siteCode}" />
    <h:commandButton  action="#{contactView.save}" value="Save" />

</h:form>

</html>

ViewScoped bean就在这里

@Named
@ViewScoped
public class ContactView implements Serializable {

    public ContactView() {
    }

    private String siteCode;

    public String getSiteCode() {
        System.out.println("getSiteCode: "+ siteCode);
        return siteCode;
    }

    public void setSiteCode(String siteCode) {
        System.out.println("setSiteCode: "+ siteCode);
        this.siteCode = siteCode;
    }

    public String save(){
        System.out.println("Saving sitecode: " + siteCode);
        return "index.jsf";
    }


}

我做错了什么?当我点击保存按钮时,我在输出中得到了这个

10:50:37,663 INFO  [stdout] (http--0.0.0.0-8080-2) setSiteCode: 22
10:50:37,663 INFO  [stdout] (http--0.0.0.0-8080-2) Saving sitecode: null
10:50:37,663 INFO  [stdout] (http--0.0.0.0-8080-2) getSiteCode: null

1 个答案:

答案 0 :(得分:5)

那是因为bean由CDI @Named管理,而不是由JSF @ManagedBean管理。包{J}的JSF范围注释仅适用于由JSF管理的bean。在CDI托管bean上,您需要使用javax.faces.bean中的CDI注释。但是,CDI没有视图范围的概念。最近的是javax.enterprise.context,但管理起来比较复杂。如果未在CDI托管bean上指定范围,则默认为请求范围。

每当您想使用@ConversationScoped时,请确保您的bean由JSF管理。

@ViewScoped

此外,您还需要确保在您想要保留视图范围时,您的操作方法会返回import javax.faces.bean.ManagedBean; import javax.faces.bean.ViewScoped; @ManagedBean @ViewScoped public class ContactView implements Serializable { // ... } null