使用JSP表单更新对象

时间:2015-11-16 17:57:00

标签: java spring jsp spring-mvc

如果我将对象传递给jsp页面,如何使用setter更新其字段并将其发回?

例如我们有

public class Person {

    private int age;
    private String name;

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

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

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

和控制器

@RequestMapping(value = "/updatePerson", method = RequestMethod.GET)
public String showPerson(Model model) {
    Person person = new Person();
    person.setAge(23);
    person.setName("Jack");
    model.addAttribute("person", person);

    return "updatePerson";
}

和jsp页面

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>

<form:form modelAttribute="person">
    <form:input path="age"/>
    <input type="submit"/>
</form:form>

如何使这个JSP页面作为结果发送修改后的人物对象,而不是仅包含一个字段的新文件?

1 个答案:

答案 0 :(得分:2)

在控制器中添加一个处理表单提交的方法:

@RequestMapping(value = "/updatePerson", method = RequestMethod.POST)
public String alterPerson(@ModelAttribute Person person) {
    // do stuff
}

请注意更改:

  • POST代替GET:默认情况下提交表单使用POST - 请求。
  • @ModelAttribute会自动检索提交的数据,并用它填充Person个对象

但是,使用表单,name字段将始终为空。添加另一个<form:input path="name"/>来修复它。

如果您不想让用户更改其名称,则Person对象可能根本不应出现在您的模型中;但这取决于这些对象如何持久化。您可以使用这样的单独对象:

public class PersonChangeRequest {
    private int age;

    public int getAge() {
        return age;
    }

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

并将其用作@ModelAttribute,如下所示:

@RequestMapping(value = "/updatePerson", method = RequestMethod.GET)
public String showPerson(Model model) {
    PersonChangeRequest person = new PersonChangeRequest();
    person.setAge(23);
    model.addAttribute("person", person);

    return "updatePerson";
}

@RequestMapping(value = "/updatePerson", method = RequestMethod.POST)
public String alterPerson(@ModelAttribute PersonChangeRequest personChangeRequest) {
    Person person = findPersonToChange(personChangeRequest);
    person.setAge(personChangeRequest.getAge());
}