Java Wicket:getModelObject返回null
我在getModelObject方面遇到了麻烦。它正在返回null。实际上,模型的概念对我来说并不清楚。代码是:Java Wicket:getModelObject返回null,java,wicket,Java,Wicket,我在getModelObject方面遇到了麻烦。它正在返回null。实际上,模型的概念对我来说并不清楚。代码是: public class SpaceCheckListWindow extends WebPage { private SpaceCheckListForm spaceCheckListForm; private Page parentPage; private ModalWindow modalWindow; public SpaceCheckListWindow(Page pa
public class SpaceCheckListWindow extends WebPage {
private SpaceCheckListForm spaceCheckListForm;
private Page parentPage;
private ModalWindow modalWindow;
public SpaceCheckListWindow(Page parentPage, final ModalWindow modalWindow) {
this.parentPage = parentPage;
this.modalWindow = modalWindow;
String[] labels = new String[] {
"a",
"b",
"c",
"d",
"e",
"f"
};
List<ListMemeber> list = new ArrayList<ListMemeber>();
for(String label : labels) {
list.add(new ListMemeber(label));
}
addComponent(list);
}
private void addComponent(List<ListMemeber> list) {
spaceCheckListForm = new SpaceCheckListForm("form", list);
add(spaceCheckListForm);
}
private class SpaceCheckListForm extends Form {
private static final long serialVersionUID = 1L;
public SpaceCheckListForm(String id, final List<ListMemeber> list) {
super(id);
ListView listView = new ListView("listView", list) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem listItem) {
ListMemeber member = (ListMemeber) listItem.getModelObject();
listItem.add(new Label("label", member.getLabel()));
listItem.add(new CheckBox("checkbox", new PropertyModel(member, "selected")));
}
};
listView.setReuseItems(true);
add(listView);
AjaxButton submitBtn = new AjaxButton("submitBtn", this) {
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit(AjaxRequestTarget target, Form form) {
System.out.println(spaceCheckListForm.getModelObject());
modalWindow.close(target);
}
};
add(submitBtn);
}
}
private class ListMemeber implements Serializable {
private String label;
private Boolean selected = Boolean.FALSE;
public ListMemeber(String label) {
this.label = label;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public Boolean getSelected() {
return selected;
}
public void setSelected(Boolean selected) {
this.selected = selected;
}
@Override
public String toString() {
return label + Boolean.toString(selected);
}
}
公共类SpaceCheckListWindow扩展网页{
私有SpaceCheckListForm SpaceCheckListForm;
私人网页父网页;
私有ModalWindow ModalWindow;
公共空间检查列表窗口(页面父页面,最终ModalWindow ModalWindow){
this.parentPage=parentPage;
this.modalWindow=modalWindow;
字符串[]标签=新字符串[]{
“a”,
“b”,
“c”,
“d”,
“e”,
“f”
};
列表=新的ArrayList();
用于(字符串标签:标签){
添加(新的ListMemeber(标签));
}
添加组件(列表);
}
私有void addComponent(列表){
spaceCheckListForm=新的spaceCheckListForm(“表格”,列表);
添加(spaceCheckListForm);
}
私有类SpaceCheckListForm扩展了表单{
私有静态最终长serialVersionUID=1L;
公共空间检查列表表单(字符串id,最终列表){
超级(id);
ListView ListView=新建ListView(“ListView”,列表){
私有静态最终长serialVersionUID=1L;
@凌驾
受保护的void populateItem(ListItem ListItem){
ListMemeber成员=(ListMemeber)listItem.getModelObject();
添加(新标签(“Label”,member.getLabel());
添加(新复选框(“复选框”,新属性模型(成员,“选定”));
}
};
setReuseItems(true);
添加(列表视图);
AjaxButton submitBtn=新的AjaxButton(“submitBtn”,this){
私有静态最终长serialVersionUID=1L;
@凌驾
提交时受保护的void(AjaxRequestTarget目标,表单){
System.out.println(spaceCheckListForm.getModelObject());
modalWindow.close(目标);
}
};
增加(提交);
}
}
私有类ListMemeber实现可序列化{
私有字符串标签;
所选私有布尔值=Boolean.FALSE;
公共ListMemeber(字符串标签){
this.label=标签;
}
公共字符串getLabel(){
退货标签;
}
公共void setLabel(字符串标签){
this.label=标签;
}
公共布尔getSelected(){
返回选中的;
}
已选择公共无效设置(已选择布尔值){
this.selected=selected;
}
@凌驾
公共字符串toString(){
返回标签+布尔.toString(选中);
}
}
}
现在单击AjaxButton它将返回null。我想得到标签和相应的复选框值。我该怎么做才能得到它?任何信息都会对我很有帮助。谢谢。您的组件层次结构如下所示:
SpaceCheckListWindow
SpaceCheckListForm (id: form)
ListView (id: listView)
ListItem (id: <generated by wicket>)
Label (id: label)
CheckBox (id: checkbox)
AjaxButton (id: submitBtn)
spacechecklist窗口
SpaceCheckListForm(id:form)
ListView(id:ListView)
ListItem(id:)
标签(id:标签)
复选框(id:CheckBox)
AjaxButton(id:submitBtn)
在Wicket中,每个组件可能都有一个模型,用于存储其显示/操作的数据。此模型通常传递给构造函数中的组件。如果没有发生这种情况,则使用空模型初始化组件(这本身不是错误)。但是在代码中,表单是用空模型创建的,并且也没有任何东西可以更新模型,因此getModelObject()
将始终返回null。这也不是一个错误,表单本身不必有模型对象
这里唯一一个具有非平凡模型的组件是复选框
,它可以读取/更新ListMemeber
的所选
字段。(更新:当然,您的标签也有一个非空模型,但标签只读取其模型,从不更新。)
总而言之,这段代码没有什么根本性的错误,你只是在错误的地方寻找结果:与其注销表单的模型对象,不如列出所有列表成员的选中的字段,看看提交表单时有什么变化
一些关于Wicket型号的附加阅读:感谢您提供详细说明。我看到模型通常是POJO。现在,如果我想创建这样一个类作为表单的模型。如何在其中插入listview?对于文本字段或复选框,它将是字符串或布尔值,不是吗!那么listview呢,我应该声明一个列表及其getter和setter吗?那么toString方法是什么呢?在上面的问题中,如果我调用listview.getmodelobject,那么它将正常工作。谢谢你帮助我。