0

NSFでJavaコントロールを作成するチュートリアルを使用して、簡単なJavaコントロールを作成することができました。画像を表示するように拡張したいので、次のようにコードを変更しました。

これは、のUIGraphicEx代わりにクラスを拡張するコントロールクラスの例ですUIComponentBase

package com.example.component;
import com.ibm.xsp.component.UIGraphicEx;
public class ExampleControl extends UIGraphicEx {
    public ExampleControl() {
        super();
        setRendererType("com.ibm.xsp.ImageEx");

    }
    @Override
    public String getFamily() {
        return "com.example.examplecontrol";
    }
}

これは、xsp-configたとえば上記で定義された制御クラスのファイルです。<base-component-type>として値を追加しcom.ibm.xsp.component.UIGraphicEx、に設定<renderer-type>して変更しましたcom.ibm.xsp.ImageEx

<faces-config>
    <faces-config-extension>
        <namespace-uri>http://example.com/xsp/control</namespace-uri>
        <default-prefix>eg</default-prefix>
    </faces-config-extension>
    <component>
        <description>Example</description>
        <display-name>Example Control</display-name>
        <component-type>com.example.examplecontrol</component-type>
        <component-class>com.example.component.ExampleControl</component-class>
        <component-extension>
            <base-component-type>com.ibm.xsp.component.UIGraphicEx</base-component-type>
            <component-family>com.example.examplecontrol</component-family>
            <renderer-type>com.ibm.xsp.ImageEx</renderer-type>
            <tag-name>exampleControl</tag-name>
            <designer-extension>
                <category>Example</category>
                <selected-event>onclick</selected-event>
            </designer-extension>
        </component-extension>
    </component>
</faces-config>

私のレンダラークラスは次のようになります。ここでは、クラスを使用する代わりに、オブジェクトをResponseWriterキャストしてそのURLを設定しています(画像は同じデータベースに存在します)。UIComponentUIGraphicEx

package com.example.renderkit.html_basic;
import javax.faces.render.Renderer;
import java.io.IOException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import com.ibm.xsp.component.UIGraphicEx;
public class ExampleRenderer extends Renderer {
    @Override
    public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
        UIGraphicEx g = (UIGraphicEx)component;
        g.setUrl("review_icon.gif");
        g.setRendered(true);
        System.out.println("-----------" + g.getUrl());
    }
    @Override
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
    }
}

このコントロールをXPageに配置すると、出力は表示されませんがSystem.out.println、メソッドのステートメントがencodeBeginコンソールで起動します。私はここで何が間違っているのですか?これは続行する正しい方法ですか?

ここでの私の最後の目的は、(何らかの入力に基づいて)オンザフライで画像データを生成し、それをレンダラーを介して画像制御に入れることです。どうすればそれを達成できますか?

4

2 に答える 2

1

コンポーネント、xsp-config、faces-config でファミリが同じように定義されていることを確認してください。また、Toby が言ったように、ResponseWriter には何も書き込んでいません。ResponseWriter を使用して、いくつかの html を画面に出力する必要があります。または、UIGraphicEx レンダラーとまったく同じものを出力したいだけの場合は、レンダラーでそれを拡張し (UIGraphicEx Renderer クラス)、super.encodeBegin() と super.encodeEnd() を呼び出します。

package com.example.renderkit.html_basic;
import javax.faces.render.Renderer;
import java.io.IOException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import com.ibm.xsp.component.UIGraphicEx;
public class ExampleRenderer extends Renderer {
    @Override
    public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
        UIGraphicEx g = (UIGraphicEx)component;
        g.setUrl("review_icon.gif");
        g.setRendered(true);
        ResponseWriter writer = context.getResponseWriter();
        writer.append("<img src='http://someserver/somedb.nsf/review_icon.gif' />");
        System.out.println("-----------" + g.getUrl());
    }
    @Override
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
    }

}

于 2012-08-21T22:38:23.103 に答える
0

編集: xagent をまとめてサーバー全体に展開することはできません。サーブレットを使用し、OSGI プラグインを介してデプロイすることをお勧めします。

于 2012-08-21T17:19:00.357 に答える