Java Wicket:延迟加载下拉选择
在我的webapp上创建一个DropDownChoice列表需要很长时间,因为通过LDAP连接和SQL连接的某些操作可以获取选项。正因为如此,整个页面的加载时间远远超过了几秒钟——我想说的太多了 所以我想要实现的是,使用Wicket的内置Ajax功能来延迟加载这个下拉列表,但我有一些问题 我知道如何制作常规的下拉列表,这个简单的例子对我来说非常有用- 我还知道如何通过wicket示例(源代码->LazyLoadingPage.html/LazyLoadingPage.java)生成延迟加载的段落 但把它放在一起会抛出异常并导致Wicket的内部错误 以下是我如何尝试做到这一点: 在HTML中:Java Wicket:延迟加载下拉选择,java,ajax,web-applications,wicket,Java,Ajax,Web Applications,Wicket,在我的webapp上创建一个DropDownChoice列表需要很长时间,因为通过LDAP连接和SQL连接的某些操作可以获取选项。正因为如此,整个页面的加载时间远远超过了几秒钟——我想说的太多了 所以我想要实现的是,使用Wicket的内置Ajax功能来延迟加载这个下拉列表,但我有一些问题 我知道如何制作常规的下拉列表,这个简单的例子对我来说非常有用- 我还知道如何通过wicket示例(源代码->LazyLoadingPage.html/LazyLoadingPage.java)生成延迟加载的段落
<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"));
}
});
}
private String selected=“abc”;
(...)
添加(新AjaxLazyLoadPanel(“惰性”){
@凌驾
公共组件getLazyLoadComponent(字符串id){
//简单列表的长时间模拟
试一试{
睡眠(5000);
}
捕捉(中断异常e){
抛出新的运行时异常(e);
}
返回新的下拉选择(
id,新PropertyModel(此“选定”),
数组.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
错误发生意外错误
组件[content](路径=[0:lazy:content])必须应用于类型为[select]的标记,而不是:“”(第0行,第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/ajaxlazzlazyloadpanel.html
,索引=0,当前=“”
还有stacktrace
我非常感谢您的帮助,我做错了什么,或者一些更好的代码示例。多亏了,我在这里提供了完整的解决方案,以防将来有人使用它
我们需要创建自己的面板,因为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>
希望它也能帮助其他人:-)尝试将DDC放入面板(或片段)中,并在getLazyLoadComponent()中构造/返回它。bert You Make my day!工作非常好-非常感谢!!!还可以查看select2 wicket实现,请参阅
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));
}
}
<span wicket:id="lazy2"></span>
add(new AjaxLazyLoadPanel("lazy") {
@Override
public Component getLazyLoadComponent(String id) {
return new MyPanel(id);
}
});