[练习][错误]SpringMVC错误:HTTP Status 400 – Bad Request

  记录一个初学SpringMVC遇到的一个问题,在数据传递过程中出现页面报错,出现了下面的问题:

HTTP Status 400 – Bad Request

Type Status Report

Description The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).
一、问题描述及修改。

初学SpringMVC的时候,做一个小练习,添加学生信息,先设置映射地址,然后在方法的形参使用Student对象,在接收页面的post请求时,由SpringMVC将传递的参数封装成对象:

@RequestMapping(value = "/add", method = RequestMethod.POST)
public String add(Student student) {
	System.out.println(student.toString());
	// service.add(student);
	return "";
}

其中student实体类,有一个属性birthday是Date类型,而页面传递过来的参数为默认为String类型,两者之间不能自动转换,因此,SpringMVC出现调用setter方法时参数类型出错,因此不能够完成student对象的创建。

此时,可以改变birthday的setter方法中形参类型,即获取生日内容,然后强转为Date类型保存,如下

public void setBirthday(String str) {
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
	Date birthday;
	try {
		birthday = sdf.parse(str);
		this.birthday = birthday;
	} catch (ParseException e) {
		e.printStackTrace();
	}
}

二、衍生思考。

在寻找内容的过程中,有一些新的发现,记录一下。

1、当student实体类中的setter方法没有参数时,SpringMVC不会调用此setter方法,在添加setter的形参后SpringMVC才会调用此方法。可以推测:SpringMVC是使用实体类的setter方法进行封装对象的,与MyBatis类似;并且需要给setter设置参数类型,最好与页面传递内容的类型一致。

2、如果student实体类中使用了其他类作为属性,即关联关系。比如说,student中有一个年级对象grade,那么在编辑页面的表单中,其标签的name值则为“grade.gradeId”,即使用后台接收student对象中的grade对象属性,并且具体到grade对象中属性gradeId。在正确的前提下,SpringMVC会根据setter方法封装好对象,作为后台映射URL函数的形参,直接使用该形参就可以获取到保存在其中的属性值了。

3、题外话,为了防止数据绕过js、jq对数据校验,需要在浏览器和服务器两端都进行数据校验。

你可能感兴趣的:(SpringMVC)