1,默认支持的类型

SpringMVC 有支持的默认参数类型,我们直接在形参上给出这些默认类型的声明,就能直接使用了。如下:

①、HttpServletRequest 对象

②、HttpServletResponse 对象

③、HttpSession 对象

④、Model/ModelMap 对象

ModelMap是Model接口的一个实现类,作用是将Model数据填充到request域 , 即使使用Model接口,其内部绑定还是由ModelMap来实现

@RequestMapping("/defaultParameter")
public ModelAndView defaultParameter(HttpServletRequest request,HttpServletResponse response,HttpSession session,Model model,ModelMap modelMap) throws Exception{
        request.setAttribute("requestParameter", "request类型");
        response.getWriter().write("response");
        session.setAttribute("sessionParameter", "session类型");
    
        //ModelMap是Model接口的一个实现类,作用是将Model数据填充到request域
        //即使使用Model接口,其内部绑定还是由ModelMap来实现
        model.addAttribute("modelParameter", "model类型");
        modelMap.addAttribute("modelMapParameter", "modelMap类型");
        ModelAndView mv = new ModelAndView();
        mv.setViewName("view/success.jsp");
        return mv;
    }

2,基本数据类型的绑定

参数与前端传的参数一 一对应

如果不能一 一对应,可以使用**@RequestParam**绑定对应关系,例如前端传的name,后端用userName接收

@RequestMapping("saysth.do")
public void test(String name) {
}

@RequestMapping("saysth.do")
public void test(@RequestParm(value="name")String userName) {
}

3,对象方式绑定

方式一:简单对象直接使用bean对象接收

如果页面请求参数名和对象的属性名相同,可以使用实体bean对象作为方法的形参,然后将请求参数的值放到对应的对象的属性中。这个方法可以接收前台传递的多个请求参数的值,

$.ajax({
	url:"/user",	//请求路径
    type: "post",	//请求方式
	data: {"username":"jack","age":23},		//前端传的数据
    contentType : 'application/x-www-form-urlencoded;charset=utf-8',	//传输类型
    dataType:'json',		//响应数据类型
	success: function(data){	//date响应的数据
	}
})

@RequestMapping("/login")
public void login(User user){    
}

方式二:简单对象使用@ModelAttribute注解

使用@ModelAttribute注解,形参的对象会被springMVC直接放入请求作用域中,默认的key为对象类名首字母小写

$.ajax({
	url:"/user",	//请求路径
    type: "post",	//请求方式
	data: {"username":"jack","age":23},		//前端传的数据
    contentType : 'application/x-www-form-urlencoded;charset=utf-8',	//传输类型
    dataType:'json',		//响应数据类型
	success: function(data){	//date响应的数据
	}
})

@RequestMapping("/login")
public void getName(@ModelAttribute User user){
}

方式三:简单对象使用@RequestParam绑定map(见下方map数据类型绑定)

方式四:简单对象使用@RequestBody绑定map(见下方map数据类型绑定)

方式五:复杂对象使用@RequestBody

复杂对象(对象中含有对象或者list或者map或者数组等)直接使用@RequestBody接收

例如 : User对象中含有Student对象

public class User {
    Student s;
    String name;
    String pswd;
    // getter  setter
 }

Student是另一单独的对象
public class Student {
    String clas;
    int age;
    // getter setter
}


var user={
    		"s": {"clas": "s1", "age": "11"},
    		"name" : "susq",
    		"pswd" : 1233
		}

$.ajax({
	url:"/user",	//请求路径
    type: "post",	//请求方式
	data: JSON.stringify(user),		//前端传的数据,将JSON数据转为JSON字符串对象
    contentType : 'application/json;charset=utf-8',	// 传输类型改为json格式*****
    dataType:'json',		//响应数据类型为json字符串
	success: function(data){	//date响应的数据
	}
})
    
@RequestMapping("/login")
public void getName(@RequestBody User user){
}

3,map数据类型绑定

结论 : 当Ajax以application/x-www-form-urlencoded格式上传即使用JSON对象,后台需要使用@RequestParam 或者Servlet获取。 当Ajax以application/json格式上传即使用JSON字符串,后台需要使用@RquestBody获取。

类型一:后端用@RequestParam绑定map

前端contentType : application/x-www-form-urlencoded;charset=utf-8 ,这也是默认的传输类型 , 这样后端才能接收参数

@RequestParam的注解 它的作用和我们Servlet中的request.getParameter是基本相同的。

$.ajax({
	url:"/user",	//请求路径
    type: "post",	//请求方式
	data: {"username":"jack","age":23},		//前端传的数据
    contentType : 'application/x-www-form-urlencoded;charset=utf-8',	//传输类型*****
    dataType:'json',		//响应数据类型
	success: function(data){	//date响应的数据
	}
})

@RequestMapping("/user")
public void getName(@RequestParam Map<String,Object> map){

}

类型二:后端用@RequestBody绑定map

前端contentType :application/json 类型传参后端才能接收到

同时需要将 json数据转为JSON字符串对象 JSON.stringify(map)

var map={"username":"jack","age":23}

$.ajax({
	url:"/user",	//请求路径
    type: "post",	//请求方式
	data: JSON.stringify(map),		//前端传的数据,将JSON数据转为字符串
    contentType : 'application/json;charset=utf-8',	// 传输类型改为json格式*****
    dataType:'json',		//响应数据类型为json字符串
	success: function(data){	//date响应的数据
	}
})

@RequestMapping("/user")
public void getName(@RequestBody Map<String,Object> map){
}

4,Restful风格的参数

通过@PathVariable获取路径中的参数

@RequestMapping(value="/addUser4/{username}/{password}")
public String addUser4(@PathVariable String username,@PathVariable String password) {
        System.out.println("username is:"+username);
        System.out.println("password is:"+password);
        return "demo/index";
}

访问http://localhost/demo/addUser4/lixiaoxi/111111路径时,则自动将URL中模板变量{username}和{password}绑定到通过@PathVariable注解的同名参数上,即入参后username=mayun、password=111111。 说白了此注解就是从路径中获取变量的值,注入给形式参数.

5,JSON对象和JSON字符串

var jsonObject ={"username":"admin","password":123};
这是一个JSON对象,JavaScript向我们提供了两个工具
JSON.parse()  用于将一个 JSON 字符串转换为 JavaScript 对象。
JSON.stringify()  用于将 JavaScript 值转换为 JSON 字符串。

alert(jsonObject); 这里弹出的是一个对象,会显示[object Object]
alert(JSON.stringify(jsonObject));弹出就会显示 {“username”:”admin”,”password”:123};

SpringMVC的@RequestParam注解,Servlet的request.getParameter是可以接受到以这种格式传输的JSON对象的。

为什么呢!?GET请求想必大家都不陌生,它将参数以url?username=”admin”&password=123这种方式发送到服务器,并且request.getParameter可以接收到这种参数,我们在浏览器地址栏上也可以看到这一点。而我们Ajax使用的POST,并且发送的是JSON对象,那么后台是如何获取到的呢?答案就在于这个Content-Type x-www-form-urlencoded的编码方式把JSON数据转换成一个字串,(username=”admin”&password=123)然后把这个字串添加到url后面,用?分割,(是不是和GET方法很像),提交方式为POST时候,浏览器把数据封装到HTTP BODY中,然后发送到服务器。所以并不会显示在URL上。(这段可能有点绕口,希望大家用心理解一下。)

终于说完了,长吐一口气。所以说我们使用@RequestBody注解的时候,前台的Content-Type必须要改为application/json,如果没有更改,前台会报错415(Unsupported Media Type)。后台日志就会报错Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported,这些错误Eclipse下Tomcat是不会显示错误信息的,只有使用了日志才会显示,如何配置日志大家可以看我上一篇文章。接下来我们正确配置一下,上面说到了 Content-Type需要更改,同时我们的data也要更改了,这种注解方式只接受JSON字符串而不是JSON对象

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐