【问题标题】:How to let JSF pass through HTML attributes [duplicate]如何让JSF通过HTML属性[重复]
【发布时间】:2012-05-16 02:15:27
【问题描述】:

我在 JSF 2 中使用 Primefaces 3 来制作搜索框。我需要在控件中添加一个非标准属性(x-webkit-speech),这样你就会有这样的东西......

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

因为这个属性不是自动完成控件的一部分,所以 JSF 给我一个 500 错误。但是当我删除它时,页面呈现正常。一般来说,如何在 JSF 标记上指定传递属性以使其被忽略?

【问题讨论】:

标签: html jsf jsf-2 primefaces servlet-3.0


【解决方案1】:

JSF 在呈现 HTML 时会忽略所有自定义属性。

如果您已经使用 JSF 2.2+,只需将其指定为 passthrough attribute

<html ... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
...
<p:autoComplete a:x-webkit-speech="x-webkit-speech" ... />

如果您还没有使用 JSF 2.2,那么您需要一个自定义渲染器。幸运的是,PrimeFaces &lt;p:autoComplete&gt;(和所有其他组件)相对简单。只需覆盖 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_FAMILYRENDERER_TYPE常量)

不,@FacesRenderer 注释根本不起作用,当其目的是覆盖本身已经在 faces-config.xml 中注册的自定义渲染器时。

【讨论】:

  • 是否可以只为某些自动完成组件触发渲染器?
  • 没有。您需要创建一个自定义 UI 组件。只需扩展 PrimeFaces AutoComplete 并覆盖 getRendererType() 以返回不同的值,例如com.example.MyAutoCompleteRenderer 应该足够了。在.taglib.xml 文件中注册它并相应地更改&lt;renderer-type&gt;。最后使用该组件作为&lt;my:autoComplete&gt;
  • 在哪里可以查找渲染类以扩展 h:commandLink 以接受自定义 html 属性?
  • 这里可以参考现代 jsf passtrough 属性吗?或指向stackoverflow.com/questions/16666472/…
【解决方案2】:

使用 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的库

【讨论】:

  • 究竟是什么不起作用,你能举个例子吗?我一直在生产项目中使用此功能。
  • 当我将它添加到 pom.xml 时,我的持久性上下文不再被识别......奇怪的事情,找不到任何合理的原因
  • JSF-Ext 并非旨在影响任何持久性上下文
【解决方案3】:

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

如果您想集成服务器端的东西,您可以将 el 表达式放入您的 javascript 代码中。

【讨论】:

    猜你喜欢
    • 2013-07-30
    • 2015-05-07
    • 2016-11-18
    • 2014-05-30
    • 2013-10-15
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多