Вы можете использовать управляемый bean-объект сессионной области для хранения информации о корзине. Вот основной базовый пример (дубликаты продуктов и количество не учитываются; это просто общее представление):
@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;
}
}
(вы можете использовать Map<Product, Integer>
или Map<Product, Order>
для отслеживания количества)
Затем вы можете отобразить корзину следующим образом:
<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>
Вы можете добавить товары в корзину из другой таблицы следующим образом:
<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 с отслеживанием состояния интересен только в том случае, если вы хотите иметь возможность использовать его в другом месте веб-приложения с помощью других API / сред или даже в удаленных клиентах или когда вы хотите использовать контекст постоянства для блокировки элементов, находящихся в данный момент в корзина, так что другие клиенты не могут добавить его в корзину. HttpSession
не имеет значения, поскольку JSF в любом случае хранит управляемые bean-объекты в рамках сеанса, и вы не хотите открывать необработанный Servlet API из-под оболочек JSF снаружи.