Ответ 1
Вы не можете достичь этого, используя <h:inputText>
. Его имя автогенерируется JSF на основе идентификатора клиента (который, в свою очередь, основан на идентификаторе компонента и всех его родителях-именованиях).
У вас есть в основном 2 варианта для достижения конкретного функционального требования:
-
Если нет других родительских контейнеров именования, сообщите родительской форме, чтобы он не добавлял свой идентификатор:
<h:form prependId="false">
Это приведет к ошибке
<f:ajax>
. -
Используйте простые элементы HTML вместо компонентов JSF:
<input name="name" value="#{bean.name}" /> <input name="email" value="#{bean.email}" />
Вам нужно собрать их самостоятельно через
@ManagedProperty
в области с запросом bean:@ManagedProperty("#{param.name}") private String name; @ManagedProperty("#{param.email}") private String email;
И вы пропустите JSF встроенный механизм проверки/преобразования и ajax magic.
Однако существует совершенно другая альтернатива: используйте HTML5 <input type="email">
. Таким образом браузер автоматически отключит все ранее введенные электронные письма на входах того же типа. Это не поддерживается <h:inputText>
. Однако вы можете использовать собственный набор рендеринга, чтобы он работал, как указано в Добавление поддержки пользовательского атрибута (HTML5) в Primefaces (3.4):
<h:inputText type="email" ... />
Обновить по состоянию на JSF 2.2 вы можете, наконец, легко объявить атрибуты passsthrough, не нуждаясь в настраиваемом наборе рендеринга.
<... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
...
<h:inputText a:type="email" ... />