我想要做的是,我的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());
}
}
}
答案 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;
}
}