我正在使用JSF 2中的Primefaces 3来制作搜索框。我需要向控件添加一个非标准属性(x-webkit-speech),这样你就会得到类似于以下内容...
<p:autoComplete x-webkit-speech="x-webkit-speech" ... />
由于此属性不是autoComplete控件JSF的一部分,因此会导致500错误。但是当我将其删除后,页面可以正常渲染。通常情况下,如何在JSF标记上指定传递属性,以便忽略它们?
我正在使用JSF 2中的Primefaces 3来制作搜索框。我需要向控件添加一个非标准属性(x-webkit-speech),这样你就会得到类似于以下内容...
<p:autoComplete x-webkit-speech="x-webkit-speech" ... />
由于此属性不是autoComplete控件JSF的一部分,因此会导致500错误。但是当我将其删除后,页面可以正常渲染。通常情况下,如何在JSF标记上指定传递属性,以便忽略它们?
JSF在渲染HTML时会忽略所有自定义属性。
如果您已经使用JSF 2.2+,只需将其指定为传递属性即可:
<html ... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
...
<p:autoComplete a:x-webkit-speech="x-webkit-speech" ... />
<p:autoComplete>
(以及所有其他组件),这相对简单。只需覆盖renderPassThruAttributes()
方法即可,其中添加要呈现到attrs
参数的新属性,最后委托给超级方法即可。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);
}
}
要运行它,请在您的Web应用程序的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
中注册的自定义呈现器。AutoComplete
并覆盖 getRendererType()
方法以返回不同的值,例如 com.example.MyAutoCompleteRenderer
就足够了。在 .taglib.xml
文件中注册它,并相应地更改 <renderer-type>
。最后使用 <my:autoComplete>
替代原有组件即可。 - BalusC大多数标签可以使用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的一个库。
我不确定这是否可能。我将使用javascript或jQuery在客户端添加这些属性。
如果要集成服务器端内容,您可以将el表达式放入javascript代码中。