Управляемый компонент с областью действия сеанса против компонента с отслеживанием состояния против httpssession

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

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

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

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


person glasspill    schedule 16.11.2011    source источник


Ответы (1)


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

@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 в любом случае хранит управляемые компоненты с областью сеанса, и вы не хотите выставлять необработанный API-интерфейс сервлета из-под обложек JSF снаружи.

person BalusC    schedule 16.11.2011
comment
спасибоуууу. это почти как рождество каждый раз, когда ты отвечаешь на один из моих вопросов - person glasspill; 16.11.2011
comment
И если вы получите ошибку типа The class 'javax.faces.component.html.HtmlDataTable' does not have the property 'description', измените имя var, так как вы, вероятно, использовали то же имя для другого в другом месте, которое конфликтует с текущим, и вы потратите целую вечность на поиски причины. - person glasspill; 16.11.2011
comment
Или просто переименуйте атрибут binding="#{product}". - person BalusC; 16.11.2011