2012-05-07 38 views
6

我在JSF 2中使用Primefaces 3來創建搜索框。我需要一個非標準的屬性(X-WebKit的語音)增加了控制,因此您將有這樣的事情......如何讓JSF通過HTML屬性

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

因爲這個屬性不是自動完成控制JSF的一部分給我500錯誤。但是,當我刪除它,頁面渲染罰款。一般來說,如何指定通過JSF標籤上的屬性來忽略它們?

+0

圖書館看看這個http://stackoverflow.com/a/6675592/617373 – Daniel

回答

6

設計JSF會在呈現HTML時忽略所有自定義屬性。你需要一個自定義的渲染器。這是在PrimeFaces <p:autoComplete>(和所有其他組件)的情況下,幸運的是相對簡單。只需要覆蓋renderPassThruAttributes()方法就足夠了,您可以將要呈現的新屬性添加到attrs參數中,並最終將其委託給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); 
    } 

} 

得到它的運行,如下面進行註冊你的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> 

(你可以找到通過查看AutoComplete類的源代碼組件的家人和渲染器類型,他們指定爲有COMPONENT_FAMILYRENDERER_TYPE常數)

沒有,@FacesRenderer註釋簡單當目的是覆蓋自己已經在faces-config.xml中註冊的自定義渲染器時將不起作用。

+0

對於某些自動完成組件,只能渲染渲染器嗎? – Adam

+0

不需要。您需要創建自定義UI組件。只需擴展PrimeFaces'AutoComplete'並重寫'getRendererType()'返回一個不同的值,例如'com.example.MyAutoCompleteRenderer'應該足夠了。將其註冊到'.taglib.xml'文件中並相應地更改''。最後使用該組件代替''。 – BalusC

+0

在哪裏可以查看渲染類來擴展h:commandLink以接受自定義html屬性? –

0

我不確定這是否可能。我會使用javascript或jQuery在客戶端添加這些屬性。

如果你想整合服務器端的東西,你可以把el表達式放到你的javascript代碼中。

+4

這是一個討厭的黑客攻擊 –

1

大多數標籤都可以使用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

+0

這個maven項目不像你描述的那樣工作! –

+0

究竟什麼不行,你能舉個例子嗎?我在生產性項目中一直都在使用此功能。 – Tires

+0

當我將此添加到pom.xml時,我的持久性上下文不再被識別......奇怪的是,cann沒有找到任何合理的原因 – simonC