2012-05-07 45 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