2012-05-07 3 views
6

Sto usando Primefaces 3 in JSF 2 per creare una casella di ricerca. Ho bisogno di aggiungere un attributo non standard (x-webkit-speech) per il controllo in modo si avrebbe qualcosa di simile ...Come far passare JSF attraverso gli attributi HTML

<p:autoComplete x-webkit-speech="x-webkit-speech" ... /> 

Dal momento che questo attributo non è parte del controllo JSF completamento automatico mi dà un errore di 500. Ma quando lo rimuovo, la pagina viene visualizzata correttamente. In generale, come si specifica il passaggio degli attributi su un tag JSF in modo che vengano ignorati?

+0

dare un'occhiata a questo http://stackoverflow.com/a/6675592/617373 – Daniel

risposta

6

JSF di progettazione ignora tutti gli attributi personalizzati durante il rendering di HTML. Hai bisogno di un renderizzatore personalizzato. Questo è in caso di PrimeFaces <p:autoComplete> (e tutti gli altri componenti) per fortuna relativamente semplice. È sufficiente ignorare solo il metodo renderPassThruAttributes() in cui aggiungi il nuovo attributo che desideri rendere all'argomento attrs e infine delegare al metodo 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); 
    } 

} 

per farlo funzionare, registrarlo nel modo seguente del vostro 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> 

(si può scoprire la famiglia e renderer tipo di componente, cercando il codice sorgente di AutoComplete classe , sono specificati come COMPONENT_FAMILY e RENDERER_TYPE costanti in là)

No, il @FacesRenderer annotazioni semplicemente non funzionerà quando lo scopo è sovrascrivere i renderer personalizzati che sono già registrati in uno faces-config.xml.

+0

Sarebbe possibile attivare solo il renderer per determinati componenti di completamento automatico? – Adam

+0

No. Dovresti creare un componente UI personalizzato. Basta estendere il 'Completamento automatico 'di PrimeFaces e sovrascrivere' getRendererType() 'per restituire un valore diverso, ad es. 'com.example.MyAutoCompleteRenderer' dovrebbe essere sufficiente. Registralo in un file '.taglib.xml' e cambia' 'di conseguenza. Infine usa quel componente invece come ''. – BalusC

+0

dove posso cercare la classe di rendering per estendere h: commandLink per accettare attributi html personalizzati? –

0

Non sono sicuro che sia possibile. Vorrei aggiungere quegli attributi sul lato client usando javascript o jQuery.

È possibile inserire le espressioni nel codice javascript se si desidera integrare elementi lato server.

+4

questo è un brutto trucco –

1

La maggior parte dei tag può essere estesa utilizzando il tag di attributo di 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> 

È possibile configurare tramite Maven:

<dependency> 
    <groupId>com.intersult</groupId> 
    <artifactId>jsf-ext</artifactId> 
    <version>2.2.0.1</version> 
</dependency> 

JSF-Ext è una libreria da http://www.intersult.com/wiki/page/JSF%20Ext

+0

questo progetto Maven non funziona come lo descrivi! –

+0

Che cosa esattamente non funziona, potresti fornire un esempio? Sto usando questa funzione per tutto il tempo in progetti produttivi. – Tires

+0

quando aggiungo questo a pom.xml il mio contesto di persistenza non viene più riconosciuto ... cosa strana, Cann non trova alcuna causa ragionevole – simonC