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
相关产品推荐
相关产品推荐

