如何用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值传递异常:
case "option 1":多了空格,应该是case "option1":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
相关产品推荐
相关产品推荐

