Datatable не сохраняет вновь добавленный объект - PullRequest
0 голосов
/ 14 ноября 2011

я пытаюсь сделать так, чтобы мой список отображался в виде данных, У меня есть кнопка добавления, нажав на нее, я добавляю пустой StudentVO в таблицу данных. я поддерживаю счетчик cnt, сопоставленный с h: inputHidden, при нажатии кнопки добавления,

Итак, я получаю входной текст в каждом столбце в последней строке таблицы данных,

но когда я снова нажимаю кнопку Добавить, мой счетчик увеличивается, но в списке данных нет вновь добавленного Студента, что я получаю в двух строках с пустым входным текстом

снова при загрузке страницы я получаю последнюю строку с вводимым текстом, тогда как я ожидаю две строки, одна строка с вводимым текстом, который содержит данные, введенные ранее, и новая строка с пустым входным текстом,

это следующий код,

public class StudentBeanThree {
    @Resource(name="jdbc/rahul_sample_pool",type=DataSource.class)
    private List<StudentVO> studentList;
    private Integer cnt;

    public List<StudentVO> getStudentList() {
       -----
    }
    @PostConstruct
    public void init(){
       try{
          loadStudents();
       }catch(Exception e){
          e.printStackTrace();
       }
    }

    private void loadStudents() throws Exception{
       //load student list
    }



public String addNewStudent(){
     // This method is called on click of the add button,
     if(getCnt() == null){
          setCnt(0);
     }

    this.cnt = getCnt();
    this.cnt++;
    this.setCnt(cnt);
    if(this.getStudentList() == null){
       loadStudents();
    }
    for(int x=0; x < getCnt().intValue();x++){
        this.getStudentList().add(new StudentVO());
    }   
   }

}

1 Ответ

0 голосов
/ 14 ноября 2011

Вы готовите модель данных в методе action вместо (post) конструктора bean-компонента.Тогда для JSF уже слишком поздно обновлять модель данных представленными значениями.Предполагается, что модель данных будет завершена до фазы применения значений запроса , но в вашем случае она подготовлена ​​во время фазы invoke action .Вам нужно переместить работу по подготовке модели данных в конструктор (post) компонента.

Исходя из истории вопросов, вы используете JSF 2.0.Я бы предложил гораздо более простой подход: поместите компонент в область видимости.Это так же просто, как:

<h:form>
    <h:dataTable value="#{students.list}" var="student">
        <h:column><h:inputText value="#{student.name}" /></h:column>
    </h:dataTable>
    <h:commandButton value="Add" action="#{students.add}" />
    <h:commandButton value="Save" action="#{students.save}" />
</h:form>

и

@ManagedBean
@ViewScoped
public class Students {

    private List<Student> list;

    @EJB
    private StudentService service;

    @PostConstruct
    public void init() {
        list = service.list();
    }

    public void add() {
        list.add(new Student());
    }

    public void save() {
        service.save(list);
    }

    public List<Student> getList() {
        return list;
    }

}

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...