我的webapp上的一个DropDownChoice列表需要很长时间才能创建,因为某些操作通过LDAP连接和SQL连接获取选项。因此,整个页面的加载时间超过了几秒钟 - 我说的太多了。
所以我想要实现的是使用(最适合我)Wicket的内置Ajax功能来延迟加载这个下拉列表,但是我遇到了一些问题。
我知道如何制作常规的DropDownChoice列表,这个简单的例子非常适合我 - link
我也知道如何制作延迟加载段落,来自wicket-examples - link(源代码 - > LazyLoadingPage.html / LazyLoadingPage.java)
但是把它放在一起会让我产生异常并导致Wicket的内部错误。
以下是我尝试的方法:
HTML中的:
<select wicket:id="lazy"></select>
Java中的:
private String selected = "abc";
(...)
add(new AjaxLazyLoadPanel("lazy") {
@Override
public Component getLazyLoadComponent(String id) {
//simulating long time for simple list
try {
Thread.sleep(5000);
}
catch (InterruptedException e) {
throw new RuntimeException(e);
}
return new DropDownChoice<String>(
id, new PropertyModel<String>(this,"selected"),
Arrays.asList("abc","def"));
}
});
}
我从Wicket获得了内部错误,并在日志中显示:
ERROR Unexpected error occurred
Component [content] (path = [0:lazy:content]) must be applied to a tag of type [select], not: '<div wicket:id="content">' (line 0, column 0)
MarkupStream: [markup = jar:file:/C:/Program%20Files/Apache%20Software%20Foundation/Tomcat%207.0/webapps/devservices/WEB-INF/lib/wicket-extensions-1.5.7.jar!/org/apache/wicket/extensions/ajax/markup/html/AjaxLazyLoadPanel.html
,index = 0,current =&#39;&#39;
和stacktrace。
我真的很感激一些帮助,我做错了什么,或者是一些更好的代码示例。
答案 0 :(得分:1)
感谢bert,我在这里提供完整的解决方案,万一有人将来会使用它。
我们需要创建自己的面板,因为AjaxLazyLoadPanel只能将一个面板更改为另一个面板。
MyPanel.html示例:
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
<body>
<wicket:panel>
<select wicket:id="project"></select>
</wicket:panel>
</body>
</html>
和MyPanel.java:
public class MyPanel extends Panel {
private String selected = <what you want>;
private List<String> projectList <what you want>;
public MyPanel(String id) {
super(id);
add(new DropDownChoice<String>(
"project", new PropertyModel<String>(this, "selected"), projectsList));
}
}
在您的主页上,html只需添加:
<span wicket:id="lazy2"></span>
并在主页面java文件中:
add(new AjaxLazyLoadPanel("lazy") {
@Override
public Component getLazyLoadComponent(String id) {
return new MyPanel(id);
}
});
希望它也可以帮助别人: - )