3

PrimeFaces を拡張するカスタム コンポーネントを作成しようとしています。

test 名前空間の下に textInput という単純なコンポーネントがあります。このコンポーネントは、PrimeFaces の textInput コンポーネントを呼び出すだけで、fieldClass という名前の属性に渡された値と、渡された属性の名前を出力します。

fieldClass を文字列として渡す場合:

<test:textInput id="foo" fieldClass="field-foo" />

これが結果です

fieldClass = フィールド foo

[com.sun.faces.facelets.MARK_ID、fieldClass]

fieldClass を式として渡す場合

<ui:param name="bar" value="field-foo"/>
<test:textInput id="foo" fieldClass="#{bar}" />

fieldClass が消える

fieldClass = なし

[com.sun.faces.facelets.MARK_ID]

コンポーネントに渡された属性を実際に取得するにはどうすればよいですか?

カスタム コンポーネントで使用されるクラスは次のとおりです。

test.components.ExtendInputTextRenderer

package test.components;

import java.util.Map;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.render.FacesRenderer;
import org.primefaces.component.inputtext.*;

@FacesRenderer( 
     componentFamily=ExtendInputText.COMPONENT_FAMILY, 
     rendererType=ExtendInputTextRenderer.RENDERER_TYPE 
) 

public class ExtendInputTextRenderer extends InputTextRenderer {
     public static final String RENDERER_TYPE = "com.example.ExtendInputTextRenderer";

     @Override
     public void encodeEnd(FacesContext context, UIComponent component)
                throws java.io.IOException {
          ResponseWriter writer = context.getResponseWriter();
          Map attrs = component.getAttributes();
          String fieldClass = attrs.containsKey("fieldClass") ? (String) attrs.get("fieldClass").toString() : "NONE";
          writer.write("fieldClass = " + fieldClass + "<br/>");
          writer.write(attrs.keySet().toString() + "<br/>");
          super.encodeEnd(context, component);
     }
}

test.components.ExtendInputText

package test.components;

import javax.faces.component.FacesComponent;
import org.primefaces.component.inputtext.InputText;



@FacesComponent(ExtendInputText.COMPONENT_TYPE) 
public class ExtendInputText extends InputText { 
 
     public static final String COMPONENT_FAMILY = "com.example"; 
     public static final String COMPONENT_TYPE = "com.example.ExtendInputText"; 
 
     @Override 
     public String getFamily() { 
          return COMPONENT_FAMILY; 
     } 
 
     @Override 
     public String getRendererType() { 
          return ExtendInputTextRenderer.RENDERER_TYPE; 
     } 
}
4

1 に答える 1

3
String fieldClass = attrs.containsKey("fieldClass") ? (String) attrs.get("fieldClass").toString() : "NONE";

あなたの間違いはcontainsKey()、プロパティが指定されているかどうかを確認するために使用していることです。

UIComponent#getAttributes()以下はjavadocからの抜粋です。

getAttributes

public abstract java.util.Map<java.lang.String,java.lang.Object> getAttributes()

属性名 ( である必要があります) をキーとして、Mapthis に関連付けられた属性 (およびプロパティ、以下を参照) を表すミュータブルを返します。返される実装は、すべての標準メソッドとオプションメソッドをサポートし、さらに次の追加要件をサポートする必要があります。UIComponentStringMap

  • 実装では、インターフェイスMapを実装する必要がありjava.io.Serializableます。
  • nullキーまたは値を追加しようとすると、 NullPointerException.
  • ではないキーを追加しようとすると、String必ずClassCastException.
  • キーとして指定された属性名が thisUIComponentの実装クラスのプロパティと一致する場合、次のメソッドは特別な動作をします:
    • containsKey()- 返品false
    • get()- プロパティが読み取り可能な場合は、getter メソッドを呼び出して、返された値を返します (対応するラッパー クラスでプリミティブ値をラップします)。それ以外の場合はスローしIllegalArgumentExceptionます。
    • put()- プロパティが書き込み可能な場合は、setter メソッドを呼び出して、対応する値を設定します (対応するラッパー クラスでプリミティブ値をアンラップします)。プロパティが書き込み可能でない場合、またはプリミティブ型のプロパティを に設定しようとした場合はnull、 をスローしIllegalArgumentExceptionます。
    • remove()- 投げIllegalArgumentExceptionます。

falseしたがって、常にforcontainsKeyコンポーネントのプロパティを返すことに注意してください。これは、動的プロパティが属性マップではなく、コンポーネント インスタンス自体に格納されるためです。を呼び出したときにのみ解決されますget()

次のように間違った行を変更する必要があります。

String fieldClass = (String) attrs.get("fieldClass");
if (fieldClass == null) fieldClass = "NONE";
于 2012-06-26T11:00:13.987 に答える