有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Primefaces DataTable内联编辑无法在不重新加载页面的情况下更新模型

我正在尝试使用用户帐户实现table,管理员可以对其进行修改。我在cellEditor中使用primefaces(2.2)数据表组件

我有一个onRowEditListener,它使用manageUsers。onEditRow()方法,通过UserDAO对象在数据库中保存更改

加载页面并更新表单元格后,数据库中的数据将正确更改。不幸的是,当我试图再次更新前一行时,(UserDAO)event.getObject();返回旧对象(第一次更改后的对象),数据没有更新

当我重新加载页面(F5)并编辑行时,数据会正确更改

如何更新表格,或者如何在不重新加载页面的情况下获得最新版本的用户

使用Primefaces 2.2、JSF 2.1和Glassfish 3.1

页面:

                <p:column headerText="login" filterBy="#{u.user.login}" filterMatchMode="contains" style="width:150px">  
                    <p:cellEditor>  
                        <f:facet name="output">  
                            <h:outputText value="#{u.user.login}" />
                        </f:facet>  
                        <f:facet name="input">  
                            <h:form>
                                <p:inputText value="#{u.user.login}" />  
                            </h:form>
                        </f:facet>  
                    </p:cellEditor>  
                </p:column>  

                <p:column headerText="email" filterBy="#{u.user.email}" filterMatchMode="contains" style="width:150px">  
                    <p:cellEditor>  
                        <f:facet name="output">  
                            <h:outputText value="#{u.user.email}" />  
                        </f:facet>  
                        <f:facet name="input">  
                            <h:form>
                                <p:inputText  value="#{u.user.email}" />  
                            </h:form>
                        </f:facet>  
                    </p:cellEditor>  
                </p:column> 

                //... other fields


                <p:column headerText="Options">  
                    <p:rowEditor />  
                </p:column>  

            </p:dataTable>  

        </h:form>

ManageBean与ApplicationScope(CDI)

@Named
@ApplicationScoped
public class ManageUsers implements Serializable {

    @Inject
    /** Inject database */
    private DB db;
    /** List with all leaked data which is loaded from database */
    private List<UserDAO> users;
    private User selectedUser;
    private SelectItem[] manufacturerOptions;

    public ManageUsers() {
        manufacturerOptions = createFilterOptions();
    }

    public SelectItem[] getManufacturerOptions() {
        return manufacturerOptions;
    }

    public User getSelectedUser() {
        return selectedUser;
    }

    public void setSelectedUser(User selectedUser) {
        this.selectedUser = selectedUser;
    }

    /** List of users loaded from database */
    public void getDataFromDatabase() {
        try {
            users = db.getUserList();
            if (users == null) {
                throw new Exception("Pusta lista użytkowników");
            }
        } catch (Exception ex) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Nie można wyświetlić tabeli wyników",
                    "Nie udało się pobrać danych, prosimy spróbować ponownie później.");
            FacesContext.getCurrentInstance().addMessage(null, message);
        }
    }

    /**
     * Get list of leaked Data.
     * If list is null then getDataFromDatabase method is used.
     * @see DataExplorer.getDataFromDatabase()
     */
    public List<UserDAO> getUsers() {
        if (users == null) {
            getDataFromDatabase();
        }
        return users;
    }

    private SelectItem[] createFilterOptions() {
        SelectItem[] options = new SelectItem[3];
        options[0] = new SelectItem("", "-select-");
        options[1] = new SelectItem("true", "Admins");
        options[2] = new SelectItem("false", "Users");

        return options;
    }

    public void onEditRow(RowEditEvent event){ 
        UserDAO userDAO = (UserDAO)event.getObject();
        try {
            userDAO.update();
        } catch (UserDAOException ex) {
            Log.logger.error("User not edited,"+ex);
        }
        //getDataFromDatabase();
    }
}

共 (0) 个答案