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

Servlet计算器页面不显示计算结果,控制台正常输出问题排查

计算器Servlet与JSP结果不显示问题排查

问题现象

运行计算器测试程序后:

  • 页面始终显示${requestScope.result}而非实际计算结果,但IntelliJ IDEA控制台能输出正确答案
  • 点击「Calculate」按钮后页面无变化
  • 仅除零操作时,能正常显示方法中定义的"You cannot divide by zero"提示

问题原因分析

  1. JSP未引入JSTL核心标签库
    JSP中使用了<c:if>标签,但未导入JSTL核心标签库,导致JSP无法解析该标签,同时可能影响EL表达式的正常解析,使得${requestScope.result}直接以文本形式输出。

  2. Servlet提前获取PrintWriter触发响应提交
    在doPost方法开头调用了resp.getWriter(),该操作会初始化响应对象并标记响应开始,后续的forward操作虽然执行,但响应状态已被改变,导致request中的result属性无法正确传递到JSP页面。

  3. 错误处理流程不一致
    除零场景直接通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:46:03