Datatable不保留新添加的Object

时间:2011-11-14 07:56:55

标签: jsf

我想要做的是,我的List映射在数据表中, 我有一个添加按钮,通过单击它,我在数据表中添加一个空的StudentVO。 我在点击添加按钮

时维护一个映射到h:inputHidden的计数器cnt

所以我在数据表的最后一行的每一列中得到输入文本,

但是当我再次单击“添加”按钮时,我的计数器会递增,但是数据表列表没有新添加的学生,我得到的是两行空输入文本

再次对页面的加载我得到输入文本的最后一行,而我期待两行,一行包含输入文本,其中包含先前输入的数据,另一行包含空输入文本,

这是以下代码,

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 :(得分:0)

您正在使用action方法而不是(post)bean的构造函数来准备数据模型。然后,JSF用提交的值更新数据模型为时已晚。数据模型应该在应用请求值阶段之前完成,但在您的情况下,它是在调用操作阶段准备的。您需要将准备作业的数据模型移动到bean的(post)构造函数。

根据您的问题历史记录,您使用的是JSF 2.0。我建议一个更简单的方法:将bean放在视图范围内。然后就这么简单:

<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;
    }

}

另见: