2013-07-11 31 views
21

Tôi có một điều kiện mà tôi có biểu mẫu đăng ký trong đó nếu userid là 0, nó sẽ hiển thị hình ảnh giả và khi tôi chỉnh sửa người dùng từ bất kỳ cập nhật nào, tôi kiểm tra xem userid không bằng 0 rồi hiển thị hình ảnh tương ứng với userid.Làm cách nào để sử dụng nếu, điều kiện khác trong jsf để hiển thị hình ảnh

Tôi đã sử dụng JSTL bên trong trang jsf. Nhưng luôn luôn cố gắng đi đến vòng lặp khác để hiển thị hình ảnh. Chức năng hoạt động tốt. Điều duy nhất là tôi không thể hiển thị hình ảnh giả khi tôi truy cập trang đầu tiên. Đây là mã của tôi .:

<c:if test="${'#{user.userId}' == '0'}"> 
    <a href="Images/thumb_02.jpg" target="_blank" ></a> 
    <img src="Images/thumb_02.jpg" /> 
</c:if> 
<c:otherwise> 
    <a href="/DisplayBlobExample?userId=#{user.userId}" target="_blank"</a> 
    <img src="/DisplayBlobExample?userId=#{user.userId}" /> 
</c:otherwise> 

Tôi có thể sử dụng thẻ JSTL này hoặc tôi có thể thực hiện bằng jsf không?

Trả lời

27

Việc tổ chức biểu thức EL là bất hợp pháp: bạn nên nội tuyến chúng. Sử dụng JSTL hoàn toàn hợp lệ trong tình huống của bạn. Sửa lỗi, bạn sẽ làm cho mã hoạt động:

<c:if test="#{not empty user or user.userId eq 0}"> 
    <a href="Images/thumb_02.jpg" target="_blank" ></a> 
    <img src="Images/thumb_02.jpg" /> 
</c:if> 
<c:if test="#{empty user or user.userId eq 0}"> 
    <a href="/DisplayBlobExample?userId=#{user.userId}" target="_blank"></a> 
    <img src="/DisplayBlobExample?userId=#{user.userId}" /> 
</c:if> 

Một giải pháp khác là chỉ định tất cả các điều kiện bạn muốn trong EL của một phần tử. Mặc dù nó có thể nặng hơn và ít có thể đọc được, ở đây nó là:

<a href="#{not empty user or user.userId eq 0 ? '/Images/thumb_02.jpg' : '/DisplayBlobExample?userId='}#{not empty user or user.userId eq 0 ? '' : user.userId}" target="_blank"></a> 
<img src="#{not empty user or user.userId eq 0 ? '/Images/thumb_02.jpg' : '/DisplayBlobExample?userId='}#{not empty user or user.userId eq 0 ? '' : user.userId}" target="_blank"></img> 
+0

Điều này không chỉ dẫn đến (gần như) mã trùng lặp mà còn tăng gấp đôi thời gian đánh giá. Hãy xem xét 'c: chọn + c: khi + c: nếu không' thay thế. – Qdeep

29

Đối với những người như tôi vừa tiếp mã bằng cách skuntsel và nhận được một vết đống khó hiểu, cho phép tôi giúp bạn tiết kiệm một chút thời gian.

Có vẻ như c:if không thể tự theo sau bởi c:otherwise.

Các đúng giải pháp là như sau:

<c:choose> 
    <c:when test="#{some.test}"> 
     <p>some.test is true</p> 
    </c:when> 
    <c:otherwise> 
     <p>some.test is not true</p> 
    </c:otherwise> 
</c:choose> 

Bạn có thể bổ sung thêm c:when kiểm tra trong khi cần thiết.

+0

Thật tuyệt khi bạn đã viết một bản cập nhật! Chỉ cần sửa câu trả lời của tôi để nó cũng biên dịch. Đôi khi hữu ích khi đọc lại câu trả lời của bạn. – skuntsel

6

Thay vì sử dụng "c" thẻ, bạn cũng có thể làm như sau:

<h:outputLink value="Images/thumb_02.jpg" target="_blank" rendered="#{not empty user or user.userId eq 0}" /> 
<h:graphicImage value="Images/thumb_02.jpg" rendered="#{not empty user or user.userId eq 0}" /> 

<h:outputLink value="/DisplayBlobExample?userId=#{user.userId}" target="_blank" rendered="#{not empty user and user.userId neq 0}" /> 
<h:graphicImage value="/DisplayBlobExample?userId=#{user.userId}" rendered="#{not empty user and user.userId neq 0}"/> 

Tôi nghĩ đó là một chút thay thế dễ đọc hơn để trả lời thay thế skuntsel và đang sử dụng thuộc tính JSF render thay vì làm tổ một toán tử bậc ba. Và tắt câu trả lời, bạn có thể đặt hình ảnh của mình ở giữa các thẻ neo để hình ảnh có thể nhấp được không?