3

JSF 1.2 (facelets を使用) でカスタム コントロールを開発しようとしています。

さまざまなチュートリアルの手順に従いました (.tld、taglib.xml、faces-config.xml に登録されたコンポーネントを定義し、UIComponent (コンポーネントはそれ自体をレンダリングします) および UIComponentELTag クラスを実装します)。コンポーネントがレンダリングされ、値がバインドされていますが、属性があります。そのタグに対して定義したものは無視されます。Tag クラスにさまざまなメソッドを記録しましたが、どのメソッドも呼び出されていないことに気付きました。

私は何が欠けていますか?タグハンドラクラスが呼び出されない理由はありますか?

前もって感謝します。

私のtaglib.xmlファイルは次のとおりです。

<?xml version="1.0"?> 
<!DOCTYPE facelet-taglib PUBLIC 
  "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
  "java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib> 
  <namespace>dynamissoft.com/entities/ui</namespace>
  <tag>
    <tag-name>legalEntityView</tag-name>
    <component>
      <component-type>rs.bozic.wastemanager.LegalEntityView</component-type>
    </component>
  </tag>
</facelet-taglib> 
4

2 に答える 2

3

facelets (xml のみ) を使用してカスタム コンポーネントを作成しようとしましたか。facelets を使用するのが最も簡単な方法です。通常、さまざまな Java クラスはもう必要ありません。

非常に大まかな概要:

  • facelet xml ファイル (myComponent.xhtml など) を作成します。
  • taglib 内の facelet に登録します (これは web.xml で定義する必要があります)。
  • オプションで、Java でいくつかのサポート Bean を作成します。

通常のタグ パラメータを使用して、コンポーネントに値/Bean を渡すことができます。

コンポーネントの使用

コンポーネントの内部

Param1 が出力されます: #{myParam2} Param2 used as value for table ...

Googleには、 IBMのような優れたチュートリアルがあります。

可能であれば、JSF 2.0 の使用を検討してください。Facelets が統合されているため、カスタム コンポーネントをより柔軟に作成できます。私はそれについて少し前にブログ投稿を作成しました:http ://blog.whitehorses.nl/2010/02/08/jsf-2-0/ (または自分でGoogle)

于 2010-07-16T20:32:45.323 に答える
2

Gerbrand の回答を少し拡張するために、単純な Facelets 互換コンポーネントの手順を次に示します。コンポーネントの属性spanで指定されたテキストをラップするタグをレンダリングします。text

  1. 最初にコンポーネント クラスを作成します (この場合は のフレーバーです UIOutput)。

      package sample.mytag;
    
      import java.io.IOException;
      import javax.faces.component.UIOutput;
      import javax.faces.context.FacesContext;
      import javax.faces.context.ResponseWriter;
    
      public class SpanComponent extends UIOutput{            
        private String text;
        @Override
        public Object saveState(FacesContext context) {
          Object values[] = new Object[2];
          values[0] = super.saveState(context);
          values[1] = target;
          return ((Object) (values));
        }
    
        @Override
        public void restoreState(FacesContext context, Object state) {
          Object values[] = (Object[])state;
          super.restoreState(context, values[0]);
          target = (String)values[1];
        }
    
        public String getText() {
          return text;
        }
    
        public void setText(String text) {
          this.text = text;
        }
    
        @Override
        public void encodeBegin(FacesContext context) throws IOException {
          ResponseWriter writer=context.getResponseWriter();
          writer.startElement("span", component);
          writer.writeAttribute("id", id, null);
          writer.writeText(text, null);
          writer.endElement("span");
          writer.flush();                
        }
    
        @Override
        public String getFamily(){
          return "myTag.component";
        }
    
        @Override
        public void encodeEnd(FacesContext context) throws IOException {
          return;
        }
    
        @Override
        public void decode(FacesContext context) {
          return;
        } 
      }
    
  2. 次に、taglib XML ファイルが必要です。それを呼び出して、 dirmytag.taglib.xml内に配置しましょう。WEB-INF

      <!DOCTYPE facelet-taglib PUBLIC
        "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
        "WEB-INF/facelet-taglib_1_0.dtd"> 
      <facelet-taglib> 
      <namespace>http://sample.tag/mytags</namespace> 
      <tag>
        <tag-name>myspan</tag-name>
          <component>
            <component-type>myTag.component</component-type>    
          </component>
      </tag>
      </facelet-taglib> 
    

    ご了承ください:

    • .taglib.xmlサフィックスは必須です
    • <component-type>getFamily()コンポーネントのメソッド によって返される値と同じ値を持つ必要があります
    • WEB-INF/facelet-taglib_1_0.dtdあなたはと 置き換えることができますhttp://java.sun.com/dtd/facelet-taglib_1_0.dtd
  3. web.xml と faces-config.xml を変更します。

    前者は次のように変更する必要があります

    <context-param> 
      <param-name>facelets.LIBRARIES</param-name> 
      <param-value>/WEB-INF/mytag.taglib.xml</param-value> 
    </context-param>     
    

    faces-config.xml は取得する必要があります

    <component> 
     <component-type>myTag.component</component-type> 
     <component-class>sample.mytag.LabelComponent</component-class> 
    </component>  
    
  4. 準備万端です!

        <ui:composition
          xmlns="http://www.w3.org/1999/xhtml"
          xmlns:ui="http://java.sun.com/jsf/facelets"  
          xmlns:sample="http://sample.tag/mytag">  
    
          <sample:myspan text="I'm inside a span!"/>
    
        </ui:composition>
    
于 2012-04-06T13:53:19.230 に答える