135762z 2024-09-27 11:39 采纳率: 100%
浏览 8
已采纳

jsp页面没有返回正确结果该怎么修改

jsp实现一个简易计算器,但是从客户端界面输入数字后没有输出结果


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>简易计算器</title>
</head>
<body>
<h2>简易计算器</h2>

<!-- 表单,用于输入两个参数和选择运算类型 -->
<form action="index.jsp" method="post">
    <label for="num1">第一个参数:</label>
    <input type="text" id="num1" name="num1" required>
    <br><br>

    <label for="operation">运算类型:</label>
    <select id="operation" name="operation">
        <option value="add"></option>
        <option value="subtract"></option>
        <option value="multiply"></option>
        <option value="divide"></option>
    </select>
    <br><br>

    <label for="num2">第二个参数:</label>
    <input type="text" id="num2" name="num2" required>
    <br><br>

    <input type="submit" value="计算">
</form>

<!-- 结果显示部分 -->
<h3>结果:</h3>
<input type="text" id="result" name="result" value="<%= (request.getAttribute("result") != null) ? request.getAttribute("result") : "" %>" readonly>

<%
    // 处理表单提交并计算结果
    String num1Str = request.getParameter("num1");
    String num2Str = request.getParameter("num2");
    String operation = request.getParameter("operation");

    if (num1Str != null && num2Str != null && operation != null) {
        try {
            double num1 = Double.parseDouble(num1Str);
            double num2 = Double.parseDouble(num2Str);
            double result = 0;
            String errorMessage = null;

            // 根据选择的运算类型进行计算
            switch (operation) {
                case "add":
                    result = num1 + num2;
                    break;
                case "subtract":
                    result = num1 - num2;
                    break;
                case "multiply":
                    result = num1 * num2;
                    break;
                case "divide":
                    if (num2 != 0) {
                        result = num1 / num2;
                    } else {
                        errorMessage = "除数不能为零";
                    }
                    break;
                default:
                    errorMessage = "未知的运算类型";
                    break;
            }

            // 错误处理
            if (errorMessage != null) {
                out.println("<script>alert('" + errorMessage + "');</script>");
            } else {
                // 计算成功,将结果设置为请求属性
                request.setAttribute("result", result);
            }
        } catch (NumberFormatException e) {
            out.println("<script>alert('请输入有效的数字');</script>");
        }
    }
%>
</body>
</html>


  • 写回答

2条回答 默认 最新

  • 码踏云端 Java领域新星创作者 2024-09-27 18:56
    关注

    以下内容源自超时代AI智能助手,仅供参考,可行性需要自行评估。

    以下是一些可能导致这个JSP页面没有返回正确结果的原因以及相应的修改方法:

    一、表单提交与页面刷新问题

    1. 原理
      • 当表单提交到index.jsp(自身)时,在处理完表单数据后,页面可能会重新加载,导致之前计算的结果丢失。这是因为默认情况下,JSP页面在重新加载时会重新执行整个页面的代码,而不会保留之前设置的请求属性。
    2. 修改方法
      • 可以使用JSP的内置对象session来替代request来存储结果。将request.setAttribute("result", result);修改为session.setAttribute("result", result);,并且在显示结果的地方,将request.getAttribute("result")修改为session.getAttribute("result")。这样,即使页面重新加载,结果也能从会话(session)中获取。

    二、脚本执行顺序问题

    1. 原理
      • 在JSP页面中,HTML代码和Java代码的执行顺序可能会影响结果的显示。特别是在显示结果的输入框部分,代码<%= (request.getAttribute("result")!= null)? request.getAttribute("result") : "" %>是在页面加载时执行的,可能在计算结果还未设置之前就已经执行了。
    2. 修改方法
      • 可以将结果显示部分的代码放在Java代码块之后,确保在计算结果已经设置之后再显示结果。例如:
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>简易计算器</title>
    </head>
    <body>
    <h2>简易计算器</h2>
    
    <!-- 表单,用于输入两个参数和选择运算类型 -->
    <form action="index.jsp" method="post">
        <label for="num1">第一个参数:</label>
        <input type="text" id="num1" name="num1" required>
        <br><br>
    
        <label for="operation">运算类型:</label>
        <select id="operation" name="operation">
            <option value="add"></option>
            <option value="subtract"></option>
            <option value="multiply"></option>
            <option value="divide"></option>
        </select>
        <br><br>
    
        <label for="num2">第二个参数:</label>
        <input type="text" id="num2" name="num2" required>
        <br><br>
    
        <input type="submit" value="计算">
    </form>
    
    <%
        // 处理表单提交并计算结果
        String num1Str = request.getParameter("num1");
        String num2Str = request.getParameter("num2");
        String operation = request.getParameter("operation");
    
        if (num1Str!= null && num2Str!= null && operation!= null) {
            try {
                double num1 = Double.parseDouble(num1Str);
                double num2 = Double.parseDouble(num2Str);
                double result = 0;
                String errorMessage = null;
    
                // 根据选择的运算类型进行计算
                switch (operation) {
                    case "add":
                        result = num1 + num2;
                        break;
                    case "subtract":
                        result = num1 - num2;
                        break;
                    case "multiply":
                        result = num1 * num2;
                        break;
                    case "divide":
                        if (num2!= 0) {
                            result = num1 / num2;
                        } else {
                            errorMessage = "除数不能为零";
                        }
                        break;
                    default:
                        errorMessage = "未知的运算类型";
                        break;
                }
    
                // 错误处理
                if (errorMessage!= null) {
                    out.println("<script>alert('" + errorMessage + "');</script>");
                } else {
                    // 计算成功,将结果设置为请求属性
                    request.setAttribute("result", result);
                }
            } catch (NumberFormatException e) {
                out.println("<script>alert('请输入有效的数字');</script>");
            }
        }
    %>
    
    <!-- 结果显示部分 -->
    <h3>结果:</h3>
    <input type="text" id="result" name="result" value="<%= (request.getAttribute("result")!= null)? request.getAttribute("result") : "" %>" readonly>
    
    </body>
    </html>
    

    三、表单数据获取与类型转换问题

    1. 原理
      • 在获取表单数据并转换为数字类型时,如果用户输入了不符合要求的内容(如非数字字符),可能会导致NumberFormatException异常,从而使计算无法正常进行。虽然已经有了异常处理来显示提示信息,但可能在某些情况下,异常没有被正确捕获或者处理后的页面状态不正确。
    2. 修改方法
      • 可以在表单输入框中添加一些前端验证,例如使用JavaScript来确保用户输入的是数字。例如,在HTML的<head>部分添加以下JavaScript代码:
    <script>
        function validateInput() {
            var num1 = document.getElementById('num1').value;
            var num2 = document.getElementById('num2').value;
            if (isNaN(num1) || isNaN(num2)) {
                alert('请输入有效的数字');
                return false;
            }
            return true;
        }
    </script>
    

    然后将表单的submit按钮修改为:

    <input type="submit" value="计算" onclick="return validateInput();">
    

    这样可以在前端就阻止用户提交无效的输入,减少后端处理的复杂性。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已采纳回答 9月28日
  • 创建了问题 9月27日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?