Java Wicket:延迟加载下拉选择

Java Wicket:延迟加载下拉选择,java,ajax,web-applications,wicket,Java,Ajax,Web Applications,Wicket,在我的webapp上创建一个DropDownChoice列表需要很长时间,因为通过LDAP连接和SQL连接的某些操作可以获取选项。正因为如此,整个页面的加载时间远远超过了几秒钟——我想说的太多了 所以我想要实现的是,使用Wicket的内置Ajax功能来延迟加载这个下拉列表,但我有一些问题 我知道如何制作常规的下拉列表,这个简单的例子对我来说非常有用- 我还知道如何通过wicket示例(源代码->LazyLoadingPage.html/LazyLoadingPage.java)生成延迟加载的段落

在我的webapp上创建一个DropDownChoice列表需要很长时间,因为通过LDAP连接和SQL连接的某些操作可以获取选项。正因为如此,整个页面的加载时间远远超过了几秒钟——我想说的太多了

所以我想要实现的是,使用Wicket的内置Ajax功能来延迟加载这个下拉列表,但我有一些问题

我知道如何制作常规的下拉列表,这个简单的例子对我来说非常有用-

我还知道如何通过wicket示例(源代码->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"));

            }
        });
    }
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);
    }
});