我目前正在进入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
答案 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中的图像没有问题。