2015-04-28 31 views
0

我是Java的初學者。在JSP頁面上顯示一個類ArrayList

我想實現的是從JSP(index.jsp)網頁輸入產品代碼,調用一個servlet(getDetails)並從DB2-I-series獲取多個位置的描述和平衡sedrver

在Servlet的描述我使用地圖,但爲了獲得多個位置的平衡我使用自定義類ArrayList(displayOnHand)。

數據在Servlet頁面中被正確捕獲以在多個位置處達到平衡,但是當我在Servlet中執行setAttribute並且在JSP中執行getAttribute時,我無法一次將數據提取爲1字段。

有人可以幫助男性。

以下是我的代碼

-------- getDetails Servlet ------------------ 


public class getDetails extends HttpServlet { 

    /** 
    * Processes requests for both HTTP <code>GET</code> and <code>POST</code> 
    * methods. 
    * 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
    response.setContentType("text/html;charset=UTF-8"); 
    try (PrintWriter out = response.getWriter()) { 
     /* TODO output your page here. You may use following sample code. */ 
     /* write your code here */ 

     Map < String, String > messages = new HashMap < String, String >(); 
     ArrayList columnNames = new ArrayList(); 
     displayOnHand data = new displayOnHand(); 
     ArrayList <displayOnHand> dataList = new ArrayList <displayOnHand>(); 

     String scanSKU = request.getParameter("SKUScan"); 
     if (scanSKU == null || scanSKU.trim().isEmpty()) { 
     messages.put("scanSKU", "Please Enter SKU/UPC/EAN Code"); 
     } 

     if (messages.isEmpty()) { 

     String driver = getServletContext().getInitParameter("driver"); 
     String connectionString = getServletContext().getInitParameter("connectionString"); 
     String username = getServletContext().getInitParameter("username"); 
     String password = getServletContext().getInitParameter("password"); 

     try { 
      Class.forName(driver); 
      Connection conn = DriverManager.getConnection(connectionString, username, password); 
      Statement stmt = conn.createStatement(); 
      String rsstmt = "select IDESCR from mm510lib.invmst where inumbr =" + scanSKU; 
      ResultSet rs = stmt.executeQuery(rsstmt); 

      String SKUName = ""; 
      while (rs.next()) { 
      SKUName = rs.getString(1); 
      } 
      //String SKUName = rs.getString(1); 
      messages.put("SKUDescription", SKUName); 
      stmt = conn.createStatement(); 
      rsstmt = "select istore, IBHAND from mm510lib.invbal where inumbr =" + scanSKU; 
      rs = stmt.executeQuery(rsstmt); 

      ResultSetMetaData md = rs.getMetaData(); 
      int columns = md.getColumnCount(); 

      // Get column names 
      //for (int i = 1; i <= columns; i++) { 
      // columnNames.add(md.getColumnName(i)); 
      // } 
      // Get row data 
      //while (rs.next()) { 
      // ArrayList row = new ArrayList(columns); 
      // for (int i = 1; i <= columns; i++) { 
      //  row.add(rs.getObject(i)); 
      // } 
      // data.add(row); 
      //} 
      while (rs.next()) { 
      //displayOnHand data = new displayOnHand(); 
      data.setLocationCode(rs.getInt(1)); 
      data.setOnhand(rs.getInt(2)); 
      dataList.add(data); 
      } 
      rs.close(); 
      stmt.close(); 
      conn.close(); 
     } catch (ClassNotFoundException | SQLException ex) { 
      Logger.getLogger(getDetails.class.getName()).log(Level.SEVERE, null, ex); 
      messages.put("connection", "Connection to Database could not be established"); 
     } 

     request.setAttribute("messages", messages); 
     request.setAttribute("onHandClass", data); 
     request.setAttribute("OnHandDetails", dataList); 
     request.getRequestDispatcher("index.jsp").forward(request, response); 
     } 
    } 
    } 


---------------------------------------------------- index.jsp ---------------------------------------------------- 


<%@page import="java.util.List" %> 
    <%@page import="java.sql.Array" %> 
    <%@page import="java.util.Locale.Category" %> 
     <%@page import="java.util.ArrayList" %> 
     <%@page import="JavaPackages.*" %> 
      <%@page contentType="text/html" pageEncoding="UTF-8" %> 
      <!DOCTYPE html> 
      <html> 

      <head> 
       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
       <title>Store MIS V0.1</title> 
       <link href="css/index.css" rel="stylesheet" type="text/css" /> 

       <script type='text/javascript'> 
       function isNumber(evt) { 
        evt = (evt) ? evt : window.event; // for IE 
        var charCode = (evt.which) ? evt.which : evt.keyCode; 
        if (charCode > 31 && (charCode < 48 || charCode > 57)) { 
        return false; 
        } 
        return true; 
       } 
       </script> 
      </head> 

      <body> 
       <div class="hypLogo"> 
       <img src="images/logo.jpg" alt="" /> 
       </div> 
       <div class="container"> 
       <div class="pageHeader"> 
        <h1>Store MIS</h1> 
        <form action="getDetails.do" method="POST"> 
        <p> 
         <input type="text" name="SKUScan" value="" placeholder="Scan SKU" onkeypress="return isNumber(event)" /> 
        </p> 

        <span class="error">${messages.scanSKU}</span> 
        <p class="submit"> 
         <input type="submit" name="commit" value="Enter"> 
        </p> 
        <span class="error">${messages.connection}</span> 
        <span class="error">${messages.SKUDescription}</span> 
        </form> 
       </div> 
       </div> 
       <% out.println("in Script"); if (request.getAttribute("OnHandDetails") !=n ull) { // retrieve your list from the request, with casting ArrayList<displayOnHand>list = (ArrayList 
       <displayOnHand>) request.getAttribute("OnHandDetails"); displayOnHand tempData = new displayOnHand() ; out.println("Array Size" + list.size()); // print the information about every category of the list for (int i = 0; i 
        < list.size(); i++) { tempData.equals(list.get(i)); 
        } } %> 
      </body> 

      </html> 

------------- displayOnHand Class --------------- 

public class displayOnHand { 

private int storeNumber; 
private int onHandBal; 

public displayOnHand() { 

} 

public void setLocationCode(int strNum) { 
    storeNumber = strNum; 
} 

public int getLocationCode() { 
    return storeNumber; 
} 

public void setOnhand(int onHand) { 
    onHandBal = onHand; 
} 

public int getOnHand() { 
    return onHandBal; 
} 
} 

回答

0

您可以在列表中添加Product實例,例如 List<Product> productList = new ArrayList<Product>();並將產品添加爲productList.add(p);其中p是產品的任何實例。用於顯示循環使用

for(i=0;i<productList.size();i++) 
{ 
Product product = list.get(i); 
out.println(product.price); 
out.println(product.id); 
} 
+0

最後這麼簡單,我嘗試了很多複雜的方法來完成這件事。再次感謝。 –

+0

接受我的回答 –

0

您可以使用JSTL標籤庫來遍歷數組列表。例如,您可以使用c:forEach標記。用於迭代的

+0

感謝您的回覆,但我不熟悉JSTL,會喜歡JSP本身的東西。 –

+0

@KapilTulsan:JSTL只是允許JSP中的條件和循環的部分。沒有它,你將無法做到嚴肅的JSP。當然你可以使用scriptlet而不是JSTL,但是請不要嘗試**:它很容易出錯,並且很難閱讀JSP。 –

+0

謝謝@SergeBallesta,但截至目前我不會嘗試我的手在JSTL上,如果任何腳本代碼會幫助我想修復它現在。 –

0

也可以用於循環 例如,

for(i=0;i<list.size();i++) 
out.println(list.get(i)); 

OR

你也可以使用JSTL的標籤,@vivek提到

+0

您可以在列表中添加Product實例,例如: –

0

你真的應該嘗試使用JSTL。

這很簡單,只要(從JSTL c:forEach printing ${}被盜):

<%@ page contentType="text/html;charset=UTF-8" language="java" %> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

<html> 
<head> 
    <title></title> 
</head> 
<body> 

Hello from products page.<br/> 

<c:forEach var="prod" items="${products}"> 
    ${prod.price} 
    ${prod.id} 
</c:forEach> 


</body> 
</html> 

有了一個很好的XML文件。

如果你真的不能使用JSTL,這將是:

<%@ page contentType="text/html;charset=UTF-8" language="java" %> 
<%@page import="java.util.List"%> 
<%@page import="package.to.Product"%> 

<html> 
<head> 
    <title></title> 
</head> 
<body> 

Hello from products page.<br/> 
<% 
    List<Product> products = (List<Product>) request.getAttribute("products"); 
    for (Product prod: products) { 
     page.setAttribute("prod", prod); 
%> 
    ${prod.price} 
    ${prod.id} 
<% } %> 

</body> 
</html> 

很醜是不是(我甚至沒有測試它)?相信我:除非你真的做得不一樣避免 scriptlets!