Я успешно подключился к моей базе данных, но при попытке вернуть результаты 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, а затем перейти оттуда.
Когда вы возвращаете объект 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/>");
.....
}
%>
Вы передаете экземпляр 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