#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