0

我试图确切了解属性注入如何与 ViewScoped bean 一起工作。

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

但是,当我尝试将 SelectOneMenu 的二中的选定值注入三时,没有任何东西被注入。

有什么我遗漏的东西还是正常行为?如果是这样,我怎样才能在三中检索该值?

一.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...
}

一个.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>

二.java

@ManagedBean
@ViewScoped
public class Two implements Serializable {

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

    private String twoChoice;

    //Getter + setters...
}

二.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>

三.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...
}

三.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>
4

1 回答 1

4

托管属性不打算那样工作。请记住,@ViewScoped只要视图不更改,bean 就被设计为保持活动状态,这意味着此时您使用非 ajax命令按钮从一个页面导航到另一个页面(实际上您正在指定导航- case 进入action属性),它们应该被销毁,所以你不能从它们那里得到任何值。

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

其实你有不同的选择:

  • 您可以在更改视图时使用<f:viewParam />标签发送 GET 参数。
  • 您可以使用flash scope它将您的值保存在可以重定向的映射中。如果您使用的是 JSF 的 Mojarra 实现,则不推荐,他们仍然需要解决一些问题
  • 自己处理参数并将它们设置在会话范围内的某些数据结构中,之后,当您在目标 bean 中恢复它们时,您可以将它们删除。
于 2013-07-22T20:59:09.147 回答