2012-02-08 18 views
10

Tôi đã tạo một Ứng dụng Cơ sở dữ liệu bằng Netbeans, GlassFish và JavaDB. Bây giờ mã Servlet điều khiển của tôi thực hiện một số truy vấn SQL động và lấy lại một tập kết quả (hoặc tôi có thể chuyển đổi toString). Bây giờ, làm thế nào tôi có thể hiển thị tập kết quả trả về theo định dạng bảng (tôi không có ý tưởng về cấu trúc của tập kết quả). Ai có thể giúp tôi về điều này?Làm thế nào để ánh xạ một ResultSet với số lượng cột chưa biết đến một List và hiển thị nó trong một bảng HTML?

+0

gì vấn đề là bạn có chính xác? gettings các hàng từ tập kết quả? tạo một bảng HTML? cho chúng tôi thấy mã bạn có và cho chúng tôi biết nơi bạn bị kẹt. –

+0

@JB Nizet, tôi có một mã như, - createStatement(); resultset rs = st.executeQuery (truy vấn sql). Bây giờ tôi bị kẹt ở đây. Cách hiển thị tập hợp kết quả này trong bảng HTML. Vì tôi không có ý tưởng về truy vấn, tôi không có ý tưởng về cấu trúc tập kết quả. – alessandro

+0

@ BalusC, tôi đã thấy trang của bạn bị thu hẹp. Nhưng, để áp dụng product.setId (resultSet.getLong ("id")) - điều này tôi phải biết có bao nhiêu colums và bảng nào là câu lệnh trả về. Tôi không có ý tưởng về điều đó. – alessandro

Trả lời

33

Bạn có thể sử dụng Map<String, Object> để đại diện cho hàng "động", là iterable trong <c:forEach>. Bạn có thể sử dụng ResultSetMetaData để thu thập thông tin về các cột như column countcolumn labels.

Vì vậy, lập bản đồ này nên làm:

List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>(); 
ResultSetMetaData metaData = resultSet.getMetaData(); 
int columnCount = metaData.getColumnCount(); 

while (resultSet.next()) { 
    Map<String, Object> columns = new LinkedHashMap<String, Object>(); 

    for (int i = 1; i <= columnCount; i++) { 
     columns.put(metaData.getColumnLabel(i), resultSet.getObject(i)); 
    } 

    rows.add(columns); 
} 

Bạn có thể hiển thị nó trong JSP như sau:

<table> 
    <thead> 
    <tr> 
     <c:forEach items="${rows[0]}" var="column"> 
     <td><c:out value="${column.key}" /></td> 
     </c:forEach> 
    </tr> 
    </thead> 
    <tbody> 
    <c:forEach items="${rows}" var="columns"> 
     <tr> 
     <c:forEach items="${columns}" var="column"> 
      <td><c:out value="${column.value}" /></td> 
     </c:forEach> 
     </tr> 
    </c:forEach> 
    </tbody> 
</table> 
+0

Cảm ơn. Tuy nhiên, trong trang JSP tôi không thể thấy tập kết quả. Những gì tôi đã làm là như sau: request.setAttribute ("als", rows) trong servlet của tôi và trong JSP, rows = session.getAttribute ("als"); - Có gì còn thiếu không? – alessandro

+0

Chỉ cần sử dụng '$ {als}'. Không viết mã Java trong tệp JSP. Sai lầm của bạn là bằng cách bạn đã cố gắng để có được nó như là một attribtue phiên thay vì như là một thuộc tính yêu cầu. Đọc trên http://stackoverflow.com/questions/3177733/how-to-avoid-java-code-in-jsp-files và http://stackoverflow.com/questions/3106452/how-do-servlets-work- instantiation-session-variables-and-đa luồng – BalusC

+0

Xin lỗi nhưng tôi thêm đối tượng rows = request.getAttribute ("$ {als}"). tuy nhiên nó hiển thị các biến hàng không được sử dụng. Và vấn đề vẫn giữ nguyên. – alessandro

3

Sử dụng các siêu dữ liệu resultset biết số cột được trả về bởi các truy vấn, loại các cột vv

Xem the javadoc, mà cũng có một ví dụ.

+0

Cảm ơn. Nó thật tuyệt. – alessandro

Các vấn đề liên quan