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

1

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

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;

import 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")%> Я знаю, что это утверждение является scriplet и на него нахмурился; однако я пытаюсь сначала получить данные, чтобы заполнить мой jsp, а затем перейти оттуда.

  • 1
    Потому что вы печатаете ссылку на объект (ResultSet). возвращение объекта набора результатов не собирается волшебным образом распечатывать результаты. Вы должны вызывать методы объекта для итерации и получения значений.
  • 0
    Спасибо за ваш быстрый ответ и за помощь. Так что я мог бы создать метод в моем классе DBConnection () для достижения этой цели. Почему данные выводятся на консоль?
Показать ещё 1 комментарий
Теги:
jsp
servlets
jdbc-odbc

2 ответа

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 и заселите объекты, один объект Row = One.

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

return lst;

После этого добавьте список для запроса в Servlet, а не в resultSet.

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/>");
       .....
   }
%>
0

Вы передаете экземпляр ResultSet обратно в JSP:

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

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

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

oracle.jdbc.driver.OracleResultSetImpl@48f675

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

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

  • 0
    Спасибо за ручной источник. Я прочитаю в это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню