Đây có thể là một loại câu hỏi kiến trúc, nhưng vẫn phải có 'giải pháp thực hành tốt nhất' hoặc một tiêu chuẩn được chấp nhận.Sử dụng bean được quản lý theo phiên jsf để đại diện cho dữ liệu phân cấp tĩnh
Tôi đang nói về một số loại dữ liệu tĩnh cần được hiển thị trên trang web, như danh mục sản phẩm, danh sách menu và mục menu, danh sách khối đường dẫn, v.v. Tùy chọn này khả dụng khi sử dụng bất kỳ CMS chuẩn nào giả sử.
Nhưng tôi muốn sử dụng giải pháp JSF thuần túy cho vấn đề này.
Vì vậy, để có được trở lại câu hỏi, elaborations của tôi xuất phát khi các nguyên tắc sau:
dữ liệu không nên hardcoded trong Facelets, vì vậy tôi sử dụng cơ sở dữ liệu để giữ các giá trị, giống như trong những điều sau đây db script (MYSQL trong trường hợp của tôi):
CREATE TABLE CatalogueGroup ( CatalogueGroupName VARCHAR(100) NOT NULL PRIMARY KEY, URLPath VARCHAR(200) NOT NULL, ParentGroupName VARCHAR(100) DEFAULT NULL, FOREIGN KEY (ParentGroupName) REFERENCES CatalogueGroup(CatalogueGroupName) ON UPDATE CASCADE ON DELETE SET NULL )ENGINE=InnoDB DEFAULT CHARSET=utf8;
sau đó tôi muốn sử dụng các lớp thực thể được tổ chức tại một @ManagedBean và hiển thị nó trong một cái nhìn, như
public class CatalogueGroup implements Serializable { private String catalogueGroupName; private List<CatalogueGroup> children = new ArrayList<CatalogueGroup>(); private CatalogueGroup parentGroup; //other stuff of this bean } @ManagedBean @SessionScoped public class CatalogueBean implements Serializable { private CatalogueGroup catalogue;//loaded via CatalogueGroupDAO with condition parentGroup == null //other stuff of this bean } //snippet of xhtml view for a two-level catalogue <ul><h:outputText value="#{catalogueBean.catalogue.catalogueGroupName}" /> <ui:rereat value="#{catalogueBean.catalogue.children}" var="group"> <li><h:outputText value="#{group.catalogueGroupName}" /></li> </ui:repeat> </ul>
Thiết lập nói trên hoạt động nhưng cảm thấy nó là một công việc khó xử. Vì vậy, tôi muốn đưa ra những câu hỏi mở, 'thực hành tốt nhất' sau đây để cộng đồng JSF:
- một cách đúng đắn của thiết lập một bean Danh mục như thế này là gì:
- Một bean
@SessionScope
rằng sẽ được tải một lần và được hiển thị lại trên mỗi chế độ xem hoặc - A
@RequestScoped
bean sẽ truy cập cơ sở dữ liệu trên mỗi hiển thị trang.
- Một bean
- Có cách nào để thiết lập chức năng đệ quy theo quan điểm facelet, hay tôi nên hạn chế mức độ catalô làm tổ để, nói, 2 hoặc 3.
- Tôi muốn hiển thị một số loại Danh mục sửa đổi, phơi bày nhiều hơn nhóm cho người dùng đã đăng nhập, tùy thuộc vào vai trò của anh ấy (cột được thêm vào trong bảng cơ sở dữ liệu) và hiển thị danh mục cơ bản khi không có người dùng đăng nhập. Ngoài ra, tôi muốn thỉnh thoảng chèn một số nhóm mới vào danh mục và không buộc người dùng phải đăng nhập, nhưng hiển thị lại dữ liệu thích hợp cùng một lúc:
- Tôi có nên lọc các nhóm trong lớp nghiệp vụ và hiển thị CatalogueGroup đã lọc vào bean hay không, tôi sẽ tải toàn bộ danh mục và giới hạn c hildren trong lượt xem với rendered = false;
- Tiếp xúc với toàn bộ danh mục trong phiên một cách phù hợp để thực hiện;
- Có thể gửi các sự kiện sửa đổi khi thêm mục nhập cơ sở dữ liệu mới vào tất cả CatalogueBean hiện tại đang hoạt động trên máy chủ để làm mới thuộc tính của chúng (CatalogueGroup) hoặc để đạt được chức năng này tôi chỉ cần sử dụng bean
@RequestScoped
; - Trong trường hợp sử dụng bean có phạm vi yêu cầu là lựa chọn duy nhất, bạn nên truy cập cơ sở dữ liệu để nhận dữ liệu thường xuyên hiếm khi thay đổi hoặc có cách làm việc thông minh hơn;
- Khi người dùng đăng nhập (và đăng xuất) đã có một phiên bản của danh mục phạm vi phiên, làm cách nào để làm mới: tôi có cần thực hiện thủ công trong trình xử lý tác vụ/hành động hay tôi cần làm mất hiệu lực phiên hoặc làm điều gì đó phù hợp hơn cho tình huống.