Поместить значения из datatable(jsf) в коллекцию

214
06 сентября 2018, 13:50

Имеется datatable на JSF странице с столбцами, которой являются название продукта, его цена и input поле количества этого товара. При нажатии кнопки нужно загрузить в коллекцию элементы из datatable, где значение введенного количества больше 0 (метод addCups()).

Как можно корректно это реализовать?

@ManagedBean
@SessionScoped
public class OrderBean extends SpringBeanAutowiringSupport {
@Autowired
private OrderDAO orderDAO;
@Autowired
private OrderPositionDAO orderPositionDAO;

private Map<Long, Integer> selectedItems = new HashMap<>();
private Integer quantityOfCups;
public Map<Long, Integer> getSelectedItems() {
    return selectedItems;
}
public void setSelectedItems(Map<Long, Integer> selectedItems) {
    this.selectedItems = selectedItems;
}
public Integer getQuantityOfCups() {
    return quantityOfCups;
}
public void setQuantityOfCups(Integer quantityOfCups) {
    this.quantityOfCups = quantityOfCups;
}

public void addCups(Long id, Integer numOfCups){
    if(numOfCups > 0){
        selectedItems.put(id, numOfCups);
    }
    if(numOfCups == 0){
        selectedItems.remove(id);
    }
    System.out.println(selectedItems);
}

JSF страница

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:p="http://primefaces.org/ui">
<h:form>
<p:dataTable value="#{coffeeBean.allCoffee}" var="coffee">
    <p:column>
        <h:outputText value="#{coffee.coffeeName}"/>
    </p:column>
    <p:column>
        <h:outputText value="#{coffee.costForCup}"/>
    </p:column>
    <p:column>
        <p:inputText value="#{orderBean.quantityOfCups}"/>
    </p:column>
</p:dataTable>
    <h:commandButton value="add cups" action="#{orderBean.addCups(coffee.id, orderBean.quantityOfCups)}"/>
</h:form>

</html>
Answer 1

Начнём разбирать код по порядку:

1) coffee видна только в рамках компонента p:dataTable, так как объявлена в внутри него. Параметр coffee.id в выражении #{orderBean.addCups(coffee.id, orderBean.quantityOfCups)} примет значение null.

2) Выражение #{orderBean.quantityOfCups} ссылается на одну переменную и для каждой строчки будет перезаписываться.

Путей решения приведённой задачи может быть много, самые очевидные: добавить в coffeeBean.allCoffee поле количество чашек либо повесить слушатель на поле ввода. Для количества страница:

<p:dataTable value="#{coffeeBean.allCoffee}" var="coffee">
    <p:column>
        <h:outputText value="#{coffee.coffeeName}"/>
    </p:column>
    <p:column>
        <h:outputText value="#{coffee.costForCup}"/>
    </p:column>
    <p:column>
        <p:inputText value="#{coffee.quantityOfCups}"/>
    </p:column>
</p:dataTable>
<h:commandButton value="add cups" action="#{orderBean.addCups()}"/>

bean

public void addCups(){
    for(Coffee coffee: coffeeBean.getAllCoffee){
         if(coffee.getQuantityOfCups > 0)
             selectedItems.put(coffee.getId(), coffee.getQuantityOfCups);
         if(coffee.getQuantityOfCups == 0)
             selectedItems.remove(coffee.getId());
    }
}

Для слушателя:

<p:dataTable value="#{coffeeBean.allCoffee}" var="coffee">
    <p:column>
        <h:outputText value="#{coffee.coffeeName}"/>
    </p:column>
    <p:column>
        <h:outputText value="#{coffee.costForCup}"/>
    </p:column>
    <p:column>
        <p:inputText value="#{orderBean.quantityOfCups}">
            <p:ajax event="change" process="@this" update="@this" listener="#{orderBean.addCups(coffee.id)}"/>
        </p:inputText>
    </p:column>
</p:dataTable>

bean

public void addCups(Long id){
    if(quantityOfCups > 0)
         selectedItems.put(id, quantityOfCups);
    if(quantityOfCups == 0)
         selectedItems.remove(id);
}
public Integer getQuantityOfCups() {
    return quantityOfCups;
}
public void setQuantityOfCups(Integer quantityOfCups) {
    this.quantityOfCups = quantityOfCups;
}
READ ALSO
Bootstrap стили только для DatePicker

Bootstrap стили только для DatePicker

Использую DatePicker от bootstrap, но вся стилизация bootstrap мне не нужна, нарушает собственнуюКак я могу выделить только нужные мне стили? Не могу понять,...

181
Блок с информацией занял всю ширину

Блок с информацией занял всю ширину

Подскажите пожалуйста, где ошибка в коде? Надо чтобы было как на картинке, но в браузере блок с ценой расположен под блоком с информацией

185
Хочу сделать валидацию и отправку формы на чистом css+js, по получаю ошибки

Хочу сделать валидацию и отправку формы на чистом css+js, по получаю ошибки

Есть форма отправкиПытаюсь сделать валидацию и иммитацию отправки формы (со страницы не должно перебрасываться, а просто над кнопкой отправить...

202
Как прописать в коде, какую спецификацию javascript я использую?

Как прописать в коде, какую спецификацию javascript я использую?

Использую node js на сервере (с помощью) PassengerУстановил версию 9

222