2012-02-11 22 views
8

Tôi gặp sự cố với JSTL và toán tử trống. Tôi đã thực hiện vài trang đơn giản và tất cả mọi thứ đã làm việc tốt, nhưng bây giờ tôi có:

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

    <form action="/Projekt/myaccount" method="post"> 
    <table border="1"> 
     <tr> 
       <td>Artist</td> 
       <td>Record Name</td> 
       <td>Delete</td> 
     </tr> 
     <c:forEach var="item" items="${records}"> 
     <tr> 
       <td>${item.artist}</td> 
       <td>${item.recordName}</td> 
       <td> 
        <input type="checkbox" name='${item.recordName}|${item.recordName}'/> 
       </td> 
     </tr> 
     </c:forEach> 
    </table> 
    <hr/> 
     <input type="submit" name="back" value="back"/> 
     <c:if test='${not empty "${records}"}'> 
       <input type="submit" name="delete" value="delete selected"/> 
     </c:if> 
    </form> 
    </body> 
    </html> 

bây giờ không có vấn đề nếu tôi đặt thuộc tính các hồ sơ hay không, nút delete xuất hiện:

<c:if test='${not empty "${records}"}'> 
      <input type="submit" name="delete" value="delete selected"/> 
    </c:if> 

trong bình thường tình hình để ghi lại thuộc tính tôi vượt qua ArrayList và sau đó sử dụng foreach, nhưng đôi khi ArrayList trống, vì vậy trong những tình huống tôi không muốn nút xóa hiển thị, tôi đã chiến đấu theo cách dễ nhất để đạt được điều này là sử dụng toán tử trống này. Tôi đang phạm sai lầm ở đâu?

Tôi thậm chí đã cố gắng để tự thiết lập thuộc tính này để null:

if (ar.size() != 0) 
    request.setAttribute("records", ar); 
else 
    request.setAttribute("records",null); 

EDIT: @Qwe: có bạn là đúng, nó làm việc cho tôi trước vì tôi kiểm tra nếu thuộc tính hoàn toàn trống rỗng theo cách của tôi, nó luôn luôn đúng, bởi vì tôi đã sử dụng cấu trúc sai, nhưng nó hoạt động vì tôi chỉ muốn hiển thị một chuỗi, nếu không có chuỗi gì không hiển thị nên tôi đã nghĩ rằng mọi thứ hoạt động tốt.

Trả lời

24

<c:if test='${not empty "${records}"}'> cũng như <c:if test="${!empty '${showWarning}'}"> (từ bình luận của bạn) sẽ luôn quyết tâm đúng bởi vì bạn đang thực sự thử nghiệm nếu một String ${records} rỗng hay không, và rõ ràng nó không phải là.

Chỉ cần chắc chắn - theo chuỗi ${records} Ý tôi là giá trị chuỗi, giống như khi bạn đã gán nó trong Java như String foo = "${records}";.

Dòng tiếp theo của mã sẽ kiểm tra nếu records biến (có nghĩa là nhìn lên từ trang, yêu cầu, phiên làm việc hoặc phạm vi ứng dụng) là rỗng hay không:

<c:if test="${not empty records}"> 

Các dòng mã là 100% đảm bảo work :)

Ngoài ra, request.setAttribute("records",null) là cách xấu để xóa thuộc tính vì empty kiểm tra không chỉ phạm vi yêu cầu, nhưng trang, phiên, v.v. Sử dụng <c:remove var='records'/> thay thế.

+0

Nếu tôi thử đoạn mã này, ngoại lệ được nâng lên: org.apache.jasper.JasperException: /WEB-INF/userrecords.jsp (dòng: 26, cột: 15) biểu tượng bằng nhau mong đợi. Điều thú vị là, trong các .jsp khác tôi sử dụng $ {showWarning} và nó hoạt động tốt (nó hiển thị khi nó nên) – Andna

+0

và những gì trong dòng 26? thay đổi thành doublequotes không sửa chữa nó? –

+0

Trong dòng 26, tôi có thẻ này và rỗng opera, dấu ngoặc kép không giúp ích, thành thật mà nói, tôi không hoàn toàn nắm bắt được khi tôi cần đơn và khi ngoặc kép, nhưng tôi quan sát thấy khi tôi sử dụng những toán tử rỗng này, tôi phải sử dụng đôi và đơn, như tôi đã nói nó hoạt động trên .jsp khác mà tôi đã thực hiện. – Andna

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