我在JSF 2中使用Primefaces 3来创建搜索框。我需要一个非标准的属性(X-WebKit的语音)增加了控制,因此您将有这样的事情......如何让JSF通过HTML属性
<p:autoComplete x-webkit-speech="x-webkit-speech" ... />
因为这个属性不是自动完成控制JSF的一部分给我500错误。但是,当我删除它,页面渲染罚款。一般来说,如何指定通过JSF标签上的属性来忽略它们?
我在JSF 2中使用Primefaces 3来创建搜索框。我需要一个非标准的属性(X-WebKit的语音)增加了控制,因此您将有这样的事情......如何让JSF通过HTML属性
<p:autoComplete x-webkit-speech="x-webkit-speech" ... />
因为这个属性不是自动完成控制JSF的一部分给我500错误。但是,当我删除它,页面渲染罚款。一般来说,如何指定通过JSF标签上的属性来忽略它们?
设计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_FAMILY
和RENDERER_TYPE
常数)
没有,@FacesRenderer
注释简单当目的是覆盖自己已经在faces-config.xml
中注册的自定义渲染器时将不起作用。
我不确定这是否可能。我会使用javascript或jQuery在客户端添加这些属性。
如果你想整合服务器端的东西,你可以把el表达式放到你的javascript代码中。
这是一个讨厌的黑客攻击 –
大多数标签都可以使用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>
图书馆看看这个http://stackoverflow.com/a/6675592/617373 – Daniel