2012-11-05 48 views
11

Tôi đã nhìn thấy 2 lần rằng một biến từ một trang được duyệt trước đây có thể can thiệp hoặc thay thế biến (ví dụ: h: datatable "var") từ một trang được xem hạ lưu.Phạm vi của <ui:param> trong JSF là gì?

Vì vậy, phạm vi của ui: param là gì? Và có cách nào để chứa nó không?

+0

Tôi nghĩ phạm vi của ui: param là yêu cầu và sẽ bị ghi đè trên mọi yêu cầu. – flash

+0

xem câu trả lời của tôi để balus, nếu nó chỉ là yêu cầu thì nó sẽ không ảnh hưởng đến các trang khác –

Trả lời

7

Về cơ bản, nó đặt bản đồ biến mới trong ngữ cảnh EL. Xem thêm the source code of ParamHandler:

94  public void apply(FaceletContext ctx, UIComponent parent) 
95    throws IOException { 
96   String nameStr = this.name.getValue(ctx); 
97   ValueExpression valueVE = this.value.getValueExpression(ctx, 
98     Object.class); 
99   ctx.getVariableMapper().setVariable(nameStr, valueVE); 
100 } 

Dòng ghi chú 99 (như trong Mojarra 2.1.0). Điều này truy xuất VariableMapper from the EL context và sau đó sets a variable mapping on it with a ValueExpression as value.

Điều này về cơ bản là phạm vi "toàn cầu". Vì vậy, nếu tên biến là "foo", thì mỗi biểu thức EL đơn lẻ được đánh giá trong cùng một bối cảnh EL (về cơ bản, yêu cầu HTTP hiện tại) mà tham chiếu "foo" sẽ được đánh giá theo biểu thức giá trị như được chỉ định trong biến bản đồ. Điều này có mức ưu tiên cao hơn so với các thành phần lặp lại, nếu có. Vì vậy, điều này thực sự có thể dẫn đến xung đột và lặp lại "rỗng" tìm kiếm.

Tốt hơn hãy cung cấp <ui:param> hoặc <h:dataTable var> một tên khác. Ví dụ, bạn có thể chọn tiền tố tất cả các biến số <ui:param> (và <c:set>) với _ hoặc hơn.

+1

Cảm ơn câu trả lời của bạn. Nếu phạm vi của biến là yêu cầu HTTP như tôi nghĩ bạn ngụ ý thì nó sẽ không gây ô nhiễm các trang khác phải không? để cung cấp cho bạn một ví dụ trong ứng dụng crud của tôi: Tôi duyệt qua danh sách các mục (list.xhtml) từ đó tôi chọn chỉnh sửa một (edit.xhtml) có "ui: param", sau đó tôi nhấp hủy để quay lại danh sách và mỗi mục trong danh sách được ghi đè bằng một mục đã được chỉnh sửa ngay trước đó bởi vì "var" của danh sách có cùng tên với "ui: param" trong màn hình chỉnh sửa –

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