Использование тегов, связанных с bootstrap внутри JSF2 h: компонент inputText

В любом случае использовать теги, связанные с bootstrap, в компонентах JSF2? Например, я заинтересован в использовании функции bootstrap typeahead, которая требует чего-то вроде

<h:inputText id="typeahead" type="text" data-provide="typeahead"></h:inputText>

но поскольку data-provide не существует для h:inputText, он становится лишенным и поэтому функция typeahead, очевидно, не будет работать.

Ответ 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>

См. также: