управляемый bean-компонент bean-объект vs-компонент Stateful vs httpsession - PullRequest
6 голосов
/ 16 ноября 2011

Мне нужен способ сохранить выбранную пользователем конфигурацию, состоящую из разных частей.каждая часть выбирается на отдельной странице из списка, предоставляемого управляемым компонентом (по одному на каждый тип детали).

теперь забавная часть.у меня есть дата, всегда видимый, то же самое для всех страниц, которые я вставил с <ui:include> в шаблоне для всех вышеупомянутых страниц.я хочу, чтобы эти данные отражали выбор или изменения в выборе, которые пользователи делают для деталей.может быть, сохранить такую ​​конфигурацию в БД, но это не мой приоритет сейчас.Это своего рода корзина покупок, но у меня нет разных пользователей (это всего лишь прототип), поэтому вход в систему не требуется.

это мое первое знакомство с javaee, jsf, ejb, я не знаю, какой из них будет лучшим.Я читал о различных вариантах, и я чувствую, что в любом случае сработает, поэтому я могу что-то упустить.

Я был бы признателен, если бы кто-то указал мне правильное направление.

1 Ответ

11 голосов
/ 16 ноября 2011

Вы можете использовать управляемый 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 снаружи.

...