我有两个 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;
}
答案 0 :(得分:0)
你有很多事要解决。首先,使用EL时,不会写 getter和setter前缀。当你有一个属性来读/写时,只需使用value="#{adminController.selectItem}"
。您提供的代码输入错误,无需ul
和li
标记即可重现问题。
公寓,不要使用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);
}
}