我需要wicket中组件的URL。当我使用页面时它可以正常工作,但是当使用面板时它不起作用。
public final class ImageP extends Panel {
public ImageP(String id) {
super(id);
List<Mapp> list = Mapp.loadall(); //load image from database
final Mapp asr = list.get(0);
ByteArrayResource resource = new ByteArrayResource("image/jpeg", asr.getImage());
Image image = new Image("img", resource);
add(image);
System.out.println(getRequestCycle().urlFor(image, IResourceListener.INTERFACE));
}
}
此代码不起作用并引发异常,但是当我使用页面而不是面板getRequestCycle().urlFor(image, IResourceListener.INTERFACE)
时,它可以正常工作。
答案 0 :(得分:2)
我敢打赌你有以下例外:
java.lang.IllegalStateException: No Page found for component [Component id = img]
这是因为RequestCycle对象在内部调用组件的getPage()方法,该方法是urlFor()方法的第一个参数,具有以下签名:
urlFor(Component component, RequestListenerInterface interface)
如果在面板的构造函数中调用方法urlFor(),则无法获取面板子节点的页面,因为面板尚未附加到页面。所以Wicket抛出“一个很好的例外”。
要解决该问题,您只需将代码移动到面板的onBeforeRender()方法即可。这样的事情:
@Override
protected void onBeforeRender() {
//
// ... init resource ...
//
Image image = new Image("img", resource);
addOrReplace(image);
System.out.println(getRequestCycle().urlFor(image, IResourceListener.INTERFACE));
super.onBeforeRender();
}
P.S。我还假设您正在使用Wicket 1.4或更早版本,因为Wicket 1.5及更高版本中没有RequestCycle.urlFor(组件,侦听器)方法。因此,我认为在这种情况下,你的问题和我的答案都没有意义。