无法在另一个bean中注入selectOneMenu的选定值

时间:2013-07-22 14:11:33

标签: jsf jsf-2 selectonemenu

我试图准确了解属性注入如何与ViewScoped bean一起使用。

我将列表从一到二注入没有问题。当我尝试从2到3注入相同的List时没有注入任何东西,但我认为这是预期的行为(尽管我可能错了)。

然而,当我尝试将选择的值从SelectOneMenu of Two注入Three时,没有注入任何内容。

我有什么遗漏或是正常行为吗?如果是这样,我如何在三个中检索该值?

One.java

@ManagedBean
@ViewScoped
public class One implements Serializable {

    private List<String> oneList;

    @PostConstruct
    void init() {
        setOneList(new ArrayList<String>());
        getOneList().add("aaa");
        getOneList().add("bbb");
        getOneList().add("ccc");
        getOneList().add("ddd");
    }

    //Getters + setters...
}

one.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition template="/WEB-INF/template.xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
    <ui:define name="header">
        <h:outputText value="ONE" />
    </ui:define>
    <ui:define name="content">
        <h:form>
            <p:commandButton value="two" action="two" ajax="false" />
        </h:form>
    </ui:define>
</ui:composition>

Two.java

@ManagedBean
@ViewScoped
public class Two implements Serializable {

    @ManagedProperty("#{one.oneList}")
    private List<String> oneList;

    private String twoChoice;

    //Getter + setters...
}

two.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition template="/WEB-INF/template.xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
    <ui:define name="header">
        <h:outputText value="TWO" />
    </ui:define>
    <ui:define name="content">
        <h:form>
            <p:selectOneMenu id="test" value="#{two.twoChoice}">
                <f:selectItems value="#{two.oneList}" />
            </p:selectOneMenu>
            <p:commandButton value="three" action="three" ajax="false" />
        </h:form>
    </ui:define>
</ui:composition>

Three.java

@ManagedBean
@ViewScoped
public class Three implements Serializable {
    @ManagedProperty("#{two.oneList}")
    private List<String> oneList;

    @ManagedProperty("#{two.twoChoice}")
    private String twoChoice;

    private String threeChoice;

    //Getters + setters...
}

three.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition template="/WEB-INF/template.xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
    <ui:define name="header">
        <h:outputText value="THREE" />
    </ui:define>
    <ui:define name="content">
        <h:outputText value="#{three.twoChoice}" />
    </ui:define>
    <h:form>
        <p:selectOneMenu value="#{three.threeChoice}">
            <f:selectItems value="#{three.oneList}" />
        </p:selectOneMenu>
    </h:form>
</ui:composition>

1 个答案:

答案 0 :(得分:4)

托管属性并非如此。请记住,只要视图没有更改,@ViewScoped bean就会保持活动状态,这意味着当您使用 non-ajax 从一个页面导航到另一个页面时命令按钮(实际上你指定了导航案例进入动作属性),它们应该被销毁,所以你不能从中获取任何价值。

通常,我使用@ManagedProperty表示法来注入更广泛的范围值(例如,视图范围bean中的会话值)。那么你的案例有什么解决方案?

实际上你有不同的选择: