<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);
}
我与用户有一个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);
}