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

JSP打印机选择联动异常:选择后表格无数据输出

问题分析与解决方案

我看了你的JSP代码,发现几个关键问题导致选择打印机后表格没有数据,下面逐一说明并给出修复方案:

1. 表单未正确包裹,导致参数无法提交

你的<select>元素没有放在<form>标签里,onchange="this.form.submit()"这句代码根本无法触发表单提交——因为this.form找不到对应的表单对象。这意味着你选择打印机后,页面并没有把选中的PID参数传递给服务器,第二个查询自然拿不到有效参数,查不到数据。

修复:给select加上form包裹,指定提交方式和目标页面(这里直接提交到当前页面):

<P>Printer: 
<form method="post" action="<%= request.getRequestURI() %>">
<select name="testprinter1" id="testprinter1" onchange="this.form.submit();">
  <!-- 原有option代码 -->
</select>
</form>
</P>

2. PreparedStatement参数类型不匹配

从第一个查询里的RS.getInt("PID")能看出,数据库里的PID是整数类型,但你第二个查询用了PS.setString(1, request.getParameter("testprinter1")),把整数参数以字符串形式传入。虽然部分数据库会自动转换类型,但这很容易导致查询匹配失败,尤其是当数据库对类型校验严格时。

修复:把参数转换为int类型,用setInt方法传入:

PS.setInt(1, Integer.parseInt(request.getParameter("testprinter1")));

3. HTML标签闭合错误

你第二个查询里的表格行,结束标签写成了<tr>而不是</tr>,这会破坏HTML结构,即使查询到数据,表格也可能无法正常显示。

修复:修正标签闭合:

<tr>
  <td><%= rs.getString("a")%></td>
  <td><%= rs.getString("b") %></td>
  <td><%= rs.getString("c") %></td>
  <td><%= rs.getString("d") %></td>
  <td><%= rs.getString("e") %></td>
</tr> <!-- 这里改为</tr> -->

4. 未处理参数为空的情况+资源泄漏

  • 当页面首次加载或者用户选择的是默认的"Select Printer"(值为0)时,request.getParameter("testprinter1")可能为空或无效,这时候执行查询会查不到数据,应该先判断参数有效再执行查询。
  • 两个try-catch块里的数据库连接、Statement、ResultSet都没有关闭,长期运行会导致数据库连接泄漏,影响性能。

修复:添加参数判断,并在查询结束后关闭资源:

<% 
String printerId = request.getParameter("testprinter1");
// 只有选择了有效打印机才执行查询
if(printerId != null && !printerId.equals("0")){
    try{
        String Query = "SELECT a, b, c, d, e FROM testprinter2 WHERE PID = ?";
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/xxx?serverTimezone=Singapore","xxx", "xxx");
        PreparedStatement PS = con.prepareStatement(Query);
        PS.setInt(1, Integer.parseInt(printerId));
        ResultSet rs = PS.executeQuery();
        
        while(rs.next()){ %>
        <tr>
        <td><%= rs.getString("a")%></td>
        <td><%= rs.getString("b") %></td>
        <td><%= rs.getString("c") %></td>
        <td><%= rs.getString("d") %></td>
        <td><%= rs.getString("e") %></td>
        </tr>
        <% 
        }
        
        // 依次关闭资源
        rs.close();
        PS.close();
        con.close();
    } catch (Exception e2) { 
        e2.printStackTrace(); 
    }
}
%>

同样,第一个查询的资源也要记得关闭:

<% 
// 在第一个try-catch的末尾添加资源关闭
RS.close();
STM.close();
conn.close();
} catch (Exception e1) { e1.printStackTrace(); } %>

把这些修复点都应用到你的代码里,应该就能正常显示所选打印机对应的表格数据了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:40:12