SpringMVC Controller接收请求参数(详解)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44296929/article/details/102520289

一、接收请求参数:
1、【不推荐】通过HttpServletRequest
–在处理请求的方法中,添加HttpServletRequest对象作为参数,在方法体中,直接调用对象的getParameter()或类似功能的方法,即可获取请求参数。
例:比如我们通过页面上传username、password、age…等几个参数,然后我们使用HttpServletRequest对象进行获取。

@RequestMapping("handle_reg.do")
	public String handleReg(HttpServletRequest request) {
		String username
			= request.getParameter("username");
		String password
			= request.getParameter("password");
		Integer age
			= Integer.valueOf(request.getParameter("age"));
		String phone
			= request.getParameter("phone");
		String email
			= request.getParameter("email");
		return null;
	}

2、【推荐】在处理请求的方法中声明同名的参数
–假设用户提交的参数是username = root,则参数名是username,当需要获取这个参数的值时,直接在处理请求的方法中声明String username即可,框架会把root值直接用于调用处理请求的方法,即String username的值就已经时root了。

注:a. 使用这种做法,可以无视数据类型,例如希望age时Integer类型,则直接声明为Integer类型即可,无须自行转换。

b. 使用这种做法时,必须保证提交的请求的参数名称与处理请求方法中的参数名称是一致的,如果不一致,则处理请求的方法中,对应的值会是null值。

c. 如果参数名称无法统一,那么我们可以使用@RequestParam()注解,下面会有介绍。

d. 这种做法最大的缺陷是:不适用于数据项目太多的表单,否则,会导致处理请求的方法中需要添加大量的参数。(第三中方法就解决了这个问题)

@RequestMapping("handle_reg.do")
	public String handleReg(
			String username, String password, 
			Integer age, String phone, String email) {
		System.out.println("username=" + username);
		System.out.println("password=" + password);
		System.out.println("age=" + (age + 1));
		System.out.println("phone=" + phone);
		System.out.println("email=" + email);	
		return null;
	}

3、【推荐】使用自定义类型获取多项数据
–假设请求参数中包含多项数据,例如:username=admin&password=123456&age=22&phone=13900139001&email=admin%40tedu.cn,而这些数据都是可以封装在同一个类型(对象)中,则直接使用该类型作为处理请求的参数即可。

注:a. 如果请求参数的参数名称,与类中的属性名称不一致,则类对象中对应的属性值为null

b. 这种做法可以与前序介绍的第2种做法组合来使用。

package cn.tedu.spring.entity;

public class User {
	private String username;
	private String password;
	private Integer age;
	private String phone;
	private String email;
	public String getUsername() {
		return username;
	}
	public String getPassword() {
		return password;
	}
	public Integer getAge() {
		return age;
	}
	public String getPhone() {
		return phone;
	}
	public String getEmail() {
		return email;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
}
@RequestMapping("handle_reg.do")
	public String handleReg(User user) {
		
		System.out.println("[3] username=" + user.getUsername());
		System.out.println("[3] password=" + user.getPassword());
		System.out.println("[3] age=" + (1 + user.getAge()));
		System.out.println("[3] phone=" + user.getPhone());
		System.out.println("[3] email=" + user.getEmail());	
		
		return null;
	}

4、关于@RequestParam注解:
使用@RequestParam注解,可以解决请求参数名称与处理请求的方法的参数名称不一致的问题,例如:请求参数名称为name,而处理方法中的参数名称为username,我们使用下面注解是可以正常运行的。

注:a. 一旦使用了 @RequestParam注解,默认情况下,参数是必须的,例如:我们配置了 @RequestParam(“passwd”) String password后,如果请求中并不存在名为 passwd的参数,则会出现400错误:HTTP Status 400 - Required String parameter ‘passwd’ is not present

b. 没有提交名为passwd的参数,与提交了空值,是两码事,即:如果提交了passwd参数却没有值(例如输入框中没有输入值),在服务器将得到空字符串(""),程序不会出现错误,如果根本提交名为passwd的参数,则会导致400错误。

c. 如果使用了 @RequestParam注解,却又不想设置为必须提交该参数,可以使用 @RequestParam(value=“name”, required=false),当设置了 required=false时,就意味着可以不必提交该参数,还可以多设置一项 defaultValue属性,表示如果没有提交该参数,则默认值会采用我们配置的数值。

public String handleLogin(
	@RequestParam("name") String username, 
			String password) {
	 ...
}

例子:@RequestParam(value="passwd", required=false, defaultValue="888999") String password

解释: 以上代码表示:希望请求中包含名为passwd的参数,如果有,则值用于方法的String password的参数,如果没有,也不是必须要提供(required=false),并且使用"888999"作为默认值(defaultValue="888999"),即:在这种情况下,String password的值是"888999"

小结:@RequestParam注解是用于处理请求的方法中的参数之前,可以配置3项属性,分别是value表示请求参数名称,required表示请求中是否必须包含该参数,defaultValue表示参数的默认值,当有以上任何一种需求时,都需要配置该注解,即:请求参数名称与处理请求的方法的参数名称不一致;强制必须提交某个参数;为某个参数配置默认值。

总结: 关于获取请求参数,首先,并不推荐使用HttpServletRequest,主要原因是相对比较原始,编码比较繁琐!而声明同名参数,或声明对象,都是推荐的做法,至于使用哪一种,可以根据参数的数量及数据是否适合被封装到同一个类中,综合评定,并且,这2种做法可以组合使用!

猜你喜欢

转载自blog.csdn.net/weixin_44296929/article/details/102520289