第一次没有选择来自其他表单的selectOneListbox

时间:2013-10-25 16:55:39

标签: jsf jsf-2 ajax4jsf selectonemenu

我有两个 selectOneListbox 实例,它引用托管bean中的同一属性。两个列表都属于不同的形式。

当在其中一个列表中选择位置后,我选择了另一个列表中的位置,它没有被选中,仅第一次;进一步的选择都很好。

请建议如何解决问题。

JSF

    <h:form>
            <ul style="list-style: none">
                <li>
                    <h:selectOneListbox size="1" value="#{adminController.model}" > 
                        <f:ajax event="valueChange" render="@all"/>
                        <f:selectItems value="#{adminController.gtSelectItem()}" var="p" itemValue="${p.name}" itemLabel="${p.name}"/>
                    </h:selectOneListbox>     
                </li>    
            </ul>
        </h:form>
        <h:form>
            <ul>
                <li>  
                    <h:selectOneListbox size="1" value="#{adminController.model}" > 
                        <f:ajax event="valueChange" render="@all"/>
                        <f:selectItems value="#{adminController.gtSelectItem()}" var="p" itemValue="${p.name}" itemLabel="${p.name}"/>
                    </h:selectOneListbox>     
                </li>   
                <h:commandButton value="Print">
                    <f:ajax event="click" listener="#{adminController.printAjax()}"/>
                </h:commandButton>
            </ul>

        </h:form>
    </div>

托管Bean属性

public String getModel() {
    return model;
}

public void setModel(String model) {
    this.model = model;
}

一个SelectItems

public ArrayList<Product> gtSelectItem() {
    ArrayList<Product> als = new ArrayList<>(pc.getProductList());
    return als;
}

1 个答案:

答案 0 :(得分:0)

你有很多事要解决。首先,使用EL时,不会写 getter和setter前缀。当你有一个属性来读/写时,只需使用value="#{adminController.selectItem}"。您提供的代码输入错误,无需ulli标记即可重现问题。

公寓,不要使用render="@all"使用ajax 再次渲染整个页面通常被认为是一种不好的做法。为此,只需执行标准POST请求即可。在您的情况下,您只能渲染其他形式,甚至更好地渲染您特别感兴趣的组件。

这里有一个关于你的问题的测试SSCCE,它有效; - )

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <title>Test page</title>
</h:head>
<h:body>
    <h:form id="form1">
        <h:selectOneListbox size="1" value="#{adminController.model}">
            <f:ajax event="valueChange" render=":form2" />
            <f:selectItems value="#{adminController.selectItem}" var="p"
                itemValue="${p.name}" itemLabel="${p.name}" />
        </h:selectOneListbox>

    </h:form>
    <h:form id="form2">
        <h:selectOneListbox size="1" value="#{adminController.model}">
            <f:ajax event="valueChange" render=":form1" />
            <f:selectItems value="#{adminController.selectItem}" var="p"
                itemValue="${p.name}" itemLabel="${p.name}" />
        </h:selectOneListbox>
        <h:commandButton value="Print">
            <f:ajax event="click" listener="#{adminController.printAjax}" />
        </h:commandButton>

    </h:form>
</h:body>
</html>
@ManagedBean
@ViewScoped
public class AdminController implements Serializable {

    public AdminController() {
        System.out.println("Bean created");
    }

    public class Product {

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        String name;

        public Product(String name) {
            this.name = name;
        }

    }

    String model;

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public List<Product> getSelectItem() {
        return Arrays.asList(new Product("Prod1"), new Product("prod2"));
    }

    public void printAjax() {
        System.out.println("Printing " + model);
    }
}