6

JSF 2 で Primefaces 3 を使用して検索ボックスを作成しています。非標準の属性 (x-webkit-speech) をコントロールに追加する必要があるので、次のようになります...

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

この属性は autoComplete コントロールの一部ではないため、JSF から 500 エラーが返されます。しかし、それを削除すると、ページは正常にレンダリングされます。一般に、JSF タグでパススルー属性を指定して無視されるようにするにはどうすればよいでしょうか?

4

3 に答える 3

7

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 を使用していない場合は、カスタム レンダラーが必要です。これは、<p:autoComplete>幸いなことに、PrimeFaces (および他のすべてのコンポーネント) の場合は比較的単純です。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アノテーションは、それ自体で既に .xml ファイルに登録されているカスタム レンダラーをオーバーライドすることが目的の場合、単に機能しませんfaces-config.xml

于 2012-05-08T12:46:39.500 に答える
1

ほとんどのタグは、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のライブラリです。

于 2012-09-12T15:02:16.357 に答える
0

これが可能かどうかはわかりません。javascriptまたはjQueryを使用して、クライアント側でこれらの属性を追加します。

サーバー側のものを統合したい場合は、el式をjavascriptコードに入れることができます。

于 2012-05-08T07:25:07.737 に答える