<p:inputText> 值未更新

<p:inputText> values not updating

我与用户有一个table。我可以注册一个新用户并从 table 中删除任何学生。但是编辑用户不起作用。我不知道为什么。在我的 jsf 页面上注册一个新用户按钮如下所示:

<p:commandButton id="submit" value="Create Student" update=":dataTable" actionListener="#{studentManagedBean.createStudent()}" />

它正在我的数据库中创建一个新学生并更新我的 <p:dataTable> ..... </p:dataTable> id "dataTable".

p:dataTable 我有edit | delete 每行的命令链接。删除命令链接如下所示。

<p:commandLink value="delete" update=":dataTable" action="#{studentManagedBean.deleteStudent(std)}"/>

正在从我的数据库中删除所选学生并更新我的 <p:dataTable>

编辑命令链接如下所示。

<p:commandLink value="edit" update=":dataTable" action="#{studentManagedBean.editStudent(std)}" rendered="#{std.editable eq '0'}"/>            
<p:commandLink value="save" update=":dataTable" action="#{studentManagedBean.editStudent(std)}" rendered="#{std.editable eq '1'}"/>

我的数据表中每一列的内部看起来像这样。

<p:outputLabel value="#{std.firstName}" rendered="#{std.editable eq '0'}"/>
<p:inputText value="#{std.firstName}" rendered="#{std.editable eq '1'}"/>

如您所见,如果 editable(db 中的字符)为 '1',则它显示 inputText 字段而不是 outputLabel。到目前为止一切正常。当我单击 edit 时,commandLink outputLabel 字段隐藏并显示 inputText 字段,并且 commandLink 文本从 edit 更改为 save。但是如果我更改行中的旧值,它不会用新值更新我的 std 对象。

editStudent(std) 方法如下所示。

public void editStudent(Student std) {
   if(std.getEditable() == '0') {
     std.setEditable('1');
   } else {
     std.setEditable('0');
   }
   studentFacade.edit(std);
}

我在调用 studentFacade.edit(std) 方法之前手动更改了 editable 列。并且它会更新数据库中的新 editable 值。它只是没有从 inputText 字段中获取新编辑的值。

studentFacade.edit 方法如下所示。

public void edit(Student entity) {
   getEntityManager().merge(entity);
}

我无法从 jsf 页面将新编辑的值抓取到 editStudent 方法中。我错过了什么?

编辑:

char 对我的渲染元素毫无问题。但是我将 char 更改为 string 并用这个替换了旧的渲染。 rendered="#{std.editable eq '0'.charAt(0)}" 同样的结果。看看这两张照片。

在这种情况下我无法删除渲染。否则 table 视图将看起来不一样。有更好的解决方案吗?

编辑 2:

1) 我使用 MySQL 并且它不支持 BOOLEAN 作为 true 或 false 但 0 或非 0 值。所以,我不能使用 rendered="#{std.editable}" 可以吗?

2) 我在数据table 中没有<h:form> 标签。完整的 xhtml 页面如下所示:

<p:layout id="layout" styleClass="reg-student-layout">
            <p:layoutUnit id="layoutRegister" position="west" resizable="false" size="225">
                <h:form id="registerForm">
                    <h3>Registrera ny student</h3>

                    <h:outputText value="Förnamn"/><h:message for="first_name"/>
                    <br><p:inputText id="first_name" value="#{studentManagedBean.student.firstName}"/></br>

                    <h:outputText value="Efternamn"/><h:message for="last_name"/>
                    <br><p:inputText id="last_name" value="#{studentManagedBean.student.lastName}"/></br>

                    <h:outputText value="Telefon"/><h:message for="tel_number"/>
                    <br><p:inputText id="tel_number" value="#{studentManagedBean.student.telefon}"/></br>

                    <h:outputText value="Adress"/><h:message for="address"/>
                    <br><p:inputText id="address" value="#{studentManagedBean.student.address}"/></br>

                    <h:outputText value="Email"/><h:message for="email"/>
                    <br><p:inputText id="email" value="#{studentManagedBean.student.email}"/></br>

                    <h:outputText value="Start Date"/><h:message for="start_date"/><br/>
                    <p:calendar id="start_date" value="#{studentManagedBean.student.startDate}" pattern="dd-MM-yyyy" /><br/>

                    <br><p:commandButton id="submit" value="Skapa Student" update="registerForm, :dataTable"
                                         actionListener="#{studentManagedBean.createStudent()}" /></br>
                </h:form>
            </p:layoutUnit>

            <!-- TABLE VIEW -->
            <p:layoutUnit id="layoutTable" position="center">
                <p:dataTable id="dataTable" value="#{studentManagedBean.getStudents()}" var="std">

                    <p:column>
                        <f:facet name="header">Förnamn</f:facet>
                        <p:outputLabel value="#{std.firstName}" rendered="#{std.editable eq '0'.charAt(0)}"/>
                        <p:inputText value="#{std.firstName}" rendered="#{std.editable eq '1'.charAt(0)}"/>
                    </p:column>

                    <p:column>
                        <f:facet name="header">Efternamn</f:facet>
                        <p:outputLabel value="#{std.lastName}" rendered="#{std.editable eq '0'.charAt(0)}"/>
                        <p:inputText value="#{std.lastName}" rendered="#{std.editable eq '1'.charAt(0)}"/>
                    </p:column>

                    <p:column>
                        <f:facet name="header">Telefon</f:facet>
                        <p:outputLabel value="#{std.telefon}" rendered="#{std.editable eq '0'.charAt(0)}"/>
                        <p:inputText value="#{std.telefon}" rendered="#{std.editable eq '1'.charAt(0)}"/>
                    </p:column>

                    <p:column>
                        <f:facet name="header">Adress</f:facet>
                        <p:outputLabel value="#{std.address}" rendered="#{std.editable eq '0'.charAt(0)}"/>
                        <p:inputText value="#{std.address}" rendered="#{std.editable eq '1'.charAt(0)}"/>
                    </p:column>

                    <p:column>
                        <f:facet name="header">Email</f:facet>
                        <p:outputLabel value="#{std.email}" rendered="#{std.editable eq '0'.charAt(0)}"/>
                        <p:inputText value="#{std.email}" rendered="#{std.editable eq '1'.charAt(0)}"/>
                    </p:column>

                    <p:column>
                        <f:facet name="header">Registrerad</f:facet>
                        <p:outputLabel value="#{std.startDate}" rendered="#{std.editable eq '0'.charAt(0)}">
                            <f:convertDateTime pattern="dd-MM-yyyy"/>
                        </p:outputLabel>

                        <p:inputText value="#{std.startDate}" rendered="#{std.editable eq '1'.charAt(0)}">
                            <f:convertDateTime pattern="dd-MM-yyyy"/>
                        </p:inputText>
                    </p:column>

                    <p:column>
                        <f:facet name="header">Edit</f:facet>
                        <p:commandLink value="edit" update=":dataTable" action="#{studentManagedBean.editStudent(std)}" rendered="#{std.editable eq '0'.charAt(0)}"/>

                        <p:commandLink style="color: royalblue" value="save" update=":dataTable" action="#{studentManagedBean.editStudent(std)}" rendered="#{std.editable eq '1'.charAt(0)}"/>
                    </p:column>

                    <p:column>
                        <f:facet name="header">Ta bort</f:facet>
                        <p:commandLink value="delete" update=":dataTable" action="#{studentManagedBean.deleteStudent(std)}"/>
                    </p:column>
                </p:dataTable>
            </p:layoutUnit>
        </p:layout>

如果我尝试在 <p:layoutUnit position="center"> 中使用 <h:form> 标签,则会出现此错误。 Cannot find component with expression ":dataTable" referenced from "registerForm:submit"。我在注册按钮的更新属性中尝试了所有组合。没有任何成功。例如:update="registerForm, :dataTableId"update="registerForm, :formId:dataTableId"(当我使用表格时)、update="registerForm, :layoutUnitId:formId:dataTableId".

3) 我打印出来并从现有对象中获取所有字段值。没什么问题。

我发现了我的问题。在我的 editStudent 方法中,我使用了全局学生实例而不是传递给方法的实例 (std),它工作得很好。

public void editStudent(Student std) {
   if(std.getEditable() == '0') {
     std.setEditable('1');
   } else {
     std.setEditable('0');
   }
   studentFacade.edit(student);
}