Рассмотрим следующую страницу 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 Причина этого, по-видимому, заключается в том, что нажатие enter
внутри поля input
всегда вызывает отправку полной формы. Я понятия не имею, как это предотвратить. Как показано в первом примере, я хочу, чтобы пользователь ввел имя пользователя, а затем включаются другие компоненты формы (только если имя пользователя известно). Как бы я это правильно реализовал?