2012-11-13 36 views
5

Đâ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:

  1. 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; 
    
  2. 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:

  1. 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.
  2. 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.
  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.

Trả lời

1

Rất thú vị nhưng có thể là câu hỏi được mở.

Trước hết phạm vi phụ thuộc vào tiện ích bạn sẽ cung cấp cho danh mục của mình. Tôi đề nghị bạn đi qua @ViewScoped nếu bạn muốn liên kết dữ liệu với một chế độ xem cụ thể hoặc @SessionScoped nếu mục tiêu của bạn là triển khai một thứ gì đó giống như giỏ mua hàng.

Đối với các chức năng đệ quy Tôi nghĩ rằng bạn nên tránh loại thực hành theo quan điểm thuần túy (xhtml) lớp và sử dụng một thư viện như Primefaces hoặc Richfaces đã tích hợp thành phần cho những gì bạn muốn làm. Sử dụng chúng, bạn chỉ phải chăm sóc cấu trúc logic của chúng một cách có lập trình bên trong bean sao lưu được quản lý của bạn.

Cuối cùng, đối với các giới hạn về danh mục, tôi đề nghị bạn chỉ tải những gì bạn sẽ sử dụng từ cơ sở dữ liệu. Bằng cách đó, bạn không bị quá tải không phải là các cơ sở dữ liệu máy chủ hoặc máy chủ-khách hàng. Bạn có thể có một bean @SessionScoped quản lý phiên người dùng đã đăng nhập hiện tại và tùy thuộc vào việc bạn có thể yêu cầu cơ sở dữ liệu cho một số giá trị hoặc các giá trị khác. Ngoài ra, bạn phải quan tâm đến danh mục của mình, nếu bạn đang thực hiện rất nhiều sửa đổi trong phiên, có thể hạt đậu @ViewScoped là lựa chọn tốt hơn vì nó sẽ được tải lại mỗi lần xem được yêu cầu. Nếu bạn sử dụng @SessionScoped đậu cho rằng bạn phải tự thêm từng thay đổi vào nó, để duy trì nó được cập nhật trong phiên.

"load the whole catalogue and limit its children in views with rendered=false"

Đó là một công việc bạn không cần phải làm gì nếu bạn làm điều đó theo cách tôi nói. Đánh giá tình trạng từng nút cây có thể là địa ngục nếu bạn đang quản lý một cây phức tạp và đưa thêm logic vào khung nhìn. Chắc chắn bạn nên tránh điều đó càng xa càng tốt.

Ngay cả khi bạn đã đạt được giải pháp, đó là ý tưởng chính của tôi về điều đó.

1

Bạn có thể sử dụng bộ nhớ cache để lưu trữ các menu cho các vai trò người dùng khác nhau. Sau đó, bạn sẽ vô hiệu hóa bộ nhớ cache khi bạn chèn dữ liệu mới vào cơ sở dữ liệu (nếu bạn chèn dữ liệu này từ trang quản trị) hoặc bạn có thể đặt bộ nhớ cache hết hạn sau một khoảng thời gian nhất định (mỗi ngày một lần, cứ vài giờ, v.v.) đọc lại dữ liệu khi bộ nhớ cache hết hạn.

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