dataTable или foreach для изменения данных - PullRequest
0 голосов
/ 19 февраля 2012

У меня есть приложение, которое хранит пользователей в базе данных.Я хочу, чтобы администраторы могли обновлять данные этих пользователей и пытались создать таблицу данных, которая вызывает бин, чтобы получить список пользователей, и перебирает пользователей для вывода их данных.Я вывожу данные в поля inputText, чтобы администратор мог редактировать их данные.Рядом с полями inputText находится commandLink для сохранения изменений, который должен вызывать bean-метод (sessionScoped) для объединения изменений в базу данных.

Я пытался сделать это с помощью dataTable, а также вручную с foreach,Ни один из них не работал.

Проблема в том, что в bean-методе, который вызывается при щелчке ссылки, значения остаются старыми, а не отредактированными (я хочу, чтобы это были новые значенияиз полей inputText).Я провел небольшое исследование о ActionListener.Поэтому я добавил actionListener в commandLink, который должен копировать новые значения полей inputText в bean-атрибут, но он также не работал.

Это код моей jsf-страницы:

<c:forEach items="#{UserBean.getUserList()}" var="customer">
      <tr>
          <h:form>
              <td>
                  <h:inputText disabled="true" value="#{customer.username}"/>
              </td>
              <td>
                  <h:inputText value="#{customer.firstname}"/>
              </td>
              <td>
                  <h:inputText value="#{customer.lastname}"/>
              </td>
              <td>
                  <h:inputText value="#{customer.email}"/>
              </td>
              <td>
                  <h:commandLink action="#{UserBean.update()}" value="Save changes">
                      <f:setPropertyActionListener target="#{UserBean.user}" value="#{customer}" />
                  </h:commandLink>
              </td>
          </h:form>
      </tr>
 </c:forEach>

Это мой бин:

@ManagedBean(name="UserBean")
@SessionScoped
public class UserBean implements Serializable{

    private Users user;

    private List<Users> userList;


    public UserBean() {
        user = new Users();
    }

    public Users getUser() {
        return user;
    }

    public void setUser(Users user) {
        this.user = user;
    }

    public String update(){
        System.out.println(user.getFirstname());

        return null;
    }

    public List<Users> getUserList(){
        userList = findAll();
        return userList;
    }

    public void setUserList(List<Users> userList){
        this.userList = userList;
    }

    public List<Users> findAll(){
        if(userSessionBean.getSessionUser().getUgroup() > 1){
            userList = em.createNamedQuery("Users.findAll")
                    .getResultList();
            return userList;
        }
        else{
            userList = em.createNamedQuery("Users.findById")
                    .setParameter("id", userSessionBean.getSessionUser())
                    .setMaxResults(1)
                    .getResultList();
            return userList;
        }
    }
}

Кто-нибудь знает, что я делаю неправильно или в чем проблемаможет быть?

1 Ответ

2 голосов
/ 19 февраля 2012

Вы загружаете модель в методе получения.

public List<Users> getUserList(){
    userList = findAll();
    return userList;
}

Таким образом, каждый раз, когда вызывается метод получения, он будет возвращать новую новую модель и отменять любые ранее сделанные изменения в модели.

Переместить эту строку в конструктор (post) компонентаmethod.

@PostConstruct
public void init() {
    userList = findAll();
}

public List<Users> getUserList(){
    return userList;
}

Как только вы исправите это, просто используйте <h:dataTable>.Это приводит к уменьшению стандартного кода.

См. Также

...