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