2012-11-16 89 views
1

以下java代碼接受來自JSP文件的POST請求,並將返回的ArrayList作爲輸出返回。我遇到的問題是弄清楚如何正確地將輸出讀入Arraylist,以便他們可以從Arraylist中獲取每個元素並將其顯示在我的JSP中。使用Java將MySQL查詢結果存儲在ArrayList中

如何讀取列名作爲第一個字符串數組,然後將每行數據作爲以下字符串數組,以便我有一個巨大的數組列表,其中包含查詢的全部結果有組織的方式,並允許我將結果讀到我的JSP頁面上?

編輯: 所以我現在具有唯一的問題是執行像SELECT * FROM表的指令時;它只顯示列名。但是當我執行像SELECT columnName FROM table這樣的命令時;它完美地顯示列。下面的代碼已經更新,以反映我現在的位置。

import javax.servlet.*; 
import javax.servlet.http.*; 
import java.io.*; 
import java.sql.*; 
import java.util.ArrayList; 

@SuppressWarnings("serial") 

public class databaseServlet extends HttpServlet { 
    private Connection conn; 
    private Statement statement; 

    public void init(ServletConfig config) throws ServletException { 
     try { 
      Class.forName(config.getInitParameter("databaseDriver")); 
      conn = DriverManager.getConnection(
        config.getInitParameter("databaseName"), 
        config.getInitParameter("username"), 
        config.getInitParameter("password")); 
      statement = conn.createStatement(); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    protected void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     ArrayList<String[]> out = new ArrayList<String[]>(); 
     ArrayList<String> columns = new ArrayList<String>(); 

     String query = request.getParameter("query"); 

     if (query.toString().toLowerCase().contains("select")) { 
      //SELECT Queries 
      //try { 
       ResultSet resultSet = statement.executeQuery(query.toString()); 
       ResultSetMetaData metaData = resultSet.getMetaData(); 
       int numberOfColumns = metaData.getColumnCount(); 
       for(int i = 1; i<= numberOfColumns; i++){ 
        columns.add(metaData.getColumnName(i)); 
       } 

       while (resultSet.next()){ 
        String[] row = new String[numberOfColumns]; 
        for (int i = 0; i < numberOfColumns; i++){ 
         row[i] = (String) resultSet.getObject(i+1); 
        } 
        out.add(row); 
       } 
      //} 
      //catch (Exception f) { 
       //f.printStackTrace(); 
      //} 
     } 
     else if (query.toString().toLowerCase().contains("delete") || query.toLowerCase().contains("insert")) { 
      //DELETE and INSERT commands 
      //try { 
       conn.prepareStatement(query.toString()).executeUpdate(query.toString()); 
       columns.add("\t\t Database has been updated!"); 
      //} 
      //catch (Exception l){ 
       //l.printStackTrace(); 
      //} 
     } 
     else { 
      //Not a valid response 
      columns.add("\t\t Not a valid command or query!"); 
     } 
     request.setAttribute("query", query); 
     request.setAttribute("resultSize", out.size()); 
     request.setAttribute("queryResults", out); 
     request.setAttribute("queryColumns", columns); 
     RequestDispatcher dispatcher = request.getRequestDispatcher("/dbServlet.jsp"); 
     dispatcher.forward(request, response); 
    } 
} 

這裏是我的.jsp文件,而現在它與什麼也沒有,當我執行命令只能​​打印[]。我知道由於之前的測試命令正在工作,但數組顯示不正確。

<?xml version = "1.0"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<!-- dbServlet.html --> 
<html xmlns = "http://www.w3.org/1999/xhtml"> 
<%@ page import="java.util.ArrayList" %> 
<head> 
    <title>MySQL Servlet</title> 
    <style type="text/css"> 
     body{background-color: green;} 
    </style> 
</head> 
<body> 
    <h1>This is the MySQL Servlet</h1> 
    <form action = "/database/database" method = "post"> 
    <p> 
     <label>Enter your query and click the button to invoke a MySQL Servlet 
      <textarea name = "query" cols="20" rows="5"></textarea> 
      <input type = "submit" value = "Run MySQL Servlet" /> 
      <input type = "reset" value = "Clear Command" /> 
     </label> 
    </p> 
    </form> 
    <hr> 
    <TABLE id="results"> 
     <% 
      ArrayList<String> columns = (ArrayList<String>)request.getAttribute("queryColumns"); 
      ArrayList<String[]> results = (ArrayList<String[]>)request.getAttribute("queryResults"); 
      out.println("<TR>"); 
      if(columns != null && !columns.isEmpty()){ 
       for(String columnName: columns){ 
        out.println("<TD>"+columnName+"</TD>"); 
       } 
      } 
      out.println("</TR>"); 
      //print data 
      if(results != null && !results.isEmpty()){ 
       for(String[] rowData: results){ 
        out.println("<TR>"); 
        for(String data: rowData){ 
         out.println("<TD>"+data+"</TD>"); 
        } 
        out.println("</TR>"); 
       } 
      } 
     %> 
    </TABLE> 
    <%= request.getAttribute("query") %> 
    <%= request.getAttribute("resultSize") %> 
</body> 
</html> 

回答

1

也爲列定義一個列表。

  ArrayList<String[]> results= new ArrayList<String[]>(); 
      ArrayList<String> columns= new ArrayList<String>(); 

填充爲列的列表:

  for(int i = 1; i<= numberOfColumns; i++){ 
       columns.add(metaData.getColumnName(i)); 
      } 

填充與結果行作爲列表:

  request.setAttribute("queryResults", results); 
      request.setAttribute("queryColumns", columns); 
+0

@Animachine:在您的JSP中使用這兩個屬性,正如我在上一個問題中所建議的那樣。 –

+0

當我嘗試在ym JSP中使用這兩個屬性時,出現錯誤,而當我僅使用queryResults時,我得到的唯一輸出是空括號「[]」。 我用我當前的代碼更新了我的問題,包括.java和.jsp – PeerPressure

+0

@Animachine:您沒有像我在[** this answer **]中所建議的那樣使用JSP(http://stackoverflow.com/questions/13410284 /顯示MySQL的查詢 - 結果 - 從 - 的servlet到JSP/13410331#13410331)。請參閱。 –

0

首先:

  while (resultSet.next()){ 
       String[] row = new String[numberOfColumns]; 
       for (int i = 1; i <= numberOfColumns; i++){ 
        row[i] = (String) resultSet.getObject(i); 
       } 
       results.add(row); 
      } 
到底

全部,爲什麼要添加toString致電String type變量?現在

,對於您的問題,我寧願創建Class,在數據庫中的表,而列的屬性。對於每一行,從列中創建該類的實例,並將其添加到ArrayList

所以,你的ArrayList的聲明可能是這樣的: -

List<TargetTable> records = new ArrayList<TargetTable>(); 

然後: -

while (res.next()) { 

    records.add(new TargetTable(res.getString(1), res.getString(2), ...)); 
} 

我希望你知道列在表上的號碼。

0

ArrayList不是用於此目的的最佳數據結構。

您可以使用

Table<Integer, String, Object> 

這是谷歌番石榴庫可用。這是很容易使用,以及

0

U可以有兩個作爲的ArrayList,

ArrayList<String> columnNames = new ArrayList<String>(); 
ArrayList<String> out = new ArrayList<String>(); 

迭代通過的ResultSetMetaData和列添加到COLUMNNAMES ArrayList中。

然後COLUMNNAMES添加到了:

out.add(columNames); 

然後在您訪問表中的所有列名創建一個VO類。爲類名創建所有getter和setter。

然後通過ResultSet迭代,

設置的所有值從結果集成VO類。

將此VO類添加到out arrayList中。

ResultVO vo ; 
while (resultSet.next()){ 
vo = new ResultVO(); 
vo.setColumnName1(resultSet.getString(1)); 
vo.setColumnName2(resultSet.getString(2)); 
out.add(vo); 
} 
相關問題