Wicket - 在Java中添加组件的顺序很重要?

时间:2014-06-29 19:43:54

标签: java wicket

我创建了一个简单的wicket表单,其中包含DropDownChoice,一个提交按钮和两个TextFields,以便尝试一些模型链接。 html:

    <!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
    <head>
        <meta charset="utf-8" />
        <title>DropDownTest</title>
    </head>
    <body>      
        <form wicket:id="selectForm">   
            <select wicket:id="dropDown"></select>              
            <input type="submit" wicket:id="bt"/>           
            <input type="text" wicket:id="age"/>
            <input type="text" wicket:id="name"/>           
        </form>             
    </body>
</html>

和java代码:

public class HomePage extends WebPage {
    private static final long serialVersionUID = 1L;    

private class Person implements Serializable {
    private int age;
    private String name;

    public Person(){};

    public Person(int pAge, String pName) {     
        age = pAge;
        name = pName;           
    }

    public int getAge() {return age;}

    public void setAge(int age) {this.age = age;}

    public String getName() {return name;}

    public void setName(String name) {this.name = name;}

}   

public List<Person> getPersons() {

    List<Person> persons = new ArrayList<Person>();
    persons.add(new Person(34, "Hanna"));
    persons.add(new Person(17, "Ivan"));
    persons.add(new Person(64, "Carol"));   
    return persons;
}

private Form form;
private DropDownChoice<Person> dropDown;

public HomePage(final PageParameters parameters) {
    super(parameters);      

    Model<Person> personModel = new Model<Person>();

    dropDown = new DropDownChoice<Person>("dropDown", personModel, getPersons(), 
            new ChoiceRenderer<Person>("name"));

    form = new Form("selectForm");

    form.add(new TextField("name", new PropertyModel(personModel, "name")));
    form.add(new TextField("age", new PropertyModel(personModel, "age")));      
    form.add(dropDown);

    form.add(new Button("bt"));     

    add(form);
}   
}

下拉选项和两个文本字段共享相同的模型(personModel),因此当用户从下拉列表中选择一个人并提交表单时,单击该按钮并重新加载页面,这两个字段将从所选的人员中获取他们的值该模型。这按预期工作,我没有错误。现在,如果我改变从这个(工作)添加组件到表单的顺序:

form.add(new TextField("name", new PropertyModel(personModel, "name")));
form.add(new TextField("age", new PropertyModel(personModel, "age")));      
form.add(dropDown);

到此(不工作)

form.add(dropDown);
form.add(new TextField("name", new PropertyModel(personModel, "name")));
form.add(new TextField("age", new PropertyModel(personModel, "age")));

提交表单时出错:

  

方法[public int com.asbjorntest.HomePage $ Person.getAge()]。无法将null值转换为原始类:int用于在com.asbjorntest.HomePage$Person@71460b93上设置它

我知道这个错误来自于我提交&#34; age&#34; textfield没有任何值,并且不能转换为Person类中的int。但是,为什么只有在我在Java代码中添加文本字段之前添加下拉选项时才会发生此错误?或许我应该问:为什么我以后添加它不会发生?我在java代码中向组件或页面添加组件的顺序是否重要,或者我在这里完全遗漏了某些内容?

提前感谢任何答案或线索!

2 个答案:

答案 0 :(得分:1)

我认为HTML中的顺序是无关紧要的。 Java中的顺序可能相关,因为组件的顺序决定了它们的验证方式。

当您将DropDownChoice置于最新状态时,null中的age TextField将被您在下拉列表中选择的值覆盖,并且一切正常。< / p>

如果您反过来放置组件,age将为null(来自TextField的值,您将收到错误。

简而言之:在多个组件编辑相同模型值时要小心

答案 1 :(得分:0)

据我所知,不鼓励在组件之间共享模型,因此建议为每个组件创建一个新模型。 请注意,当您创建personModel时,最初没有附加具体人员,我怀疑它是在添加到页面时创建的。因此,在创建文本字段并将其添加到表单时,模型的人员为空。

总而言之,我建议你这样:

public HomePage(final PageParameters parameters) {
    super(parameters);      

    Person person = new Person();
    form = new Form("selectForm");

    dropDown = new DropDownChoice<Person>("dropDown", new Model<Person>(person), getPersons(), new ChoiceRenderer<Person>("name"));
        form.add(dropDown);

    // I think you can use person as first parameter, else use new Model<Person(person),
    form.add(new TextField("name", new PropertyModel(person, "name")));
    form.add(new TextField("age", new PropertyModel(person, "age")));      

    form.add(new Button("bt"));     

    add(form);
} 

无论如何,因为我会使用Wicket,所以我可能完全错了:P