6

簡単な質問: Wicket を使用して、表示ページにコンポーネントを追加せずに (NonCachingImage を使用するなど)、データベースから取得した動的画像を URL に変換する必要があります。

完璧な解決策 (私が他のフレームワークに実装したもの) は、画像 ID を URL パラメーターとして取得し、画像を応答ストリームにレンダリングするページを作成するだけです。残念ながら、Wicket の Page クラスは、MarkupStreams を中心に展開する MarkupContainer を拡張します。MarkupStreams は、バイト データを直接レンダリングするのにあまり役立ちません。

長い質問: Tomcat 6.0.18 で実行されている Wicket 1.4.0 を使用しています。イメージは Postgres データベースに保存され、JDBC 経由で取得されます。画像は、画像 URL のみを受け入れるサードパーティ API によってレンダリングされる必要があります。バイト データ、MIME タイプ、および DB からモデルを取得して応答ストリームに追加できる Resource オブジェクトを含むモデル オブジェクトがあります。

何か案は?

4

3 に答える 3

19

私自身、Wicket を使い始めたばかりですが、リソースを独自の URL を持つ共有リソースとしてマウントするだけです。オーバーライドinit()してApplicationリソースを登録するだけです

getSharedResources().add(resourceKey, dynamicImageResource);

次に、共有リソースとしてマウントします

mountSharedResource(path, resourceKey);

何らかの理由で、まだ完全には把握できていませんが、アプリケーションのクラス名を に渡すリソース キーの先頭に追加する必要がありますmountSharedResource()


いくつかのボーナス投票の完全に機能する例を追加しましょう! 最初に空の Wicket テンプレートを作成します

mvn archetype:create -DarchetypeGroupId=org.apache.wicket \
    -DarchetypeArtifactId=wicket-archetype-quickstart \
    -DarchetypeVersion=1.4.0 -DgroupId=com.mycompany \
    -DartifactId=myproject

次に、以下を追加してinit()メソッドをオーバーライドします。WicketApplication

@Override
protected void init() {
    final String resourceKey = "DYN_IMG_KEY";
    final String queryParm = "id";

    getSharedResources().add(resourceKey, new Resource() {
        @Override
        public IResourceStream getResourceStream() {
            final String query = getParameters().getString(queryParm);

            // generate an image containing the query argument
            final BufferedImage img = new BufferedImage(100, 100,
                    BufferedImage.TYPE_INT_RGB);
            final Graphics2D g2 = img.createGraphics();
            g2.setColor(Color.WHITE);
            g2.drawString(query, img.getWidth() / 2, img.getHeight() / 2);

            // return the image as a PNG stream
            return new AbstractResourceStreamWriter() {
                public String getContentType() {
                    return "image/png";
                }
                public void write(OutputStream output) {
                    try { ImageIO.write(img, "png", output); }
                    catch (IOException ex) { /* never swallow exceptions! */ }
                }
            };
        }
    });

    mountSharedResource("/resource", Application.class.getName() + "/" +
            resourceKey);
}

少し動的な PNG リソースは、クエリ パラメーターを黒の背景に書き込むだけです。もちろん、DB にアクセスしたり、好きなように画像データを生成したりできます。

最後に を実行すると、この URLmvn jetty:runのリソースにアクセスできるようになります。

于 2009-10-03T09:52:05.993 に答える
2

Martin Grigorov が wi​​cketinaction.com で、Wicket 1.5 でデータベースからロードされた画像を提供する方法を詳しく説明する本当に素晴らしいブログ投稿を書いたという別の回答を追加します。

http://wicketinaction.com/2011/07/wicket-1-5-mounting-resources/

これは@Michaelの質問と完全に一致します。

于 2012-01-19T08:04:36.680 に答える
1

これは、動的にコンパイルされた識別子のリストに対して同じことを行う私の例であり、静的 URL を持つ共有リソースとして提供されます..

public class WicketApplication extends WebApplication {
    ...snip...
    @Override
    protected void init() {
        //Spring
        addComponentInstantiationListener(new SpringComponentInjector(this));

        //Register export lists as shared resources
        getSharedResources().putClassAlias(ListInitializer.class, "list");
        new ListInitializer().init(this);
    }

そして、リソースを DBNAME_SUBSELECTION1(2/3/..) として登録する ListInitializer

public class ListInitializer implements IInitializer {
    public ListInitializer() {
        InjectorHolder.getInjector().inject(this);
    }

    @SpringBean
    private DatabankDAO dbdao;

    @Override
    public void init(Application application) {
        //For each databank
        for (Databank db : dbdao.getAll()) {
            String dbname = db.getName();
            //and all collection types
            for (CollectionType ct : CollectionType.values()) {
                //create a resource
                Resource resource = getResource(dbname, ct);
                //and register it with shared resources
                application.getSharedResources().add(this.getClass(), dbname + '_' + ct, null, null, resource);
            }
        }
    }

    @SpringBean
    private MyApp   MyApp;

    public Resource getResource(final String db, final CollectionType collectionType) {
        return new WebResource() {
            @Override
            public IResourceStream getResourceStream() {
                List<String> entries = MyApp.getEntries(db, collectionType.toString());
                StringBuilder sb = new StringBuilder();
                for (String entry : entries) {
                    sb.append(entry.toString());
                    sb.append('\n');
                }
                return new StringResourceStream(sb, "text/plain");
            }

            @Override
            protected void setHeaders(WebResponse response) {
                super.setHeaders(response);
                response.setAttachmentHeader(db + '_' + collectionType);
            }
        }.setCacheable(false);
    }
}

申し訳ありませんが、これをセットアップするために使用したチュートリアルがもう見つからないようですが、これが上記の例にどのように関連しているかは明らかであり、画像に対して同じことを行うように調整できます.. (申し訳ありませんが、まばらな説明、まだ不明な場合は、戻って回答を編集できます)

于 2009-10-03T14:21:12.637 に答える