Apache Wicket不会加载(或显示)静态图像

时间:2013-10-10 10:22:34

标签: wicket

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

这是我到目前为止所做的:

1)应该保存图像的面板的HTML代码。没有特定的wicket代码,它应该只保存项目结构中的图像。

<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,图片)都位于同一个包中。我可以从主页项目访问Panel本身,因为我可以看到静态文本。但是我无法显示图像。

我使用的Application Server是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。

在此处查找整个堆栈跟踪:stack trace

2 个答案:

答案 0 :(得分:4)

在你的模板中,放一个

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

Wicket将重写网址,以便图片正常工作。

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

e.g。

add(new Image("myImage", new PackageResourceReference(MyClass.class, "test.jpg"));

答案 1 :(得分:0)

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

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

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

注册后,通过SharedResourceReference访问ImagePanel-bundle中的图像没有问题。