【问题标题】:Datatable don't retain the newly added Object数据表不保留新添加的对象
【发布时间】:2011-11-14 07:56:55
【问题描述】:

我想做的是,我的列表映射到数据表中, 我有一个添加按钮,通过单击它,我在数据表中添加了一个空的 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());
    }   
   }

}

【问题讨论】:

    标签: jsf


    【解决方案1】:

    您正在操作方法中准备数据模型,而不是 bean 的(后)构造函数。然后 JSF 用提交的值更新数据模型为时已晚。数据模型应该在 apply request values 阶段之前完成,但在您的情况下,它是在 invoke action 阶段准备好的。您需要将数据模型准备工作移至 bean 的(后)构造函数。

    根据您的问题历史,您使用的是 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;
        }
    
    }
    

    另见:

    【讨论】:

    • 但我的问题是我已经对方法“init”做了@PostContruct
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    相关资源
    最近更新 更多