如何让JSF通过HTML属性

6

我正在使用JSF 2中的Primefaces 3来制作搜索框。我需要向控件添加一个非标准属性(x-webkit-speech),这样你就会得到类似于以下内容...

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

由于此属性不是autoComplete控件JSF的一部分,因此会导致500错误。但是当我将其删除后,页面可以正常渲染。通常情况下,如何在JSF标记上指定传递属性,以便忽略它们?


看一下这个:https://dev59.com/DGw15IYBdhLWcg3wWqf-#6675592 - Daniel
3个回答

7

JSF在渲染HTML时会忽略所有自定义属性。

如果您已经使用JSF 2.2+,只需将其指定为传递属性即可:

<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);
    }

}

要运行它,请在您的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_FAMILYRENDERER_TYPE常量指定。请注意,@FacesRenderer注释不能用于覆盖已在faces-config.xml中注册的自定义呈现器。

有没有可能只让渲染器针对特定的自动完成组件触发? - Adam
不行,你需要创建一个自定义 UI 组件。只需继承 PrimeFaces 的 AutoComplete 并覆盖 getRendererType() 方法以返回不同的值,例如 com.example.MyAutoCompleteRenderer 就足够了。在 .taglib.xml 文件中注册它,并相应地更改 <renderer-type>。最后使用 <my:autoComplete> 替代原有组件即可。 - BalusC
我在哪里可以查找渲染类以扩展h:commandLink以接受自定义HTML属性? - Matthias B
1
也许可以在这里提到现代的JSF透传属性?或者指向https://dev59.com/TGQn5IYBdhLWcg3wpomp。 - Kukeltje

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的一个库。


请问具体是哪里出了问题?能否提供一个例子?我在实际项目中一直都在使用这个功能。 - Tires
当我将这个添加到pom.xml中时,我的持久化上下文不再被识别了...奇怪的事情,找不到任何合理的原因。 - simonC
JSF-Ext并不会影响任何持久化上下文。 - Tires

0

我不确定这是否可能。我将使用javascript或jQuery在客户端添加这些属性。

如果要集成服务器端内容,您可以将el表达式放入javascript代码中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接