2008-09-18 91 views
14

tôi thấy một số mã như sau trong một JSPkiểm tra thuộc tính trong JSTL <c:if> thẻ

<c:if test="<%=request.isUserInRole(RoleEnum.USER.getCode())%>"> 
    <li>user</li> 
</c:if> 

nhầm lẫn của tôi là qua "=" xuất hiện trong giá trị của thuộc tính test. Sự hiểu biết của tôi là bất kỳ thứ gì được đưa vào trong phạm vi <%= %> được in ra đầu ra, nhưng chắc chắn giá trị được gán cho thử nghiệm phải là Boolean, vậy tại sao công việc này lại hoạt động?

Đối với điểm thưởng, có cách nào để thay đổi giá trị thuộc tính ở trên sao cho nó không sử dụng mã tập lệnh không? Có lẽ, điều đó có nghĩa là sử dụng EL thay thế.

Chúc mừng, Don

+0

<%= => được in với sản lượng chỉ khi nó xuất hiện bên ngoài của một thẻ JSP, như một câu trả lời dưới đây cho biết. Tuy nhiên, nó không * không * được đánh giá thành một chuỗi nhưng thay vì được chuyển đổi thành bất kỳ kiểu nào mà thuộc tính mong đợi. Thuộc tính 'test' của' 'thuộc loại' boolean', vì vậy bất kỳ biểu thức nào của tập lệnh trả về sẽ bị ép buộc thành 'boolean'. – mksios

+0

Mặc dù thật thú vị khi thấy rằng nếu bạn trộn chuỗi và tập lệnh trong một thuộc tính thẻ JSP, công cụ sẽ bị nhầm lẫn và diễn giải toàn bộ giá trị dưới dạng chuỗi. Nghĩa là, '' sẽ không thực thi tập lệnh nhưng thay vì ép buộc chuỗi 'abc <%= true %>' thành boolean qua 'Boolean.valueOf()' trả về 'false'. http://stackoverflow.com/questions/8168821/comparing-string-and-boolean-in-expression-language – mksios

Trả lời

16

Tất cả thuộc tính test tìm kiếm để xác định xem có điều gì đúng là chuỗi "true" (phân biệt chữ hoa chữ thường) hay không. Ví dụ, đoạn mã sau sẽ in "Hello world!"

<c:if test="true">Hello world!</c:if> 

Mã trong <%= %> trả về một boolean, vì vậy nó hoặc là sẽ in ra chuỗi "true" hoặc "false", mà là chính xác những gì tag <c:if> tìm kiếm.

+0

Nói đúng, không phải mã trong số <%= %> trả về một Chuỗi, chứ không phải là boolean? –

+0

@Don, request.isUserInRole() (là một trong số <%= and %>) trả lại giá trị boolean. Hy vọng đây là những gì bạn đang yêu cầu. –

+1

Thực ra, trình xử lý thẻ cho '' nhận giá trị cho thuộc tính 'test' thông qua một phương thức setter mà dự kiến ​​một boolean. Trình xử lý không tìm chuỗi "true". Thay vào đó, lý do ví dụ của bạn làm việc với 'test =" true "' là vì EL coerces chuỗi 'true' thành một boolean trước khi thiết lập thuộc tính. Việc ép buộc được thực hiện theo các quy tắc sau: http://stackoverflow.com/questions/8168821/comparing-string-and-boolean-in-expression-language – mksios

2

thuộc tính trong JSP thẻ thư viện nói chung có thể là tĩnh hoặc giải quyết vào thời điểm yêu cầu. Nếu chúng được giải quyết tại thời gian yêu cầu, JSP sẽ giải quyết giá trị của chúng trong thời gian chạy và chuyển đầu ra vào thẻ. Điều này có nghĩa là bạn có thể đặt khá nhiều bất kỳ mã JSP nào vào thuộc tính và thẻ sẽ hoạt động phù hợp với đầu ra nào tạo ra.

Nếu bạn xem tài liệu taglib jstl, bạn có thể xem thuộc tính nào là thời gian reuest nhất và thời gian nào không. http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html

0

<% =%> tự sẽ được gửi đến đầu ra, trong bối cảnh của JSTL nó sẽ được đánh giá để một chuỗi

4

Khái niệm giữa <% =%> được đánh giá trước khi c : nếu thẻ được đánh giá. Vì vậy, giả sử rằng | request.isUserInRole | trả về | true |, ví dụ của bạn sẽ được đánh giá về điều này trước tiên:

<c:if test="true"> 
    <li>user</li> 
</c:if> 

và sau đó thẻ c: nếu sẽ được thực thi.

11

Bạn cũng có thể sử dụng giống như

<c:if test="${ testObject.testPropert == "testValue" }">...</c:if> 
+7

Nếu bạn đang lồng dấu ngoặc kép trong JSTL, bạn sẽ cần phải sử dụng dấu nháy đơn cho những cái trong cùng (trong trường hợp này, xung quanh ''testValue''). – hotshot309

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