本周结束了这个尚未解决的问题。清除按钮应该从表单中清除一些输入字段和一些下拉选择。不需要从表单提交任何内容,我只需在f:ajax标记中使用execute =“@ this”。我向action方法发送了两个参数:记录id及其在模型SessionScope bean中保存的记录列表中的索引。
动作方法如下:
public void clear(Integer id, Integer index)
{
// param id is used for logging and for checking
Employee emp = model.getEmployeeList().get(index);
emp.setCorrectedTitle(null); // wipe out
emp.setCorrectedManager(null); // wipe out
emp = DAO.update(emp);
model.getEmployeeList().set(index, emp);
}
此时我在MySql中手动运行查询,员工记录已按要求更新,所有其他字段都完好无损,特别是主键。 当ajax请求返回时,页面仍显示“title”和“manager”字段的相同旧数据。
为什么页面没有刷新?模型在动作方法中更新,所以我假设渲染阶段应该看到被删除的字段,但我猜它没有。
最重要的是h:commandLink的样子:
<ui:repeat value="#{model.employeeList}" var="employee" varStatus="status">
<h:panelGroup id="container">
<h:inputText value="#{employee.correctedTitle}" />
....link goes here...
</ui:repeat>
<h:commandLink value="Clear"
action="#{bean.clear(employee.id, status.index)}">
<f:ajax render="container" execute="@this"
onevent="monitorclear" />
</h:commandLink>
我的环境是Java 6,Glassfish 3.1.2,Mojarra 2.1.18,NetBeans 7.4和Java 7。 没有任何升级的机会。
请知道我做错了什么。感谢。
EDIT。 好的,这是简化的代码。
这是details.xhtml页面:
<ui:define name="content">
<h:form id="detailForm">
<h:messages id="messages" />
<ui:include src="/WEB-INF/include/employees.xhtml"/>
</h:form>
<div id="freeow"></div>
</ui:define>
employees.xhtml页面:
<ui:composition ...>
<h:panelGroup id="employees" layout="block">
<ui:repeat id="employeeRepeat" value="#{beanDetail.employeeList}" var="employee" varStatus="status">
<h3 class="employeeInfoH3">
<h:panelGroup id="employeeInfoH3" layout="block">
<h:outputText id="status" value="#{employee.status}" />
</h:panelGroup>
</h3>
<h:panelGroup id="employeeInfoDiv" class="employeeInfoDiv" layout="block">
<ui:include src="#{beanDetail.employeeFile>
<ui:param name="employee" value="#{employee}"/>
</ui:include>
<h:panelGroup id="detailButtons" class="detailButtons" layout="block">
<h:commandLink id="revertCall"
action="#{beanDetail.revertChangesToEmployeed, status.index)}"
value="Revert">
<f:ajax render=":detailForm:messages :detailForm:employeeRepeat:employeeInfoH3 :detailForm:employeeRepeat:employeeInfoDiv"
onevent="monitorClearOrRevertCall"
execute="@this" />
</h:commandLink>
</h:panelGroup>
</h:panelGroup>
</ui:repeat>
</h:panelGroup>
</ui:composition>
最后用清除字段的页面,employeeFile.xhtml:
<ui:composition...>
<fieldset class="employeeInput">
<legend>Updated Information</legend>
<p class="rightInfo">
<h:outputLabel for="correctedTitle">Corrected Title:</h:outputLabel>
<h:inputText id="correctedTitle" value="#{employee.correctedTitle}" />
</p>
<p class="rightInfo">
<h:outputLabel for="correctedEmployeeStatus">Corrected Status</h:outputLabel>
<h:selectOneMenu id="correctedEmployeeStatus" value="#{employee.correctedEmployeeStatus}">
<f:selectItem itemLabel="" itemValue="" />
<f:selectItem itemLabel="Permanent" itemValue="P" />
<f:selectItem itemLabel="Contractor" itemValue="C" />
<f:selectItem itemLabel="Student" itemValue="S" />
</h:selectOneMenu>
</p>
</fieldset>
</ui:composition>
我注意到的一件事是我必须使用冒号:detailForm作为表单名称的前缀,即使所有字段都在表单内。