spring MVC如何接收前台传来的参数

spring MVC数据绑定

前端表单输入的内容比如登录输入的username,password,这些数据后台如何获取呢,如果是以前使用的Servlet,可以通过request.getParameter(“username”)这种方法式获取。但是spring MVC有更加简单快速的方式获取。

比如前台登录表单

<form action="/login" method="post">
     <input type="text" id="username" name="username"><br>
     <input type="text" id="password" name="password"><br>
     <input type="submit" value="login">
   </form>

后台接收

@RequestMapping(value = "/login",method=RequestMethod.POST)
	public void login(String username ,String password){
		System.out.println("用户输入username:"+username);
		System.out.println("用户输入password: "+password);
	}

我只是在controller方法里简单输出前端传来的值,没有做任何处理和返回,如果观察到后台的password和username有输出那么就证明后台已成功接收前端传来的参数。

还可以对应到对象上
比如有一个User类

public class User {

	private String username;
	
	private String password;

	//省略get/set/tostring
	
}

这然就可以直接把username,password传入到user对象里

	@RequestMapping(value = "/login",method=RequestMethod.POST)
	public void login(User user){
		System.out.println(user);
		
	}

这是不是就特别简单,spring MVC会把输入值绑定到对应contrller方法的参数上。

下面讲解几个注解

@RequestParam注解
spring MVC很容易实现数据绑定,但是前提是参数名称要对应。如果不对应,可以使用@RequestParam来绑定参数。
比如前端传的参数名字是name和word

<input type="text" id="name" name="name"><br>
<input type="text" id="word" name="word"><br>

后台接收的参数名是username,password
通过注解@RequestParam把前台的name和word绑定到对应参数上

@RequestMapping(value = "/login",method=RequestMethod.POST)
	public void login(@RequestParam("name") String username ,
			@RequestParam("word") String password){
		System.out.println("用户输入username:"+username);
		System.out.println("用户输入password: "+password);
	}

@RequestParam可以说是最常用的绑定参数的注解,无论你的是form表单发来的数据,或者url路径带来的参数,还是ajax发来的application/x-www-form-urlencoded类型的数据,都可以用他来绑定。但是不能用于绑定restful风格路径上参数,还有ajax类型为application/json的这种。

@RequestParam有几个可以设置的属性

  1. name 要绑定参数名称和value等价,默认是值""
  2. value 要绑定参数名称和name 等价,默认是值""
  3. required 是否必传,默认是值true
  4. defaultValue 如果不传可以为其设置默认值
	@RequestMapping(value = "/login",method=RequestMethod.POST)
	public void login(@RequestParam(value = "name",required=true) String username ,
			@RequestParam(name = "word",required=false,defaultValue="y1234567") String password){
		
		System.out.println("用户输入username:"+ username);
		System.out.println("用户输入password: "+ password);
	}

比如这段代码,@RequestParam(value = “name”,required=true) 表示绑定的前端传来的参数name,并且是标注了必传(required=true其实可以不用写,默认就是true)。第二个参数注解@RequestParam(name = “word”,required=false,defaultValue=“y1234567”)这个表示绑定前端传来参数word ,并且标记为非必传,默认值是"y1234567"。

必传和非必传什么意思?简单来说前端必须传这个参数过去,就是表单里必须有这个.

比如这样传就会报错

 <form action="/login" method="post">
     <input type="text" id="word" name="word"><br>
     <input type="submit" value="login">
 </form>

name参数没有传,因为要求前端name参数标记为必传。

如果这样就可以,因为password 绑定的word是标记着required=false的,表示非必传,并且标有注解defaultValue=“y1234567” 也就是说如果没有传,spring MVC会给他一个默认值y1234567

 <form action="/login" method="post">
     <input type="text" id="name" name="name"><br>
     <input type="submit" value="login">
 </form>

最后要注意defaultValue的值要求是String类型的,必须也要写成defaultValue=“1” 而不能写成defaultValue=1

@RequestParam(name = "word",required=false,defaultValue="1") int password

@PathVariable注解
spring MVC支持restful风格的URL,通过注解@PathVariable来获取参数。

@RequestMapping(value = "/find/{userId}",method=RequestMethod.GET)
	public void findUserDetail(@PathVariable Integer userId){
         System.out.println(userId); 
	}

url要通过占位符{userId}来对应,同样如果参数名称不对应也可以指定@PathVariable(“userId”)。
访问路径 http://localhost:8080/find/1,就可以从后台取到参数1 ,是不是对比http://localhost:8080/find?userId=1这样更简洁直观,restful风格就是有这个好处。

@RequestBody注解
一般用于ajax json数据格式参数的接收,前端传通过ajax发送json字符串,即Content-Type 为 application/json这种类型。后台就可以通过RequestBody把json字符串绑定到实体类中。

	@RequestMapping(value = "/login2",method=RequestMethod.POST)
	public void login2(@RequestBody User user){		
		System.out.println(user);
	}

测试
pom文件引入jackson相关依赖,其实有三个jackson-databind 、jackson-core、jackson-annotations 。由于jackson-databind依赖于后两个,而maven会自动引入下一级依赖,所以只需要配置jackson-databind就可以。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.2</version>
</dependency>

jsp页面引入jquery,去掉表单form ,利用ajax发送json串

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>   
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script src="https://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
</head>
<body>
   Hello Spring MVC !<br>
     <input type="text" id="name" name="name"><br>
     <input type="text" id="word" name="word"><br>
     <input type="submit" id="login" value="login">
</body>
<script type="text/javascript">
//为登录按钮绑定点击事件
$("#login").on("click",function(){
	//构造json对象
	var jsonObj = {"username" : $("#name").val() , "password" : $("#word").val()}
	   $.ajax({
		   type : "POST",
		   contentType : "application/json",
		   url : "/login2",
		   data: JSON.stringify(jsonObj),//转换成json串		  
	       success : function(str){//如果发送成功回调
	    	   alert("success");
	       }
	      
	   });
});

</script>
</html>

这样后台通过@RequestBody就可以把json里数据接收到User对象里。

最后简单小结:

  1. 简单介绍了spring MVC的数据绑定
  2. 介绍了三个注解@RequestParam、@PathVariable、@RequestBody

个人总结的:
3. 如果是用restful风格/xxx/{xxx} 这种必须用注解@PathVariable
4. 如果ajax发送的Content-Type 为 application/json类型用@RequestBody
5. 其他一般都用@RequestParam,或者不写注解参数名称对应即可

【个人经验之见,如有不足,欢迎指出纠正,版权为本站所有】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值