Ответ 1
Зависит от версии JSF, которую вы используете.
В JSF 2.0/2.1 невозможно указать дополнительные атрибуты. Средство визуализации JSF HTML будет отображать только предопределенные атрибуты. Для достижения желаемой работы вам необходимо создать собственный рендерер. Чтобы свести к минимуму шаблонный код, вы вынуждены расширять визуализатор, специфичный для реализации. Непонятно, какой из них вы используете, поэтому здесь только пример, рассчитанный на Mojarra:
import com.sun.faces.renderkit.html_basic.TextRenderer;
public class MyTextRenderer extends TextRenderer {
@Override
protected void getEndTextToRender(FacesContext context, UIComponent component, String currentValue) throws IOException {
Object dataProvide = component.getAttributes().get("data-provide");
if (dataProvide != null) {
context.getResponseWriter().writeAttribute("data-provide", dataProvide, null);
}
super.getEndTextToRender(context, component, currentValue);
}
}
Зарегистрируйте его в faces-config.xml
следующим образом:
<render-kit>
<renderer>
<component-family>javax.faces.Input</component-family>
<renderer-type>javax.faces.Text</renderer-type>
<renderer-class>com.example.MyTextRenderer</renderer-class>
</renderer>
</render-kit>
В JSF 2.2, это возможно с помощью нового пространства имен passthrough
или тега <f:passThroughAttribute>
. См. Также Что нового в JSF 2.2? - атрибуты сквозной передачи HTML5.
Таким образом, так:
<html ... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
...
<h:inputText id="typeahead" a:data-provide="typeahead" />
(обратите внимание, что атрибут type
по умолчанию равен text
)
Или:
<h:inputText id="typeahead">
<f:passThroughAttribute name="data-provide" value="typeahead" />
</h:inputText>