我是学习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/

10-09 04:59
查看更多