SpringMVC中控制器接收JSP页面表单的参数接收方式详解及细节注意(400错误)
控制器方法中参数的接收
(1)以前的参数接收:
string param = req.getparameter(name);
(2)springmvc简化这个操作,只需要给控制器方法添加参数即可
a:本质上还是调用上述方法进行接收,只不过做了封装
b:参数类型(特殊类型除外,例如:date)可以自动转换
注意:
(1)表单中的name属性值和方法列表值保持一致,如果不一致,不会报错,但那是接收到的值是null,需要注意的是,int类型的参数不能是null,所以服务器和页面都会报错:所以,为避免这种错误,在定义实体类的时候实体类中的属性类型,基本类型最好定义成包装类型
(2)当接收到的数据属于日期类型时,如果仅仅使用date作为接收参数类型时,是不能解决问题的,因为日期是有格式定义的,并且表单中的日期格式必须要和方法参数列表中的日期格式一一对应,不然也会报错;可以通过注解@datetimeformat(pattern = "yyyy-mm-dd") date birthday,两次避免错误;此外,在springmvc中,400类型的错误,一般都是由于接收参数类型不匹配所造成的
(3)当参数列表为boolean类型的数据时,表单中提交的参数值可以是true或者false,能够正常接收,也可以是1或者0,其中1代表true,0代表false
婚否: <input type="radio" name="married" value="1"> 已婚
<input type="radio" name="married" value="0"> 未婚<br>
(4)当方法参数列表为一个对象时,springmv也可以进行参数接收,不过要求对象的属性名称必须和表单中的name值保持一致。其中,如果对象中的属性为另一个对象,在表单中可以通过对象名.属性名来进行对属性的赋值
地址: <select name="address.city">
(5)当方法参数列表为list集合,表单中的name属性值,可以通过下面方式进行命名:
地址1: <select name="addrlist[0].city">
(6)不能使用map集合作为方法参数列表
<form action="${pagecontext.request.contextpath}/demo1" method="post">
用户名: <input type="text" name="username"><br>
年龄: <input type="text" name="age"><br>
生日: <input type="text" name="birthday">yyyy-mm-dd<br>
爱好: <input type="checkbox" name="hob" value="java"> java
<input type="checkbox" name="hob" value="c++"> c++
<input type="checkbox" name="hob" value="php"> php<br>
婚否: <input type="radio" name="married" value="1"> 已婚
<input type="radio" name="married" value="0"> 未婚<br>
地址: <select name="address.city">
<option value="北京">北京</option>
<option value="上海">上海</option>
<option value="天津">天津</option>
</select><br>
地址1: <select name="addrlist[0].city">
<option value="北京">北京</option>
<option value="上海">上海</option>
<option value="天津">天津</option>
</select><br>
地址2: <select name="addrlist[1].city">
<option value="北京">北京</option>
<option value="上海">上海</option>
<option value="天津">天津</option>
</select><br>
<input type="submit" value="提交">
</form>
package com.bjsxt.controller;
import com.bjsxt.pojo.user;
import org.springframework.format.annotation.datetimeformat;
import org.springframework.stereotype.controller;
import org.springframework.web.bind.annotation.requestmapping;
import java.util.arrays;
import java.util.date;
@controller
public class democontroller {
@requestmapping("/demo1")
public string demo1(user user) {
system.out.println(user);
return "index.jsp";
}
@requestmapping("/demo2")
public string demo2(string username,
integer age,
@datetimeformat(pattern = "yyyy-mm-dd") date birthday,
string[] hob,
boolean married) {
system.out.println("username = " + username);
system.out.println("age = " + age);
system.out.println("birthday = " + birthday);
system.out.println("hob = " + arrays.tostring(hob));
system.out.println("married = " + married);
return "index.jsp";
}
}
public class user implements serializable {
//此处省略getter和setter方法,正常测试时需要添加
private string username;
private integer age;
@datetimeformat(pattern = "yyyy-mm-dd")
private date birthday;
private string[] hob;
private boolean married;
private address address;
private list<address> addrlist = new arraylist<>();
}
public class address implements serializable {
private string city;
}