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

如何在单个JSP页面执行MySQL查询并将结果展示到另一页面

解决方案

核心问题说明

你当前实现存在两个核心问题导致无法传递结果到新页面:

  • response.sendRedirect() 属于客户端重定向,会触发两次独立的HTTP请求,第一次请求中生成的查询结果无法直接传递给第二次请求对应的页面
  • 自定义的queryDatabase()方法仅将结果打印到控制台,既没有返回查询结果,也没有将结果存入可跨页面传递的域对象中

具体实现步骤

1. 改造queryDatabase方法,返回查询结果

修改方法返回值,将查询得到的结果返回,示例代码如下:

public String queryDatabase() {
    String connectionURL = "jdbc:mysql://127.0.0.1:3306/?user=coms363";
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;
    String outputString = "";
    try {
        Class.forName("com.mysql.jdbc.Driver");
        connection = DriverManager.getConnection(connectionURL, "coms363", "password");
        statement = connection.createStatement();
        String sqlQuery = "select id, ssn from employees where name = 'John'";
        resultSet = statement.executeQuery(sqlQuery);
        while (resultSet.next()) {
            outputString += resultSet.getInt("id") + "....";
            outputString += resultSet.getInt("ssn") + "<br>"; // 换行用<br>适配HTML显示
        }
    } catch (ClassNotFoundException | SQLException e) {
        System.out.println("Error:" + e.getMessage());
        e.printStackTrace();
    } finally {
        // 一定要关闭资源避免泄漏,顺序为resultSet → statement → connection
        try {if(resultSet!=null) resultSet.close();} catch (SQLException e) {}
        try {if(statement!=null) statement.close();} catch (SQLException e) {}
        try {if(connection!=null) connection.close();} catch (SQLException e) {}
    }
    return outputString;
}

如果需要更规范的存储,也可以封装实体类,用List<Employee>存储结果返回。

2. 替换重定向为请求转发,将结果存入请求域

sendRedirect是两次请求,改用服务器内部的请求转发,同一个请求内的数据可以共享,修改按钮判断逻辑:

<%
String button_A = request.getParameter("button_A");
if ("Submit1".equals(button_A)) {
    String result = queryDatabase();
    // 将结果存入request域,key为result,可自定义
    request.setAttribute("queryResult", result);
    // 服务器内部转发到结果页,不需要触发客户端二次请求
    request.getRequestDispatcher("QueryResult1.jsp").forward(request, response);
}

// button_B、button_C逻辑同理,只需修改转发的目标页面即可
String button_B = request.getParameter("button_B");
if ("Submit2".equals(button_B)) {
    String result = queryDatabase();
    request.setAttribute("queryResult", result);
    request.getRequestDispatcher("QueryResult2.jsp").forward(request, response);
}

String button_C = request.getParameter("button_C");
if ("Submit3".equals(button_C)) {
    String result = queryDatabase();
    request.setAttribute("queryResult", result);
    request.getRequestDispatcher("QueryResult3.jsp").forward(request, response);
}
%>

3. 在结果页取出数据展示

以QueryResult1.jsp为例,直接从request域取出之前存入的结果输出即可:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>查询结果1</title>
</head>
<body>
    <h3>查询1结果如下:</h3>
    <%-- 脚本方式取值 --%>
    <%= request.getAttribute("queryResult") %>
    <%-- 也可以用更简洁的EL表达式,直接写${queryResult}即可 --%>
</body>
</html>

可选方案:必须使用重定向的场景

如果业务要求必须使用sendRedirect,可以将结果存入session域:

// 存数据
session.setAttribute("queryResult", result);
// 结果页取完之后建议手动移除,避免占用内存
session.removeAttribute("queryResult");

优化建议

  • 避免在JSP中写Java业务代码,建议将数据库操作抽为独立的DAO层,JSP仅负责视图渲染
  • 查询条件可参数化,避免硬编码SQL,同时防止SQL注入风险
  • 中文字符场景建议将编码改为UTF-8,避免乱码

内容的提问来源于stack exchange,提问作者3n6in33r

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:48:03