Comment laisser JSF passer les attributs HTML
j'utilise Primefaces 3 dans JSF 2 pour faire une boîte de recherche. J'ai besoin d'ajouter un attribut non standard (X-webkit-speech) au contrôle pour que vous ayez quelque chose comme ça...
<p:autoComplete x-webkit-speech="x-webkit-speech" ... />
puisque cet attribut ne fait pas partie du contrôle autoComplete JSF me donne une erreur 500. Mais quand je l'enlève,la page rend bien. En général, comment spécifiez-vous les attributs pass through sur une balise JSF pour qu'ils soient ignorés?
3 réponses
JSF by design ignore tous les attributs personnalisés lors du rendu HTML. Vous avez besoin d'un renderer personnalisé. Ceci est dans le cas de PrimeFaces <p:autoComplete>
(et tous les autres composants) heureusement relativement simple. Il suffit de surcharger juste la méthode renderPassThruAttributes()
dans laquelle vous ajoutez le nouvel attribut que vous souhaitez rendre à l'argument attrs
et finalement déléguer à la méthode super.
E. G.
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);
}
}
Pour le faire fonctionner, enregistrez-le comme suit dans votre webapp 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>
(vous pouvez trouver la famille de composants et le type de rendus en regardant le code source de AutoComplete
classe, ils sont spécifiés comme COMPONENT_FAMILY
et RENDERER_TYPE
constantes là-dedans)
Non, l'annotation @FacesRenderer
ne fonctionnera tout simplement pas lorsque le but est de remplacer les rendus personnalisés qui sont eux-mêmes déjà enregistrés dans un faces-config.xml
.
la plupart des Tags peuvent être étendus, en utilisant L'attribut-Tag de 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>
vous pouvez le configurer via maven:
<dependency>
<groupId>com.intersult</groupId>
<artifactId>jsf-ext</artifactId>
<version>2.2.0.1</version>
</dependency>
JSF-Ext est une bibliothèque de http://www.intersult.com/wiki/page/JSF%20Ext
Je ne suis pas sûr que ce soit possible. J'ajouterais ces attributs du côté client en utilisant javascript ou jQuery.
vous pouvez mettre des expressions el dans votre code javascript si vous voulez intégrer des trucs côté serveur.