#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»