Как позволить JSF проходить через атрибуты HTML
Я использую Primefaces 3 в JSF 2, чтобы сделать окно поиска. Мне нужно добавить нестандартный атрибут (x-webkit-speech) в элемент управления, чтобы у вас было что-то вроде этого...
<p:autoComplete x-webkit-speech="x-webkit-speech" ... />
Поскольку этот атрибут не является частью элемента управления автозаполнением, JSF выдает ошибку 500. Но когда я удаляю его, страница отображается нормально. В общем, как вы определяете сквозные атрибуты в теге JSF, чтобы они игнорировались?
3 ответа
JSF по своему дизайну игнорирует все пользовательские атрибуты при рендеринге HTML. Вам нужен пользовательский рендер. Это в случае с PrimeFaces <p:autoComplete>
(и все другие компоненты), к счастью, относительно просто. Достаточно переопределить только renderPassThruAttributes()
метод, в котором вы добавляете новый атрибут, который вы хотите визуализировать в attrs
аргумент и, наконец, делегировать супер метод.
Например
package com.example;
import java.io.IOException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import org.primefaces.component.autocomplete.AutoCompleteRenderer;
public class MyAutoCompleteRenderer extends AutoCompleteRenderer {
@Override
protected void renderPassThruAttributes(FacesContext facesContext, UIComponent component, String[] attrs) throws IOException {
String[] newAttrs = new String[attrs.length + 1];
System.arraycopy(attrs, 0, newAttrs, 0, attrs.length);
newAttrs[attrs.length] = "x-webkit-speech";
super.renderPassThruAttributes(facesContext, component, newAttrs);
}
}
Чтобы запустить его, зарегистрируйте его в своем веб-приложении следующим образом faces-config.xml
:
<render-kit>
<renderer>
<component-family>org.primefaces.component</component-family>
<renderer-type>org.primefaces.component.AutoCompleteRenderer</renderer-type>
<renderer-class>com.example.MyAutoCompleteRenderer</renderer-class>
</renderer>
</render-kit>
(вы можете узнать семейство компонентов и тип рендерера, посмотрев на исходный код AutoComplete
класс, они указаны как COMPONENT_FAMILY
а также RENDERER_TYPE
константы есть)
Нет, @FacesRenderer
аннотация просто не будет работать, если целью является переопределение пользовательских средств визуализации, которые сами по себе уже зарегистрированы в faces-config.xml
,
Большинство тегов можно расширить с помощью тега-атрибута из JSF-Ext.
<html xmlns:h="http://java.sun.com/jsf/html" xmlns:e="http://java.sun.com/jsf/ext">
<!-- ... -->
<h:inputText id="name" value="#{bean.name}">
<e:attribute name="placeholder" value="My Name"/>
</h:inputText>
<!-- ... -->
</html>
Вы можете настроить его через Maven:
<dependency>
<groupId>com.intersult</groupId>
<artifactId>jsf-ext</artifactId>
<version>2.2.0.1</version>
</dependency>
JSF-Ext - библиотека из http://www.intersult.com/wiki/page/JSF%20Ext
Я не уверен, возможно ли это вообще. Я бы добавил эти атрибуты на стороне клиента, используя javascript или jQuery.
Вы можете поместить выражения el в свой код javascript, если хотите интегрировать элементы на стороне сервера.