原代码:
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %><%--Created by IntelliJ IDEA.User: CaptainDongDate: 2023/4/4Time: 21:35To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>显示所有学生信息的页面</title>
</head>
<body>
<center>
<%/*注册驱动并建立数据库连接*/String url="jdbc:mysql://localhost:3306/students";String username="root";String password="123";Class.forName("com.mysql.cj.jdbc.Driver");Connection connection= DriverManager.getConnection(url,username,password);String sql="select *from stu_info";PreparedStatement preparedStatement=connection.prepareStatement(sql);ResultSet resultSet=preparedStatement.executeQuery();resultSet.last();//移动到最后一条记录
%>
<div>你要查的学生数据表中共有
</div>
<font size="5" color="red">
<%=resultSet.getRow()
%>人
</font>
<div><table border="2" bgcolor="ccceee" width="650"><tr bgcolor="CCCCCC"><td>记录条数</td><td>学号</td><td>姓名</td><td>性别</td><td>年龄</td><td>体重</td><td>身高</td></tr><%resultSet.beforeFirst();//移动到第一条记录之前while (resultSet.next()){%><tr align="center"><td><%=resultSet.getRow()%></td><td><%=resultSet.getString("id")%></td><td><%=resultSet.getString("name")%></td><td><%=resultSet.getString("sex")%></td><td><%=resultSet.getString("age")%></td><td><%=resultSet.getString("weight")%></td><td><%=resultSet.getString("height")%></td></tr><% }%></table>
</div>
</center>
<%if (resultSet!=null)resultSet.close();if (preparedStatement!=null)preparedStatement.close();if (connection!=null)connection.close();
%>
</body>
</html>
查询所有学生信息的页面运行后报错:
类型 异常报告
消息 在 [30] 行处理 [/find_stu_info.jsp] 时发生异常
描述 服务器遇到一个意外的情况,阻止它完成请求。
.。。
例外情况
org.apache.jasper.JasperException: 在 [30] 行处理 [/find_stu_info.jsp] 时发生异常 27: PreparedStatement preparedStatement=connection.prepareStatement(sql); 28: ResultSet resultSet=preparedStatement.executeQuery(); 29: 30: resultSet.last();//移动到最后一条记录 31: %> 32: <div> 33: 你要查的学生数据表中共有Stacktrace:org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:610)org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:489)org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379)org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327)javax.servlet.http.HttpServlet.service(HttpServlet.java:596)org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
根本原因。
javax.servlet.ServletException: java.sql.SQLException: Operation not allowed for a result set of type ResultSet.TYPE_FORWARD_ONLY.org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:655)org.apache.jsp.find_005fstu_005finfo_jsp._jspService(find_005fstu_005finfo_jsp.java:258)org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)javax.servlet.http.HttpServlet.service(HttpServlet.java:596)org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:466)org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379)org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327)javax.servlet.http.HttpServlet.service(HttpServlet.java:596)org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
原因:
这个错误是因为在
ResultSet
对象上尝试执行无效的操作,而该对象的类型为ResultSet.TYPE_FORWARD_ONLY
。默认情况下,JDBC返回的ResultSet
对象是TYPE_FORWARD_ONLY
类型,并且只允许以单向模式遍历一次结果集,即无法回滚或重新定位。在这段代码中,查询完记录总数后,指针移动到了结果集的最后一条记录,而后续再次对结果集进行遍历时,由于该对象已经在末尾,所以会出现上述异常。为了解决这个问题,可以在创建
PreparedStatement
对象时,通过设置ResultSet
对象的类型为TYPE_SCROLL_INSENSITIVE
或者TYPE_SCROLL_SENSITIVE
,从而支持在结果集中进行滚动或重新定位。具体来说,加入
preparedStatement=connection.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
语句后,即可将查询出的结果集类型设置为TYPE_SCROLL_INSENSITIVE
类型,以支持结果集的滚动操作。修改后的代码示例如下:
改代码:
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %><%--Created by IntelliJ IDEA.User: CaptainDongDate: 2023/4/4Time: 21:35To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>显示所有学生信息的页面</title>
</head>
<body>
<center>
<%/*注册驱动并建立数据库连接*/String url="jdbc:mysql://localhost:3306/students";String username="root";String password="123";Class.forName("com.mysql.cj.jdbc.Driver");Connection connection= DriverManager.getConnection(url,username,password);String sql="select *from stu_info";PreparedStatement preparedStatement=connection.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);ResultSet resultSet=preparedStatement.executeQuery();resultSet.last();//移动到最后一条记录
%>
<div>你要查的学生数据表中共有
</div>
<font size="5" color="red">
<%=resultSet.getRow()
%>人
</font>
<div><table border="2" bgcolor="ccceee" width="650"><tr bgcolor="CCCCCC"><td>记录条数</td><td>学号</td><td>姓名</td><td>性别</td><td>年龄</td><td>体重</td><td>身高</td></tr><%resultSet.beforeFirst();//移动到第一条记录之前while (resultSet.next()){%><tr align="center"><td><%=resultSet.getRow()%></td><td><%=resultSet.getString("id")%></td><td><%=resultSet.getString("name")%></td><td><%=resultSet.getString("sex")%></td><td><%=resultSet.getString("age")%></td><td><%=resultSet.getString("weight")%></td><td><%=resultSet.getString("height")%></td></tr><% }%></table>
</div>
</center>
<%if (resultSet!=null)resultSet.close();if (preparedStatement!=null)preparedStatement.close();if (connection!=null)connection.close();
%>
</body>
</html>
运行结果:
对比数据库中的: