0

我有两个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;
}

选择项目

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

1 回答 1

0

你有很多事情要解决。首先,使用EL的时候不写getter和setter前缀。只需value="#{adminController.selectItem}"在您有要读/写的属性时使用。您提供的代码输入错误,ul并且li不需要标签来重现问题。

Appart 从那开始,不要使用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);
    }
}
于 2013-10-26T09:19:31.660 回答