0

我目前正在努力进入 wicket 并开发了一个小型演示应用程序。现在我想在那个应用程序中显示一个静态图像(更具体地说,这个图像应该添加到一个面板中,然后再添加到主页中)。

这是我到目前为止所拥有的:

1) 应该保存图像的面板的 HTML 代码。没有特定的检票口代码,它应该只包含项目结构中存在的图像。

<html><body>
  <wicket:panel>
    Just some static text inside the image panel...<br/>
    <img src="test.jpg"></img>
  </wicket:panel>
</body></html>

该面板称为 ImagePanel,所有三个文件(ImagePanel.java、ImagePanel.html、test.jpg)都位于同一个包中。

2) ImagePanel 的 Java 代码 - 相当短,因为没有什么可做的:

public class ImagePanel extends Panel {
    public ImagePanel(String id) {
        super(id);
    }
}

3)首页的HTML代码:

<html><body>
  <div wicket:id="dynamicComponent"></div>
</body></html>

4)主页的Java代码:

public HomePage() {
    add(new ImagePanel("dynamicComponent"));
}

请注意以下几点: 实际上,HomePage.java 和 ImagePanel.java 位于不同的 OSGi 项目中。此处简化了 HomePage 的代码,实际上 ImagePanel 是通过服务定位并动态添加的。到目前为止,这有效,我看到了静态文本。但是图像没有加载,我只是得到这个破碎的图像缩略图。

就像我说的,所有三个与 ImagePanel 相关的文件(.java、.html、图片)都位于同一个包中。我可以从主页项目访问面板本身,因为我可以看到静态文本。但我无法显示图像。

我使用的应用程序服务器是 Jetty,从包含主页的项目内部开始。

更新: 我已将问题缩小到以下问题:只要我只在 ImagePanel.html 中显示静态文本,一切正常。只要我想添加图像(即使在下面建议的 wicket:link-tag 内),我最终会遇到以下异常:

[qtp401543768-20] WARN org.apache.wicket.core.util.lang.WicketObjects - Could not resolve class [plugin.ImagePanel]
java.lang.ClassNotFoundException: plugin.ImagePanel

因此,如果没有图像,服务器包能够从 gui 包中加载类并显示静态文本。有了这张图片,我最终得到了同一个类的 ClassNotFoundException。

在这里找到整个堆栈跟踪:堆栈跟踪

4

2 回答 2

4

在您的模板中,放置一个

 <wicket:link>
   <img src="test.jpg"></img>
 </wicket:link>

Wicket 将重写 url 以使图像正常工作。

如果您有要加载包资源的动态图像,请使用 PackageResourceReference。

例如

add(new Image("myImage", new PackageResourceReference(MyClass.class, "test.jpg"));
于 2013-10-10T18:36:52.363 回答
0

感谢您的帮助,尽管与此同时我自己设法解决了这个问题。这不是唯一的检票口问题,也是 OSGi-bundle-setup 的一些困难。

正如我之前提到的,ImagePanel 位于与 HomePage 不同的 OSGi 包中。由于所有 Wicket 库都位于 HomePage 包中,因此出现了问题(如果两个包都使用自己的库,我会收到链接器错误)。因此,在 ImagePanel 中加载图像使用了位于 HomePage-bundle 中的类,这些类现在无法访问该图像。

我通过在 ImagePanel-bundle 中引入一个 OSGi-Service 解决了这个问题,它将所有使用的图像作为字节数组传递给 HomePage-bundle。HomePage-bundle 现在可以访问所有资源,并将它们注册为SharedResourceImagePanel-bundle 再次提供的 id。

注册后,通过SharedResourceReference.

于 2013-10-16T08:14:43.950 回答