2014-11-11 2 views
1

В JSF и Java EE у меня есть ArrayList, я заполняю этот ArrayList объектом, который я создаю на основе пользовательского ввода. Пользователь просто имеет простую форму, которая позволяет им заполнять некоторые значения, нажимать кнопку, чтобы она добавилась в таблицу.Постоянная постоянная переменная JSF

Он добавляется в таблицу с целью иметь цикл for, который выполняет итерацию по всем значениям, которые добавляет пользователь.

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

Вот некоторые общие иллюстрирующим удобство:

public class Car { 
    private String model; 
    private String brand; 
    private String year; 

    // Getters and setters 
} 

@ManagedBean(name = "Car") 
public class CarMaker { 
    ArrayList<Car> carList = new ArrayList<Car>(); 

    // There are values we pass directly from browser 
    private String localModel; 
    private String localBrand; 
    private String localYear; 

    // Getters and setters 

    public void generateCars() { 
     // Generate XML external elements 
     for (int i = 0; i < carList.length; i++) { 
      // Generate XML internal elements 
     } 
     // Finish up XML 
    } 

    public Car carFill() { 
     Car tempCar = new Car(); 
     tempCar.setModel(getLocalModel()); 
     tempCar.setBrand(getLocalBrand()); 
     tempCar.setYear(getLocalYear()); 

     return tempCar; 
    } 

    public void addToTable() { 
     carList.add(carFill()); 
    } 
} 

А вот кнопка, и таблица:

<p:commandButton value="+" id="Add" actionListener="#{Car.addToTable()}" 
      ajax="false" update="growl" styleClass="ui-priority-primary" /> 

<!-- Table start --> 
<p:dataTable var="car" value="#{Car.carList}"> 
    <p:column headerText="Model"> 
     <h:outputText value="#{car.model}" /> 
    </p:column> 
    <p:column headerText="Brand"> 
     <h:outputText value="#{car.brand}" /> 
    </p:column> 
    <p:column headerText="Year"> 
     <h:outputText value="#{car.year}" /> 
    </p:column> 
</p:dataTable> 
<!-- Table end --> 

код сам по себе работает. Он добавляется, все работает. Однако мне нужно знать, как добавить «постоянство» к переменной ArrayList, так что даже после мини-обновления, которое происходит из-за нажатия кнопки +, старая информация, добавленная пользователем, все еще существует.

ответ

2

Добавить аннотацию @ViewScoped в ваш CarMaker управляемый bean-компонент.

Вам, вероятно, придется реализовать java.io.Serializable как в ваших Car, так и в CarMaker классах.

This article от легендарного BalusC объясняет использование различных областей, поддерживаемых в JSF2.

+0

У меня было сокрушительное подозрение, что это было бы очень простое решение. Я буду проверять и давать правильный ответ, если это так. Не могли бы вы расширить свой ответ, чтобы объяснить, почему «@ ViewScoped» - правильный подход к решению и т. Д. В основном для людей, которые находят это через Google. – Erick

+1

Я подтвердил, что это работает (View Scoped) Спасибо за изменение с добавленной информацией. Я буду отмечать это как правильный ответ. Спокойной ночи – Erick

Смежные вопросы