Datatable не сохраняет вновь добавленный объект

#jsf

#jsf

Вопрос:

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

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

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

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

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

 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:

Вы готовите модель данных в методе action вместо конструктора (post) компонента. В этом случае JSF слишком поздно обновлять модель данных с помощью представленных значений. Предполагается, что модель данных должна быть завершена до фазы применения значений запроса, но в вашем случае она подготовлена во время фазы вызова действия. Вам нужно переместить задание подготовки модели данных в конструктор bean (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;
    }

}
  

Смотрите также:

Комментарии:

1. но я на свой вопрос я уже выполнил @PostContruct для метода «init»