2009-12-04 9 views
11

Tôi đã đọc một số thời gian trước đây về sự khác biệt trong 'Core JSF' nhưng bây giờ tôi không thể tìm thấy địa điểm đó.

Tuy nhiên, tôi không nhớ rằng có một từ về các trường hợp khi chúng ta nên sử dụng $ {expr} trong jsf. Vì vậy, tôi chỉ tò mò sự khác biệt là gì (trong một hạt dẻ) và nếu có một trường hợp để sử dụng $ {expr} trong ứng dụng JSF?

Trả lời

23

Để tóm tắt bằng ngôn ngữ rõ ràng: ${expression} không chỉ được, trong khi #{expression} thể làm cả hai đượcthiết. Điều này là do ${expression} chỉ được đánh giá một lần (ngay lập tức), trong khi #{expression} được đánh giá trên mọi truy cập (hoãn lại).

Trong JSF trên JSP 2.0 hoặc Facelets 1.x, khi bạn đặt một cái gì đó như thế này là biểu hiện đầu tiên của trang

${bean.property} 

nơi bean là một yêu cầu scoped quản lý đậu, bạn sẽ thấy không có gì . Nhưng nếu bean là một phiên quản lý phạm vi đậu và đã được tạo ra trước đó, sau đó bạn sẽ thấy giá trị tài sản được in. Điều này cũng áp dụng nếu bean được quản lý theo yêu cầu được tạo trước #{bean.xxx} trong cùng một trang.

Nếu bạn thay vì làm như biểu hiện đầu tiên của trang

#{bean.property} 

sau đó EL sẽ kiểm tra nếu bean là null và nếu như vậy, sau đó nó sẽ thiết (tạo) một hình mới. Nếu thuộc tính được đặt trong khi xây dựng bean, thì bạn sẽ thấy thuộc tính được hiển thị bởi biểu thức này.

Tất cả điều này là bắt buộc để có được những thứ khác JSF UIInput thành phần như <h:inputText> hoạt động. Khi bạn gửi biểu mẫu, các số #{expression} sẽ đặt các giá trị trong bean.

8

Từ JavaEE tutorial:

Tất cả các biểu thức bằng cách sử dụng cú pháp $ {} được đánh giá ngay lập tức. Các biểu thức này chỉ có thể được sử dụng trong văn bản mẫu hoặc dưới dạng giá trị của thuộc tính thẻ JSP có thể chấp nhận biểu thức thời gian chạy. [...] Biểu thức đánh giá ngay lập tức luôn là biểu thức giá trị chỉ đọc. Biểu thức được hiển thị ở trên chỉ có thể nhận được tổng giá từ bean giỏ hàng; nó không thể thiết lập tổng giá.
Biểu thức đánh giá chậm có dạng # {expr} và có thể được đánh giá ở các giai đoạn khác của vòng đời trang như được xác định bởi bất kỳ công nghệ nào đang sử dụng biểu thức. Trong trường hợp công nghệ JavaServer Faces, bộ điều khiển của nó có thể đánh giá biểu thức ở các giai đoạn khác nhau của vòng đời tùy thuộc vào cách biểu thức đang được sử dụng trong trang.