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

如何用Servlet验证JSP并保留输入数据?JSP双Servlet联动问题

我来帮你搞定这个验证失败后表单状态丢失的问题,核心原因是验证失败转发回JSP时,没有把用户之前提交的所有选择和输入值重新存入request域中,同时页面上的回显逻辑也需要调整。下面是具体的修复步骤和代码修改:

一、修复核心问题:在InputServlet中保存用户提交的所有数据

当验证失败时,除了错误信息,你需要把用户选的单选按钮、输入框值、下拉框选中值都存入request.setAttribute,这样JSP才能拿到这些值回显:

修改InputServlet的doPost方法中的else块:

else {
    messages.put("ERROR", String.format("this is not a valid combination."));
    // 保存用户选择的单选选项
    request.setAttribute("option", dto.getOption());
    // 保存输入框的值
    request.setAttribute("inputfield1", request.getParameter("inputfield1"));
    request.setAttribute("inputfield2", request.getParameter("inputfield2"));
    // 保存下拉框的选中值
    request.setAttribute("selectedDd1", request.getParameter("dd1"));
    request.setAttribute("selectedDd2", request.getParameter("dd2"));
    // 重新填充对应选项的下拉框数据(转发后原request属性会丢失)
    int[] dd1, dd2;
    switch(dto.getOption()){
        case "option1":
            dd1 = new int[]{1,2,3,4};
            dd2 = new int[]{1,2,3,4};
            break;
        case "option2":
            dd1 = new int[]{9,8,7,6};
            dd2 = new int[]{9,8,7,6};
            break;
        default:
            dd1 = new int[]{};
            dd2 = new int[]{};
            break;
    }
    request.setAttribute("dd1", dd1);
    request.setAttribute("dd2", dd2);
    
    request.setAttribute("messages", messages);
    request.getRequestDispatcher("/WEB-INF/input.jsp").forward(request, response);
}

注意:必须重新填充下拉框的dd1和dd2数据,因为转发时原来从chooseRadioServlet存入的request属性会丢失,所以要根据用户选的option重新生成。

二、调整JSP页面的回显逻辑

1. 单选按钮回显

原来的单选按钮只判断了param.option,但验证失败是POST转发,param里没有option(转发不会保留POST参数到param),所以要改成优先取request域中的option:

<input type="radio" name="option" onchange="submit()" value="option1" ${option == 'option1' ? 'checked' : ''}>
<input type="radio" name="option" onchange="submit()" value="option2" ${option == 'option2' ? 'checked' : ''}>

2. 输入框回显

给输入框添加value属性,从request域中获取之前输入的值:

<input type="text" name="inputfield1" required="true" value="${inputfield1}" />
<br>
<input type="text" name="inputfield2" required="true" value="${inputfield2}" />

3. 下拉框选中状态回显

修改下拉框的option标签,添加selected判断,匹配之前选中的值:

<select name="dd1">
<c:forEach items="${dd1}" var="item">
<option ${selectedDd1 == item.toString() ? 'selected' : ''}><c:out value="${item}" /></option>
</c:forEach>
</select>
<select name="dd2">
<c:forEach items="${dd2}" var="item">
<option ${selectedDd2 == item.toString() ? 'selected' : ''}><c:out value="${item}" /></option>
</c:forEach>
</select>

注意:因为dd1是int数组,而selectedDd1是String类型(从request.getParameter获取),所以需要用item.toString()做类型转换匹配。

三、修复chooseRadioServlet中的bug

你的chooseRadioServlet里有两个小错误,会导致option值传递异常:

  1. case "option 1": 多了空格,应该是case "option1":
  2. request.setAttribute("gratingType", "option2"); 属性名写错了,应该是request.setAttribute("option", "option2");

修改后的chooseRadioServlet代码片段:

switch (request.getParameter("option")) {
case "option1":
    request.setAttribute("option", "option1");
    request.setAttribute("dd1", dd1_1);
    request.setAttribute("dd2", dd2_1);
    break;
case "option2":
    request.setAttribute("option", "option2");
    request.setAttribute("dd1", dd1_2);
    request.setAttribute("dd2", dd2_2);
    break;
default:
    break;
}

总结

通过以上修改,验证失败转发回JSP时:

  • 单选按钮会根据request域中的option值保持选中状态
  • 输入框会显示用户之前输入的内容
  • 下拉框会选中用户之前选择的选项
  • 错误信息也能正常显示

内容的提问来源于stack exchange,提问作者Kinaeh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:57:30