我在 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+ 上,只需将其指定为passthrough 属性:
<html ... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
...
<p:autoComplete a:x-webkit-speech="x-webkit-speech" ... />
如果您还没有使用 JSF 2.2,那么您需要一个自定义渲染器。幸运的是,PrimeFaces <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);
}
}
要让它运行,请在您的 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
.
使用 JSF-Ext 中的 Attribute-Tag 可以扩展大多数标签。
<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 代码中。