SQL-запрос, возвращающий «oracle.jdbc.driver.OracleResultSetImpl@48f675» вместо моих ожидаемых данных

#java #sql #jsp #servlets #jdbc-odbc

#java #sql #jsp #сервлеты #jdbc-odbc

Вопрос:

Я успешно подключился к своей базе данных, но при попытке вернуть результаты SQL-запроса на мою страницу index.jsp с помощью запроса переадресации Java-сервлета получаю вывод » oracle.jdbc.driver.OracleResultSetImpl@48f675″ вместо ожидаемых результатов данных. (Примечание: я получаю ожидаемые результаты от моего SQL-запроса в консольном представлении Eclipse; однако данные не отображаются на моей странице jsp, как я ожидаю. Вместо этого отображается сообщение ResultSetImp. Любое понимание, которым кто-либо может поделиться относительно того, почему я получаю этот ResultSetImp вместо моих ожидаемых данных, было бы оценено. Также кто-нибудь хочет объяснить, что такое ResultSetImp saying…my поиски не дали ничего полезного, или, по крайней мере, того, что я понимаю. Код приведен ниже:

 package com.database;
import java.sql.*;


public class DBConnection {

public static void main(String[] args) 
throws ClassNotFoundException, SQLException{

}

    public static ResultSet queryExecute() throws ClassNotFoundException, SQLException
    {

    Class.forName("oracle.jdbc.OracleDriver");  
    Connection conn = DriverManager.getConnection("**Connection string here**");

    if (conn == null)
    {
        System.out.println("Database connection not successfull");
    }
    else 
    {
        System.out.println("Database connection success!");
        //System.out.println(conn);
    }


        Statement stmt = conn.createStatement();
        //ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM Request natural join RequestTerm");
        ResultSet rs = stmt.executeQuery("select * from (select QIPNUMBER,model,SERIALNUMBER,YEAROFMFG,DATERECEIVED,TERM,DEALERNAME from Request natural join RequestTerm)WHERE ROWNUM <= 20");
        ResultSetMetaData rsmd = rs.getMetaData();
        int columnsNumber = rsmd.getColumnCount(); 
        //List<String> displayRecords = new ArrayList<String>(); try store result set into an array object


        while (rs.next()) {
            // Iterate through the data in the result set and display it. 

           //int count = rs.getInt(1);
          while (rs.next()) {
          //Print one row          
          for(int i = 1 ; i <= columnsNumber; i  ){

                System.out.print(rs.getString(i)   " "   "    "); //Print one element of a row -- print vs println

          }

            System.out.println(); //Move to the next line to print the next row.  
            //System.out.println("Number of row:" count);
              }
        }

    rs.close();
    stmt.close();
    conn.close();
    return rs;

    }

} 
  

Мой код сервлета:

 package com.srccodes.example;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  

импортируйте com.database.DbConnection;

    /**
    * Servlet implementation class HelloWorld
    */
@WebServlet("/HelloWorld")
public class HelloWorld extends HttpServlet {
   public static final long serialVersionUID = 1L;

/**
 * @see HttpServlet#HttpServlet()
 */
  public HelloWorld() {
    super();
    // TODO Auto-generated constructor stub
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

  response.setContentType("text/html");
  PrintWriter printWriter  = response.getWriter();
  printWriter.println("<h1>Hello from the doGet function!</h1>");
}


/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    try {
        //ResultSet display = DBConnection.queryExecute();
        request.setAttribute("display", DBConnection.queryExecute());
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    request.getRequestDispatcher("/index.jsp").forward(request, response);

    /*String nextJSP = "/result.jsp";
    RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(nextJSP);
    dispatcher.forward(request,response);*/
}
  

}

Наконец, оператор, который я использую для вызова моего сервлета в моем index.jsp:

<%= request.getAttribute(«display»)%> Я знаю, что это утверждение является скриптом и к нему относятся неодобрительно; однако я пытаюсь сначала получить данные для заполнения в моем jsp, а затем перейти оттуда.

Комментарии:

1. Потому что вы печатаете ссылку на объект (ResultSet). возврат объекта resultset не приведет к волшебной печати результатов. Вам нужно вызвать методы для объекта, чтобы выполнить итерацию и получить значения.

2. Спасибо за ваш быстрый ответ и за помощь. Итак, могу ли я создать метод в моем классе DbConnection() для достижения этой цели. Как получается, что данные выводятся на консоль?

3. @user3812592 Я добавил подход, о котором вы спрашиваете, в моем ответе ниже

Ответ №1:

Когда вы возвращаете объект ResultSet, вы получите ссылку на то же самое. вы не получите значения в нем по своему усмотрению.

Вам нужно будет сделать что-то вроде этого (если вы действительно хотите использовать scriplet):

 <%
ResultSet rs = (ResultSet)request.getAttribute("display");

ResultSetMetaData rsmd = rs.getMetaData();
        int columnsNumber = rsmd.getColumnCount(); 

        while (rs.next()) {

          for(int i = 1 ; i <= columnsNumber; i  ){
                out.print(rs.getString(i)   " "   "    "   "<br/>");
          }

            out.print("<br/>"); //Move to the next line to print the next row.  
            }
        }

    rs.close();
%>
  

Более подходящим способом для этого будет использование компонента:

 class MyBean {
 int QIPNUMBER;
 String model;
 .....
 //getters and setters


}
  

теперь в вашем классе создайте список MyBean и заполните объекты, одна строка = один объект.

 List<MyBean> lst = new ArrayList<MyBean>();
MyBean myBean;
while (rs.next()) {
          myBean = new MyBean();
          myBean.setModel(rs.getString("model"));
          ....
          lst.add(myBean);
}
.....

return lst;
  

После этого добавьте список для запроса в сервлет, а не результирующий набор.

 request.setAttribute("display", DBConnection.queryExecute());
// queryExecute now returns List<MyBean>
  

Теперь в вашем JSP, если вы хотите использовать scriplet, то :

 <%
   List<MyBean> lst = (ArrayList<MyBean>)request.getAttribute("display");
   for(MyBean mb : lst){
       out.print(mb.getModel()   "<br/>");
       .....
   }
%>
  

Ответ №2:

Вы передаете экземпляр результирующего набора обратно в JSP:

http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html

Поскольку вы используете Oracle, то возвращается реализация Oracle интерфейса результирующего набора, т. е. oracle.jdbc.driver.OracleResultSetImpl

Ваш JSP-код просто вызывает метод toString oracle.jdbc.driver.Объект OracleResultSetImpl, который, поскольку он не был переопределен, просто вызывает версию toString в java.lang.Класс объекта — который объясняет вывод:

oracle.jdbc.driver.OracleResultSetImpl@48f675

Вам нужно извлечь необходимые значения из объекта ResultSet и вернуть их соответствующим образом. Смотрите эту статью о том, как это сделать:

http://docs.oracle.com/javase/tutorial/jdbc/basics/retrieving.html