2014-07-11 24 views
7

Tôi muốn so sánh hai loại khác nhau trong thẻ <c:if> của JSP. Về cơ bản còn lại một là Number luôn nhưng bên phải là một chuỗi và nếu chuỗi đó có thể phân tích cú pháp số tôi không nhận được lỗi nhưng nếu chuỗi không thể được phân tích cú pháp thành Number tôi nhận được javax.el.ELException: Cannot convert No of type class java.lang.String to class java.lang.Long.Hành vi của nhà điều hành so sánh JSP

Thực tế:

$ {1 == ""} // hoạt động tốt
$ {1 == "4"} // hoạt động tốt
$ {1 == "Yes"} // kích hoạt Ngoại lệ.

Nhưng ngay cả lần so sánh thứ 3 cũng hoạt động tốt trong các phiên bản trước của JSP nhưng giờ đây nó gây ra ngoại lệ.

Hành vi của == có thay đổi theo thời gian không?

Bất kỳ lời đề nghị được đánh giá cao

+0

có thể sử dụng nội bộ bộ chuyển đổi số nếu bạn sử dụng eq chắc chắn rằng không ném một lỗi. – ZaoTaoBao

+0

không. Ngay cả eq ném cùng một ngoại lệ trong các phiên bản JSP mới –

Trả lời

5

Hành vi của == không được thay đổi, nhưng hành vi của {expr} được thay đổi ...

Về phiên bản:

Trong phần tương thích ngược của JSP Specification,

Nếu phiên bản Speci fi ed là ít hơn 2.1, sau đó cú pháp {expr} là được xử lý đơn giản dưới dạng Chuỗi ký tự.

Vì vậy, cho đến EL 2.0 tất cả sẽ được coi như một chuỗi chữ và so sánh với .equals như == sẽ được chuyển đổi sang equals nội bộ (Reference here), nhưng trong 2.1 Nó sẽ không được chuyển đổi sang chuỗi và sẽ ném ngoại lệ nói rằng javax.el.ELException: Cannot convert No of type class java.lang.String to class java.lang.Long

về So sánh:

trong JSP specification JSP.2.3.5.7 của EL phiên bản 2.1, sau đây là quy định ...

01.235.
  1. Nếu A là null hoặc B là null return false cho == hoặc eq, true for!= Hay ne

  2. Nếu A hoặc B là Byte, Short, Character, Integer, hoặc ép buộc dài cả A và B để lâu, áp dụng toán tử

như vậy, Trong trường hợp đầu tiên,

${1 =="" } // ans is false as second one is null as per 1st rule. 

và Trong trường hợp thứ hai,

${1 =="4" } // ans is false as both are different after coercing to Long as per 2nd rule. 

Cả hai sẽ bị ép buộc trong trường hợp trên với chuyển đổi loại nội bộ.

Nhưng không phải trong trường hợp thứ ba, ${1 =="Yes" } nơi thứ hai là chuỗi không thể được chuyển đổi (ép buộc) để Long và java.el.ELException sẽ được ném với thông điệp "Không thể chuyển đổi Số kiểu lớp java.lang.String đến lớp java. lang.Long ".

+0

tôi có thể làm điều gì đó để làm cho các EL của tôi trong tương thích ngược với JSP không? –

+0

Tôi không nghĩ có bất kỳ điều khoản nào như vậy, trừ khi bạn làm suy giảm. –

1

Tính đến JSP 2.1, JSP sử dụng ngôn ngữ thống nhất biểu thức (thống nhất EL), đại diện cho một liên minh của ngôn ngữ biểu hiện được cung cấp bởi JSP 2.0 và ngôn ngữ biểu hiện tạo ra cho Công nghệ JavaServer Faces.

Rất có thể hành vi có thể khác đôi chút.

Xem phần 1.18 của Đặc tả ngôn ngữ biểu thức 2.1 Trang JavaServer 2.1 (có sẵn từ here) cho các quy tắc chuyển đổi loại hoàn chỉnh.