JSF动态新增表格行时Ajax更新后用户输入内容丢失问题求助
问题根源
你的两个问题本质都是同一个原因:Ajax提交时没有同步所有行的用户输入到后端Bean,后端仍保留旧值,更新页面时旧值覆盖了用户输入,再加部分代码语法错误。
具体修改方案
1. 修正ui:repeat遍历属性
你当前把orderDTO对象直接传给了ui:repeat,实际需要遍历的是orderDTO里的salesData列表,修改页面代码:
<!-- 原来的错误写法 --> <!-- <ui:repeat value="#{myBean.dataList}" var="list"> --> <!-- 修改为 --> <ui:repeat value="#{myBean.dataList.salesData}" var="item">
2. 修正Ajax提交范围
p:ajax默认只提交当前触发事件的组件,你需要配置execute属性提交整个表格区域的所有输入,保证所有行的用户修改都同步到后端:
<p:inputText value="#{item.totalSales}" > <!-- 增加execute="@(.panel)" 提交整个面板的输入,修正参数传递 --> <p:ajax event="blur" execute="@(.panel)" update="@(.panel)" listener="#{myBean.addLine(item.orderNo)}"/> </p:inputText>
如果你的表格放在某个form内,也可以写成execute="@form"。
3. 修正日期输入组件
你把Date类型的orderDate绑定到了普通文本框,会出现类型转换异常导致值无法写入Bean,建议改成PrimeFaces日期组件:
<!-- 原来的错误写法 --> <!-- <p:inputText value="#{item.orderDate}"/> --> <!-- 修改为 --> <p:datePicker value="#{item.orderDate}" pattern="yyyy-MM-dd"/>
4. 优化addLine方法
新增行时要给orderNo赋值,同时建议增加逻辑避免重复新增空白行(比如判断最后一行是否为空,已经有空白行就不用再加):
@UpBackingBean public void addLine(final int orderNo) { // 可选:判断最后一行是否为空,避免重复加空白行 List<salesDTO> salesList = dataList.getSalesData(); if(!salesList.isEmpty()){ salesDTO last = salesList.get(salesList.size()-1); if(last.getTotalSales() == null || last.getTotalSales().isBlank()){ // 已经有空白行,直接返回 return; } } salesDTO dto = new salesDTO(); dto.setShikanName(shikanName); // 给新行设置orderNo dto.setOrderNo(salesList.size() + 1); dto.setOrderDate(null); dto.setTotalSales(""); salesList.add(dto); }
5. 修正DTO规范(可选,建议修改)
salesDTO中的属性不要定义为public,符合Java封装规范:
@Getter @Setter public class salesDTO extends BaseDTO { private int orderNo; private Date orderDate; private String totalSales; }
内容的提问来源于stack exchange,提问作者nana21435
相关产品推荐
相关产品推荐

