You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:06:04