【知识要点】

  1. 前后端分离概念
    前端开发不依赖与后端,二者均可独立发展。二者责任与分工明确,前端负责人机交互操作,后者负责仅提供数据服务,不再参与前端页面的跳转的控制。随着前端设备的多元化,前后端分离开发已经成为当前开发的主流模式。
  2. 请求参数接收
    后端对请求参数可以通过传统的HttpServletRequest对象,传递的数据、session、cookie等数据的接收;通过正常变量,如:String、Integer、实体对象进行接收、通过JSON接收数据。其中通过JSON接收数据时,需要使用springmvc提供的注解符@RequestBody,通过JSON传递多个参数已经成为当前主流模式。
  3. 注解符@RequestParam
    前后端参数传值时,要求请求数据的变量名称和后端方法的行参名完全一致,这是一种紧耦合的方式。双方名称不一致时,使用这个注解符建立映射关系。
  4. restful风格的参数
    在restful风格编程中,要求使用路径占位传参,在get请求中所传参数只有值没有名称,需要使用@PathVariable完成路径占位传参
  5. 控制器方法的返回值
    控制器方法返回值包括ModelAndView、String、Void和JSON四种类型,其中ModelAndView、String涉及页面跳转,不符合前后端分离的要求,Void使用传统的HttpServletRespone返回数据,不是主流的返回方式;使用JSON返回数据是当前主流模式,这种返回模式,需要在方法上使用注解符@ResponseBody,如果整个控制器所有的方法均返回JSON格式的数据,则可以简化为在控制器类上加@RestController注解。

【实验目的】

  1. 掌握请求数据的接收
  2. 掌握控制器方法的返回值

【实验内容】

  1. 请求参数的接收
  2. 返回JSON格式数据

【实验步骤】

1. 实验环境搭建

1). 使用maven创建web工程demo4
2). 由于项目需要使用JSON格式的数据,需要添加依赖包坐标如下所示:

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

2. 参数绑定

1) 使用HttpServletRequest对象接收参数,代码如下:

@RequestBody
@RequestMapping("verify1")  
public String handle1(HttpServletRequest request){  
  Map<String,String> dataMap = new HashMap<>();  
  dataMap.put("method",request.getMethod());  
  dataMap.put("queryString",request.getQueryString());  
  dataMap.put("url",request.getRequestURL().toString());  
  dataMap.put("params",request.getParameter("dataNo"));  
       
  return dataMap
}

在request对象中还可以获取Cookie读取,http请求字段等信息。

2). 使用变量接收数据,请求参数名与方法中行参名一致,代码如下:

@RequestMapping("verify2")  
public void handle2(String name,Integer age) {  
   System.out.println("参数name为:"+name+",年龄为"+age);  
}

3). 使用实体传参,要求前端传递的Content-Type为"application/x-www-form-urlencoded"时可用实体类型接收参数,要求请求中key与实体的属性名一致,代码如下:

@RequestMapping("verify3")  
public void handle2(UserVO user) {  
   System.out.println("参数name为:"+user.getName()+",年龄为"+user.getAge());  
}

4) 传递简单数据类型数组,使用get方法,params的参数名与方法中行参名一致,代码如下:

@RequestMapping("verify6")  
public void handle6(Integer[] ids){  
    String strIds="[";  
    for (Integer id:ids) {  
        strIds = strIds + id.toString()+",";  
    }  
   strIds = strIds.substring(0,strIds.length()-1) + "]";  
   System.out.println(strIds); 
}

5)@RequestParam注解符使用,请求参数名与方法中的行参名不一致时,这个注解符标注在参数前面,建立请求参数名与方法形参的映射关系。如:前端传递的参数为userName,控制器方法行参名为name,代码如下:

@RequestMapping("verify5")  
public void handle5(@RequestParam("userName") String name, Integer age){  
   System.out.println("参数name为:"+name+",年龄为"+age);  
}

6)使用json传参,要求前端传递的Content-Type为"application/json"时可用实体类型接收参数,要求请求中key与实体的属性名一致,此种传参数方式是传参的主流方式,代码如下:

@RequestMapping("verify4")  
public void handle4(@RequestBody UserVO user) {  
   System.out.println("参数name为:"+user.getName()+",年龄为"+user.getAge());   
}

7) 路径占位传参,Restful风格传递参数时,使用{}占位符和@PathVariable注解符。

/** 路径占位接收参数,名称相同 */  
@GetMapping("/user/{id}")  
public String index(@PathVariable Integer id) {  
    System.out.println(id);  
    return "index";  
}  
  
/** 路径占位接收参数,名称不同 */  
@GetMapping("/user/{id}")  
public String index(@PathVariable("id") Long userId) {  
    System.out.println(userId);  
    return "index";  
}

返回值

1)注解符@ResponseBody使用在方法上,表示此方法返回json格式的数据,代码如下:

@ResponseBody  
@RequestMapping("test06")  
public UserVO handle6(){  
    UserVO user = new UserVO();  
    user.setName("张小凡");  
    user.setAge(18);  
  
    return user;  
}

2)注解符@RestController注解类上,表示此控制器中所有的方法均返回json格式的数据,方法上不再使用@ResponseBody,代码如下:

@RestController  
@RequestMapping("restful")  
public class RestfulController {  
    @GetMapping("/user/{id}")  
    public String index(@PathVariable Integer id) {  
        System.out.println(id);  
        return "index";  
    }  
}