1. 程式人生 > >SpringMVC 資料繫結時,表單輸入值與實體資料型別一一對應的問題

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。