我是学习JSP和Servlet的新手。我有一个Java类,该类调用存储过程并从数据库返回状态列表(这是我学习时的测试用例,稍后将进行其他更复杂的操作)。状态列表应该返回给JSP以在表单中显示/使用,等等。...现在,我很高兴仅通过JSP页面获得数据打印就知道它在那里。
但是,当我从JSP调用Java代码时,结果对象似乎返回为null,因此无法访问任何数据。我也尝试将数据作为ResultSet对象返回,但是结果是相同的。我确实知道从SQL调用存储过程的工作原理。另外,我将Java代码作为servlet来响应doPost请求,并且可以正常工作...
我可能会缺少什么/无法理解?这可能吗?
package edu.XXXX.ais.userapp;
import java.sql.*;
import java.util.*;
public class DBQueries {
public static Vector<String> getStatesList() {
Vector<String> results = new Vector<String>();
Connection con = null;
try {
// Example of executing a stored procedure
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection ("jdbc:mysql://hostname:3306/dbName","username","password");
CallableStatement cs = con.prepareCall("{call getStatesList()}");
ResultSet rs = cs.getResultSet();
while (rs.next()) {
results.add(rs.getString(1));
}
} catch (SQLException e) {
System.err.println("Servlet could not display records." + e);
} catch (ClassNotFoundException e) {
System.err.println("JDBC driver not found." + e);
} finally {
try {
if (con != null) {
con.close();
con = null;
}
} catch (SQLException e) {
System.err.println(e);
}
}
return results;
}
}
调用上述Java代码的JSP页面(期望能够接收结果...)
<html>
<head>
<title>Foo</title>
</head>
<body>
<h3>List of states via a servlet call to the database</h3>
<%@ page import="java.util.*" %>
<%@ page import="edu.XXXX.ais.userapp.DBQueries" %>
<%
Vector rs = DBQueries.getStatesList();
if (rs != null)
for (int index = 0; index < rs.size(); index++) {
out.println("Name : " + (String) rs.get(index));
}
%>
</body>
</html>
产生的Tomcat错误如下:
org.apache.jasper.JasperException: An exception occurred processing JSP page /states.jsp at line 12
9: <%@ page import="edu.XXXX.ais.userapp.DBQueries" %>
10:
11: <%
12: Vector rs = DBQueries.getStatesList();
13: if (rs != null)
14: for (int index = 0; index < rs.size(); index++) {
15: out.println("Name : " + (String) rs.get(index));
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
root cause
java.lang.NullPointerException
edu.XXXX.ais.userapp.DBQueries.getStatesList(Unknown Source)
org.apache.jsp.states_jsp._jspService(states_jsp.java:75)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
最佳答案
在您的示例代码中,CallableStatement
不在cs.getResultSet()
之前执行,因此rs
将为null,然后在执行NullPointerException
时出现rs.next()
。
CallableStatement cs = con.prepareCall("{call getStatesList()}");
boolean bIsResultSetOrNot = cs.execute (); // <-- missed
ResultSet rs = cs.getResultSet();
确保执行该语句,并确保执行结果为
ResultSet
而不是更新计数。关于java - 如何轻松调用Java类(用于查询数据库)并将可用结果返回给JSP?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11111003/