我在视图作用域bean中有列表。 #{repeatController.add}一个新对象到列表。它将同时调用h:commandButton和p:commandButton。
我的问题是,当我有新行时,在“ repeatName”字段中键入一些内容,然后按h:commandButton或p:commandButton,它们的工作方式会不同。
h:commandButton将新的字段值推送到Bean,并且在刷新表单和换行之后它也会出现。
p:commandButton不会将新字段值推送到Bean。刷新表单后,出现新行,但“ repeatName”字段的先前键入的内容为空。
我认为h:commandButton可以正常工作,而p:commandButton不能正常工作。
始终使用h:commandButton和p:commandButton设置“ noRepeatName”字段值。
使用h:commandButton的步骤和结果:
结果:刷新后,出现以前输入的字段内容。
使用p:commandButton的步骤和结果:
结果:刷新后,出现以前键入的“ noRepeatName”字段的内容,但第一个“ repeatName”为空。
我想念什么吗? 为什么不像h:commandButton那样设置提交给bean的第一个“ repeatName”值?
我使用primefaces 6.2.10,jsf 2.2.18(oracle)和spring boot 2.0.6。
JSF代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head/>
<h:body>
<h:form id="repeatForm">
<h:commandButton value="plus" id="addJsf">
<f:ajax event="click" immediate="true" render="repeatForm" execute="repeatForm"
listener="#{repeatController.add}"/>
</h:commandButton>
<p:commandButton icon="fa fa-plus" actionListener="#{repeatController.add}" immediate="true" id="add"
process="repeatForm" update="repeatForm"/><br/>
<p:inputText value="#{repeatData.name}" id="noRepeatName">
<f:validateLength minimum="30"/>
</p:inputText><br/>
<ui:repeat value="#{repeatData.products}" var="product" varStatus="productStatus">
First: #{productStatus.first}"; Last: #{productStatus.last}; Index: #{productStatus.index}<br/>
<p:inputText value="#{product.name}" id="repeatName">
<f:validateLength minimum="20"/>
</p:inputText><br/>
</ui:repeat>
</h:form>
</h:body>
</html>
Java bean
@Named
@Scope("view)
public class RepeatData {
private List<Product> products = new ArrayList<>();
private String name;
public List<Product> getProducts() {
return products;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
产品
public class Product {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
控制器
@Named
@Scope("request")
public class RepeatController {
@Autowired
private RepeatData repeatData;
public void add() {
repeatData.getProducts().add(new Product());
}
}