考虑以下jsf页面:
<h:body>
<h:form id="SessionStartDialog">
<table>
<tr>
<td class="label">
<h:outputLabel
value="Enter your username:"
for="UsernameField"/>
</td>
<td class="input">
<h:inputText
id="UsernameField"
value="#{login.username}"
validator="#{login.validateUsername}"
tabindex="1">
<f:ajax render="SelectWorkingSetListbox
StartSessionButton UsernameMessage" />
</h:inputText>
<h:message
id="UsernameMessage"
for="UsernameField" />
</td>
</tr>
<tr>
<td class="label">
<h:outputLabel
value="Choose a working-set:"
for="SelectWorkingSetListbox"/>
</td>
<td class="input">
<h:selectOneMenu
id="SelectWorkingSetListbox"
tabindex="2"
disabled="#{!login.showWorkingSets}"
value="#{login.selectedWorkingSetName}">
<f:selectItems
value="#{login.workingSetNames}"/>
<f:ajax />
</h:selectOneMenu>
</td>
</tr>
</table>
<h:commandButton
id="StartSessionButton"
styleClass="StartSessionButton"
disabled="#{!login.showWorkingSets}"
value="Start Session"
tabindex="3"
action="#{login.startSession}" >
<f:ajax execute="@form"/>
</h:commandButton>
</h:form>
</h:body>其中的某些内容会导致Safari报告一个错误,即ajax和完整请求混合在一起。我不明白为什么,因为所有导致请求的组件都包含<f:ajax>-tags。这里有什么问题?
更新
我创建了一个触发此错误的最小示例:
<h:body>
<h:form>
<f:ajax render="TextField">
<h:inputText value="#{theBean.text}" />
</f:ajax>
<h:outputText id="TextField" value="#{theBean.text}" />
</h:form>
</h:body>theBean是一个简单的视图范围bean,text是一个String类型的属性.出于某种原因,这将触发Safari 5.1中的以下消息:
httpError: Http传输返回0状态代码。这通常是混合ajax和完整请求的结果。由于性能和数据完整性的原因,这通常是不可取的。
更新2原因似乎是,在input-field中命中enter总是会触发完整的表单提交。我不知道该怎么防止这件事。如第一个示例所示,我希望用户输入用户名,然后启用表单的其他组件(只有当用户名已知时)。我将如何正确地实现这一点?
发布于 2011-08-20 19:30:09
造成此问题的原因是,在没有<h:commandButton>的情况下(在第一个示例中,它最初是禁用的,在第二个示例中,没有),按返回将触发整个表单的提交,从而导致问题中显示的错误。
目前的解决方案是始终启用<h:commandButton>。因为它是<f:ajax>-enabled,这将阻止完全提交。
P.S.:我发布这个答案是为了给其他人展示一个可能的解决方案。我仍然想知道是否有更好的解决方案(一个不需要<h:commandButton>的解决方案)。
https://stackoverflow.com/questions/7026685
复制相似问题