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?

6
demandé sur Adam 2012-05-07 19:00:07

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 .

7
répondu BalusC 2012-05-08 12:46:39

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

1
répondu Tires 2014-07-18 13:37:05

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.

0
répondu Matt Handy 2012-05-08 07:25:07