SpringMVC 数据绑定时,表单输入值与实体数据类型一一对应的问题

SpringMVC 数据绑定的一个小小的错误,竟搞得自己怀疑人生。赶紧记下来,免得重蹈覆辙。

Model

public class Student{
    private String name;
    private Long id;
    private Integer age;

    // getter & setter
    ...
}

Controller

@Controller
public class StudentController {

   @RequestMapping(value = "/student", method = RequestMethod.GET)
   public ModelAndView student() {
      return new ModelAndView("student", "command", new Student());
   }

   @RequestMapping(value = "/addStudent", method = RequestMethod.POST)
   public String addStudent(@ModelAttribute Student student, ModelMap model) {      
      model.addAttribute("name", student.getName());
      model.addAttribute("age", student.getAge());
      model.addAttribute("id", student.getId());
      return "result";
   }
}

Form

<form:form method="post" action="addStudent">
   <table>
    <tr>
        <td><label >名字:</label></td>
        <td><form:input path="name" /></td>
    </tr>
    <tr>
        <td><label >年龄:</label>
        <td><form:input path="age" /></td>
    </tr>
    <tr>
        <td><label >编号:</label></td>
        <td><form:input path="id" /></td>
    </tr>
    <tr>
        <td colspan="2">
            <input type="submit" value="提交表单"/>
        </td>
    </tr>
</table>  
</form:form>

填表单时,那个编号的内容无法转换成实体类的id,此时提交会报400错误。如果把实体类的id类型改成String,输入内容能转换成String,则可正常提交;按上面所给的id类型Long,则这个字段值只能填数值,所填数值能转换成Long类型就不会报400错误。

由于表单数据提交时都是按字符串形式提交的,后台则按数据绑定的对象类型,把字符串值转换成相应的对象类型值接收,如果字符串值转换出错,则引发400错误。所以,在填表单时所填的值,要能正确转换成实体对应的类型值,它们之间要一一对应才能正常提交。

这种问题通用的解决办法是对表单数据要做有效性检查,加上validation。

猜你喜欢

转载自blog.csdn.net/Sealyet/article/details/80063962