Wicket动态图像URL

Mic*_*lis 6 java url wicket image dynamic

简短的问题:我需要将从数据库中提取的动态图像转换为URL,而无需使用Wicket向显示页面添加组件(例如使用NonCachingImage).

完美的解决方案(我在其他框架中实现)只是创建一个页面,将图像ID作为url参数并将图像呈现给响应流.不幸的是,Wicket的Page类扩展了MarkupContainer,它围绕着MarkupStreams.MarkupStreams不太直接有助于渲染字节数据.

长问题:我正在使用Wicket 1.4.0,在Tomcat 6.0.18中运行.该图像存储在Postgres数据库中,通过JDBC检索.图像需要由仅接受图像URL的第三方API呈现.我有一个模型对象,其中包含字节数据,mime类型和Resource对象,可以从数据库中提取模型并将其添加到响应流.

有任何想法吗?

jan*_*nko 19

我自己刚刚开始与Wicket合作,但我只是将资源作为共享资源安装,并使用自己的URL.你只需覆盖init()你的Application并注册资源

getSharedResources().add(resourceKey, dynamicImageResource);
Run Code Online (Sandbox Code Playgroud)

然后,将其作为共享资源挂载

mountSharedResource(path, resourceKey);
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我仍然没有完全掌握,您必须将应用程序的类名前置到您传递给的资源键mountSharedResource().


让我们为一些奖金投票添加一个完整的工作示例!首先创建一个空的Wicket模板

mvn archetype:create -DarchetypeGroupId=org.apache.wicket \
    -DarchetypeArtifactId=wicket-archetype-quickstart \
    -DarchetypeVersion=1.4.0 -DgroupId=com.mycompany \
    -DartifactId=myproject
Run Code Online (Sandbox Code Playgroud)

然后,通过添加以下内容覆盖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);
}
Run Code Online (Sandbox Code Playgroud)

小动态PNG资源只是在黑色背景上写入查询参数.当然,您可以访问数据库或执行任何您喜欢的操作来生成图像数据.

最后,执行mvn jetty:run,您将能够通过此URL访问资源.