Sự khác biệt giữa các cách tiếp cận đó là gì?
Khuôn mẫu
Sử dụng Facelet các mẫu (như trong <ui:composition>
, <ui:include>
và <ui:decorate>
) nếu bạn muốn chia mảnh vỡ bố cục trang chính vào các mẫu reuseable. Ví dụ: đầu trang, menu, nội dung, chân trang, v.v.
Ví dụ:
Các tệp thẻ khuôn mặt
Sử dụng các tệp thẻ Facelet nếu bạn muốn có một nhóm các thành phần có thể sử dụng lại để ngăn chặn / giảm thiểu việc sao chép mã. Ví dụ: một nhóm các thành phần nhãn + đầu vào + thông báo. Sự khác biệt chính với các thành phần hỗn hợp là đầu ra của tệp thẻ Facelet không đại diện cho một tệp duy nhất UIComponent
và trong một số trường hợp có thể là giải pháp duy nhất khi một thành phần hỗn hợp không đủ. Nói chung, có một <ui:include>
với một hoặc nhiều <ui:param>
vượt qua thuộc tính bean được quản lý (và do đó không phải là giá trị mã cứng) là một tín hiệu cho thấy tệp bao gồm tốt hơn có thể là tệp thẻ.
Ví dụ:
Các thành phần tổng hợp
Sử dụng các thành phần tổng hợp nếu bạn muốn tạo một tùy chỉnh duy nhất và có thể tái sử dụng UIComponent
với một trách nhiệm duy nhất bằng cách sử dụng XML thuần túy. Một thành phần tổng hợp như vậy thường bao gồm một loạt các thành phần hiện có và / hoặc HTML và được hiển thị vật lý như một thành phần duy nhất và được cho là được ràng buộc với một thuộc tính bean duy nhất. Ví dụ: một thành phần đại diện cho một thuộc tính đơn lẻ java.util.Date
bởi 3 <h:selectOneMenu>
thành phần phụ thuộc hoặc một thành phần kết hợp <p:fileUpload>
và <p:imageCropper>
thành một thành phần giới <my:uploadAndCropImage>
thiệu một com.example.Image
thực thể tùy chỉnh duy nhất dưới dạng thuộc tính.
Ví dụ:
Các thành phần tùy chỉnh
Sử dụng một thành phần tùy chỉnh bất cứ khi nào không thể đạt được chức năng với các tệp thẻ Facelet hoặc các thành phần tổng hợp, do thiếu hỗ trợ trong bộ thành phần chuẩn / có sẵn. Có thể tìm thấy các ví dụ ở khắp nơi trong mã nguồn của các thư viện thành phần nguồn mở như PrimeFaces và OmniFaces .
Trình xử lý thẻ
Khi bạn muốn kiểm soát việc xây dựng cây thành phần JSF thay vì hiển thị đầu ra HTML, thì bạn nên sử dụng trình xử lý thẻ thay vì một thành phần.
Ví dụ:
Dự án mẫu
Dưới đây là một số dự án ví dụ sử dụng tất cả các kỹ thuật đã đề cập ở trên.
Hiệu suất có thể khác nhau?
Về mặt kỹ thuật, mối quan tâm về hiệu suất là không đáng kể. Sự lựa chọn phải được thực hiện dựa trên các yêu cầu chức năng cụ thể và mức độ trừu tượng cuối cùng, khả năng tái sử dụng và khả năng bảo trì của việc thực hiện. Mỗi cách tiếp cận đều có mục đích và hạn chế được xác định rõ ràng.
Tuy nhiên, các thành phần tổng hợp có chi phí đáng kể trong quá trình xây dựng / khôi phục chế độ xem (cụ thể: trong khi lưu / khôi phục trạng thái chế độ xem). Và, trong các phiên bản cũ hơn của Mojarra, các thành phần tổng hợp có vấn đề về hiệu suất khi gán giá trị mặc định, điều này đã được khắc phục kể từ 2.1.13. Ngoài ra, Mojarra đã bị rò rỉ bộ nhớ khi a <cc:attribute method-signature>
được sử dụng cho các biểu thức phương thức, về cơ bản toàn bộ cây thành phần được tham chiếu lại trong phiên HTTP, điều này đã được khắc phục kể từ 2.1.29 / 2.2.8. Có thể bỏ qua rò rỉ bộ nhớ trong các phiên bản 2.1 cũ hơn như sau:
<context-param>
<param-name>com.sun.faces.serializeServerState</param-name>
<param-value>true</param-value>
</context-param>
Hoặc trong các phiên bản 2.2 cũ hơn như sau:
<context-param>
<param-name>javax.faces.SERIALIZE_SERVER_STATE</param-name>
<param-value>true</param-value>
</context-param>
Tuy nhiên, khi bạn có tương đối "nhiều" thành phần tổng hợp và bạn đã javax.faces.STATE_SAVING_METHOD
thiết lập client
, thì hiệu suất sẽ là một vấn đề. Không lạm dụng các thành phần tổng hợp nếu bạn chỉ muốn có chức năng cơ bản đã có thể thực hiện được với một tệp bao gồm hoặc tệp thẻ đơn giản. Không sử dụng tính dễ cấu hình (đọc: không *.taglib.xml
cần tệp) như một cái cớ để thích các thành phần phức hợp hơn các tệp thẻ.
Khi sử dụng Mojarra 2.2.10 trở lên, đừng quên tắt khoảng thời gian làm mới Khuôn mặt tương đối ngắn cho chế độ sản xuất:
<context-param>
<param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
<param-value>-1</param-value>
</context-param>
Không sử dụng cài đặt này để phát triển, nếu không, bạn phải khởi động lại toàn bộ máy chủ để phản ánh các thay đổi trong tệp Khuôn mặt! Mojarra 2.2.11 và mới hơn, và MyFaces đã được đặt mặc định -1
khi javax.faces.PROJECT_STAGE
không được đặt thành Development
.