Java实现刷新防重复提交及JSP页面提交后空白异常求助
问题分析与解决方案
嘿,我一眼就发现问题出在哪了!你看代码里的ADD_SPEC分支:当你执行完response.sendRedirect("main_admin.jsp");之后,居然还继续执行了两个<%@include%>指令去加载JSP片段。
这里的核心问题是:response.sendRedirect()会立刻向浏览器发送302重定向的响应头,此时整个响应已经被标记为要重定向了,后续的任何输出(包括你include的页面内容)都会被浏览器忽略,甚至可能导致响应结构混乱。这就是为什么数据库里数据已经新增,但页面却显示空白——重定向指令已经发出去了,但后续的多余输出搞乱了响应,浏览器无法正确处理。
修复方案很简单,只要终止重定向后的代码执行就行:
你有两种方式可以实现:
- 用
else if替代独立的if判断,这样当UC1.equals("ADD_SPEC")成立时,就不会再执行后续的代码块; - 在调用
response.sendRedirect()之后,立刻加上return;语句,直接终止当前JSP的执行流程。
修改后的完整代码示例:
<% String UC1 = "INIT"; if (request.getParameter("add_spec") != null) { UC1 = "ADD_SPEC"; } if (UC1.equals("INIT")) { List<Speciality> specs = SpecialityController.INSTANCE.findAll(); %> <%@include file="./WEB-INF/Add_Spec.jspf" %> <%@include file="./WEB-INF/view_all_specs.jspf" %> <% // 改用else if,确保ADD_SPEC分支执行后不会走到其他逻辑 } else if (UC1.equals("ADD_SPEC")) { String spec = request.getParameter("speciality"); SpecialityController.INSTANCE.create(new Speciality(spec)); // 发送重定向指令 response.sendRedirect("main_admin.jsp"); // 终止后续代码执行,避免多余输出 return; } %>
额外的优化建议:
- 尽量别在JSP里写这么多Java脚本代码,把业务逻辑(比如新增专业、查询列表)放到Servlet或者专门的Controller类里,JSP只负责渲染页面,这样不仅代码更清晰,还能减少这类响应处理的坑;
- 你现在用的Post/Redirect/Get(PRG)模式是非常正确的防重复提交方案,只要把执行流程理顺,就能完美解决刷新重复提交的问题啦。
内容的提问来源于stack exchange,提问作者Oubayda Samrouth
相关产品推荐
相关产品推荐

