2009-12-14 41 views
39

Tôi đang tạo danh sách thả xuống của tất cả các ngôn ngữ. Việc lựa chọn ngôn ngữ mặc định cho danh sách sẽ được xác định bởi các thông tin bổ sung bởi người sử dụng:Làm thế nào để so sánh hai biến đối tượng trong ngôn ngữ biểu thức EL?

<select> 
    <c:forEach items="${languages}" var="lang"> 
     <c:choose> 
      <c:when test="${lang}.equals(${pageLang})"> 
       <option value="${lang}" selected>${lang}</option> 
      </c:when> 
      <c:otherwise> 
       <option value="${lang}">${lang}</option> 
      </c:otherwise> 
     </c:choose> 
    </c:forEach> 
</select> 

.equals không xuất hiện để tồn tại trong EL. Có một cái nhìn ở đây nó đề nghị tôi viết chức năng của riêng tôi và sau đó nhập khẩu và sử dụng nó. Vì đây là một trong những điều nhỏ bé chỉ dành cho trang này tôi không muốn phải bắt đầu tạo thư viện, vv chỉ cho việc này. Tôi cũng không muốn bắt đầu tạo các đối tượng chuyên biệt cho servlet để trả về với thông tin bổ sung này trong chúng. Chỉ có điều tôi có thể nghĩ là phải trả lại html thực tế cho toàn bộ dòng tùy chọn từ servlet chứ không chỉ là chuỗi ngôn ngữ, nhưng điều đó làm tôi xấu đi vì vậy tôi hy vọng có một giải pháp thanh lịch hơn.

Kế hoạch tốt nhất để khắc phục nhanh chóng so sánh hai chuỗi trong EL là gì?

The J2EE 1.4 Tutorial

Trả lời

99

Trong Expression Language bạn chỉ có thể sử dụng toán tử == hoặc eq để so sánh giá trị đối tượng. Đằng sau hậu trường, họ sẽ thực sự sử dụng Object#equals(). Bằng cách này được thực hiện như vậy, bởi vì cho đến khi với phiên bản EL 2.1 hiện tại, bạn không thể gọi các phương thức với các chữ ký khác so với các phương thức getter (và setter) chuẩn (trong EL 2.2 sắp tới, nó sẽ là có thể).

Vì vậy, các dòng cụ thể

<c:when test="${lang}.equals(${pageLang})"> 

nên được viết như sau (lưu ý rằng toàn bộ biểu thức là bên trong {})

<c:when test="${lang == pageLang}"> 

hoặc tương đương

<c:when test="${lang eq pageLang}"> 

Cả đằng sau hậu trường đã giải thích một s

jspContext.findAttribute("lang").equals(jspContext.findAttribute("pageLang")) 

Nếu bạn muốn so sánh liên tục String giá trị, sau đó bạn cần phải trích dẫn nó

<c:when test="${lang == 'en'}"> 

hoặc tương đương

<c:when test="${lang eq 'en'}"> 

đó là đằng sau hậu trường khoảng hiểu là

jspContext.findAttribute("lang").equals("en") 
+1

Tôi giả sử rằng tôi có thể sử dụng 'test =" $ {lang eq 'en'} "sau đó nữa? Tôi thấy 'eq' trên đó, nhưng nó không phải với hằng số chuỗi? Chỉ cần chắc chắn rằng, tôi không thường xuyên bản thân mình với ngôn ngữ JSTL/biểu thức thường là – SuckerForMayhem

+1

@Sucker: 'eq' là một bí danh cho' == '. Họ làm cả hai chính xác như nhau. Xem thêm [toán tử trong EL] (http://docs.oracle.com/javaee/6/tutorial/doc/bnaik.html). – BalusC

+0

Nó hoạt động EXCEPT trong 1 trường hợp so sánh chuỗi chữ cái. Sau đó, bạn nên sử dụng (hoán đổi đơn giản cho dấu ngoặc kép) http://struts.apache.org/release/2.0.x/docs/why-wont -the-if-tag-assessment-a-one-char-string.html – exoddus

2

Không chắc nếu tôi giúp bạn đúng, nhưng cách đơn giản nhất sẽ là một cái gì đó như:

<c:if test="${languageBean.locale == 'en'"> 
    <f:selectItems value="#{customerBean.selectableCommands_limited_en}" /> 
</c:if> 

Chỉ cần một bản sao nhanh chóng và dán từ một ứng dụng của tôi ...

HTH

+0

Hey, Tôi nghĩ rằng bạn đang so sánh một chuỗi với một chuỗi 'liên tục' ở đây? languageBean.locale == 'en'? Trong khi tôi đang so sánh hai biến, do đó '==' sẽ không hoạt động vì nó sẽ so sánh con trỏ. Cảm ơn, CJ –

+0

bạn nói đúng. là một chút ảnh chụp, sry. – KB22

+0

nhưng thực sự, một phần chính xác, như BalusC giải thích rằng '==' là toán tử chính xác sau khi tất cả và tôi có thể sử dụng nó! –

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