2011-11-16 25 views
6

tôi cần một cách để lưu cấu hình do người dùng chọn bao gồm các phần khác nhau. mỗi phần được chọn trên một trang riêng biệt, từ một danh sách được cung cấp bởi một bean được quản lý (một phần cho mỗi loại phần).phiên quản lý phạm vi đậu vs đậu trạng thái vs httpsession

giờ là phần thú vị. tôi có một dữ liệu, luôn hiển thị, giống với tất cả các trang mà tôi đã chèn với <ui:include> trong mẫu cho tất cả các trang được đề cập ở trên. tôi muốn dữ liệu này thể hiện sự lựa chọn hoặc thay đổi trong lựa chọn mà người dùng thực hiện cho các phần. có thể lưu cấu hình như vậy cho db, nhưng đó không phải là ưu tiên của tôi bây giờ. đó là một loại giỏ hàng, nhưng tôi không có người dùng khác (chỉ là mẫu thử nghiệm), vì vậy không cần đăng nhập.

đây là lần đầu tiên tôi gặp gỡ với javaee, jsf, ejb, tôi không biết đó sẽ là phương pháp tốt nhất. Tôi đã đọc về các lựa chọn khác nhau, và tôi cảm thấy như một trong hai cách sẽ làm việc, vì vậy tôi có thể thiếu một cái gì đó.

Tôi sẽ đánh giá cao người nào đó đang chỉ cho tôi đúng hướng.

Trả lời

11

Bạn có thể sử dụng bean được quản lý theo phiên để giữ thông tin giỏ hàng. Dưới đây là một ví dụ Kickoff cơ bản (sao chép sản phẩm và số lượng không chiếm; nó chỉ là để cung cấp cho các ý tưởng tổng thể):

@ManagedBean 
@SessionScoped 
public class Cart { 

    private List<Product> products = new ArrayList<Product>(); 

    public void add(Product product) { 
     products.add(product); 
    } 

    public void remove(Product product) { 
     products.remove(product); 
    } 

    public List<Product> getProducts() { 
     return products; 
    } 

} 

(bạn có thể sử dụng một Map<Product, Integer> hoặc Map<Product, Order> để theo dõi số lượng)

Bạn có thể sau đó hiển thị giỏ hàng như sau:

<h:dataTable value="#{cart.products}" var="product"> 
    <h:column>#{product.description}</h:column> 
    <h:column><h:commandButton value="Remove" action="#{cart.remove(product)}" /></h:column> 
</h:dataTable> 

Bạn có thể thêm sản phẩm vào giỏ hàng từ bảng khác như sau:

<h:dataTable value="#{products.list}" var="product"> 
    <h:column>#{product.description}</h:column> 
    <h:column><h:commandButton value="Add" action="#{cart.add(product)}" /></h:column> 
</h:dataTable> 

EJB nhà nước chỉ thú vị nếu bạn muốn có thể sử dụng nó ở nơi khác trong webapp bằng các API/khung khác nhau hoặc ngay cả trong ứng dụng khách từ xa hoặc khi bạn muốn sử dụng ngữ cảnh bền vững để khóa các mục hiện đang trong giỏ hàng, để các khách hàng khác không thể thêm nó vào giỏ hàng. HttpSession không có liên quan vì JSF lưu trữ các bean được quản lý theo phiên trong đó và bạn không muốn để lộ API Servlet thô từ dưới các lớp JSF đến bên ngoài.

+1

cảm ơn youuuuu. nó gần giống như Giáng sinh mỗi khi bạn trả lời một trong những câu hỏi của tôi – glasspill

+0

Bạn được chào đón. – BalusC

+0

Và nếu bạn gặp lỗi như 'Lớp' javax.faces.component.html.HtmlDataTable 'không có thuộc tính' description'' thay đổi tên của 'var', vì bạn có thể đã sử dụng cùng một tên cho một lớp khác ở nơi khác, đó là mâu thuẫn với hiện tại và bạn sẽ dành nhiều lứa tuổi tìm kiếm nguyên nhân. – glasspill

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