Servlet计算器页面不显示计算结果,控制台正常输出问题排查
计算器Servlet与JSP结果不显示问题排查
问题现象
运行计算器测试程序后:
- 页面始终显示
${requestScope.result}而非实际计算结果,但IntelliJ IDEA控制台能输出正确答案 - 点击「Calculate」按钮后页面无变化
- 仅除零操作时,能正常显示方法中定义的"You cannot divide by zero"提示
问题原因分析
JSP未引入JSTL核心标签库
JSP中使用了<c:if>标签,但未导入JSTL核心标签库,导致JSP无法解析该标签,同时可能影响EL表达式的正常解析,使得${requestScope.result}直接以文本形式输出。Servlet提前获取PrintWriter触发响应提交
在doPost方法开头调用了resp.getWriter(),该操作会初始化响应对象并标记响应开始,后续的forward操作虽然执行,但响应状态已被改变,导致request中的result属性无法正确传递到JSP页面。错误处理流程不一致
除零场景直接通过PrintWriter向响应写入内容并return,跳过了forward流程,所以能显示提示;但正常计算场景走forward,却因前面的响应初始化问题导致属性传递失败。
修复方案
修改后的Servlet代码
import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/calculate") public class CalculatorServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { RequestDispatcher dispatcher = req.getRequestDispatcher("calculatorServlet.jsp"); dispatcher.forward(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { String operation = req.getParameter("operation"); double firstOperand = Double.parseDouble(req.getParameter("firstOperand")); double secondOperand = Double.parseDouble(req.getParameter("secondOperand")); switch (operation) { case "add": req.setAttribute("result", firstOperand + secondOperand); break; case "subtraction": req.setAttribute("result", firstOperand - secondOperand); break; case "multiply": req.setAttribute("result", firstOperand * secondOperand); break; case "divide": if (secondOperand != 0) { req.setAttribute("result", firstOperand / secondOperand); } else { req.setAttribute("error", "You cannot divide by zero"); } break; default: req.setAttribute("error", "I don't know its operation!"); } RequestDispatcher dispatcher = req.getRequestDispatcher("/calculatorServlet.jsp"); dispatcher.forward(req, resp); System.out.println("Result: " + req.getAttribute("result")); } }
修改后的JSP代码
<%@ page contentType="text/html; charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Calculate Page</title> </head> <body> <h1>Calculate Page</h1> <form action="calculate" method="post"> <label for="firstOperand">Enter number 1: </label> <input type="text" id="firstOperand" name="firstOperand" required> <label for="operation">Choose operation: </label> <select id="operation" name="operation"> <option value="add">Addition</option> <option value="subtraction">Subtraction</option> <option value="multiply">Multiplication</option> <option value="divide">Division</option> </select> <label for="secondOperand">Enter number 2: </label> <input type="text" id="secondOperand" name="secondOperand" required> <button type="submit">Calculate</button> </form> <div> <c:if test="${not empty requestScope.result}"> <p>Result: ${requestScope.result}</p> </c:if> <c:if test="${not empty requestScope.error}"> <p style="color:red;">${requestScope.error}</p> </c:if> </div> </body> </html>
关键修复点说明
- 给JSP添加JSTL核心标签库导入,确保
<c:if>标签和EL表达式能被正确解析 - 移除Servlet中不必要的
resp.getWriter()调用,避免提前触发响应提交,保证forward时request属性能正常传递 - 统一用request属性传递错误信息,保持所有场景都走JSP渲染流程,避免直接向响应写入内容
内容的提问来源于stack exchange,提问作者PavelPavlik
相关产品推荐
相关产品推荐

