在提交commandButton之后,如何更改以下示例后,inputText中的更改值不会消失?我理解为什么会这样,但我不知道如何解决它。
<h:form>
<h:selectOneMenu valueChangeListener="#{foo.selectChanges}" onchange="submit()" >
<f:selectItem itemValue="5" itemLabel="Five"/>
<f:selectItem itemValue="10" itemLabel="Ten"/>
</h:selectOneMenu>
<ui:repeat value="#{foo.repeatItems}" var="item">
<div>
<h:inputText value="#{item.value}"/>
</div>
</ui:repeat>
<h:commandButton value="test" action="#{foo.submit}">
</h:commandButton>
</h:form>
和豆:
public class FooBean {
private RepeatItem[] repeatItems;
private String value = "5";
public String getValue() {
return value;
}
public void setValue(final String value) {
this.value = value;
}
public void submit() {
}
public void selectChanges(ValueChangeEvent e) {
value = (String) e.getNewValue();
}
public RepeatItem[] getRepeatItems() {
repeatItems = new RepeatItem[Integer.parseInt(value)];
for (int i = 0; i < Integer.parseInt(value); i++) {
repeatItems[i] = new RepeatItem();
}
return repeatItems;
}
public void setRepeatItems(final RepeatItem[] repeatItems) {
this.repeatItems = repeatItems;
}
public static class RepeatItem {
private String value;
public String getValue() {
return value;
}
public void setValue(final String value) {
this.value = value;
}
}
}
答案 0 :(得分:2)
您希望将bean放在view
范围内,以便在对同一视图的后续请求中保持活动状态。您还希望预先填充valueChangeListener
方法而不是getter方法,因为在JSF的生命周期中多次调用getter方法,并且实际上只应该返回数据。您还希望在此处使用f:ajax
来通过部分提交来改善用户体验,而不是通过Javascript submit()
提交整个页面。这是一个启动示例:
XHTML:
<h:form>
<h:selectOneMenu valueChangeListener="#{bean.prefill}" converter="javax.faces.Integer">
<f:selectItem itemValue="0" itemLabel="Please select" />
<f:selectItem itemValue="5" itemLabel="Five"/>
<f:selectItem itemValue="10" itemLabel="Ten"/>
<f:ajax event="change" render="items" />
</h:selectOneMenu>
<h:panelGroup id="items">
<ui:repeat value="#{bean.items}" var="item">
<div><h:inputText value="#{item.value}"/></div>
</ui:repeat>
</h:panelGroup>
<h:commandButton value="submit" action="#{bean.submit}" />
<h:messages />
</h:form>
豆:
@ManagedBean
@ViewScoped
public class Bean {
private List<Item> items;
public void prefill(ValueChangeEvent event) {
Integer count = (Integer) event.getNewValue();
items = new ArrayList<Item>();
while (count-- > 0) items.add(new Item());
}
public void submit() {
System.out.println(items);
}
public List<Item> getItems() {
return items;
}
}
档案:
public class Item {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}