目录
一、springmvc接受请求
@RequestMapping
@GetMapping
@PostMapping
二、springmvc接收数据
2.1接收参数
2.1.1方式一、原生 HttpServletRequest 接收数据
2.1.2方式二:通过参数名称接收
2.1.3方式三、参数名称不一致时
2.1.4方式四、通过对象接收数据
2.1.5 方法五、restful风格接收
2.1.6常见的错误类型
2.3请求头中数据
2.4接受其他controller转发的数据
三、前后端分离---返回数据给前端
统一返回数据格式
四、springmvc内部执行流程
五、各种常见错误及解决方案
面试
1、接收请求的方式
2、接收数据
参数
3、返回数据给前端 R
4、各种常见的错误及解决方案
一、springmvc接受请求
@RequestMapping
/*url: http://localhost:8080/user/save@RequestMapping:默认情况下,接收任意类型请求限制只能接收特定请求 method = RequestMethod.GET 只接收get请求method = RequestMethod.GET|POST|PUT|DELETE*/@RequestMapping(value = {"/save1","/save2","/save"},method = RequestMethod.GET)public void save(){System.out.println("save");}
@GetMapping
//get 请求默认访问方法@GetMappingpublic String welcome(){System.out.println("welcome");return "welcome!";}
@PostMapping
package com.hl.springmvc02.web;import jdk.nashorn.internal.objects.annotations.Getter;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/user")
public class UserController {//post请求执行的默认方法@PostMappingpublic String welcome2(){System.out.println("welcome2");return "welcome2!";}}
二、springmvc接收数据
2.1接收参数
2.1.1方式一、原生 HttpServletRequest 接收数据
/*接收数据方式一、原生 HttpServletRequest 接收数据*/@RequestMapping("/save")public String save(HttpServletRequest request){//接收参数 返回值只能是字符串类型String name = request.getParameter("name");String id = request.getParameter("id");//类型转换时,需要手动转换if(id !=null && id!=""){System.out.println(Integer.parseInt(id));}return "save!"+id+"---"+name;}
2.1.2方式二:通过参数名称接收
/*方式二:通过参数名称接收 要求 url后传递的参数名和方法的形参名保持一致http://localhost:8080/product/save2?id=11&name=admin尽可能使用包装类,而不是基本数据数据类型*///Integer是对象 允许为null@RequestMapping("/save2")public String save2(Integer id,String name){return "save!"+id+"--"+name;}//int是基本类型 不可以为null@RequestMapping("/save3")public String save3(int id,String name){return "save!"+id+"--"+name;}
2.1.3方式三、参数名称不一致时
/*方式三、参数名称不一致时 @RequestParam(name = "username") 参数映射1、限制是否允许为空 @RequestParam 默认不允许为空@RequestParam(required = false)required = false 是否允许为空2、是否给默认值 @RequestParam(defaultValue = "12345")*/@RequestMapping("/save4")public String save4(@RequestParam(defaultValue = "12345",required = false) Integer id,@RequestParam(name = "username") String name){return id+"---"+name;}
2.1.4方式四、通过对象接收数据
/*方式四、通过对象接收数据 (当前端传递的参数名和对象的属性名保持一致时)http://locahost:8080/product/save5?id=12&name=admin*/@RequestMapping("save5")public Product save5(Product product,String name1){System.out.println(name1);return product;}
2.1.5 方法五、restful风格接收
/*方法五、restful风格接收(@PathVariable 地址栏传参)http://localhost:8080/product/save6/1/admin微服务中推荐的模式*/@RequestMapping("/save6/{id1}/{name}")public Product save6(@PathVariable(name = "id1") Integer id,@PathVariable(required = false) String name){System.out.println(id+"---"+name);return new Product(id,name);}
2.1.6常见的错误类型
/*常见错误类型:404:路径未找到 http://localhost:8080/product/save4405: 方法不匹配 前端get ----> 服务端@PostMapping @RequestMapping(method="")400: 参数赋值错误前端id=abc 服务端:Integer id前端没有传递id null 服务端 int id null--->int 报错前端id没有传值 服务端 @RequestParam(required=true) Integer id500: 服务端错误1、接收到请求了2、接收到数据3、方法体报错*/
2.2cookie数据
/*cookie传递数据@CookieValue 从cookie中获取数据,根据key找到value*/
@RequestMapping("/cookie")
public String getCookie(@CookieValue(name = "username",required = false)String username){return username;
}
2.3请求头中数据
@RestController
@RequestMapping("/order")
public class OrderController {/*@RequestHeader(name = "user-agent") String userAgent获取浏览器请求头中特定key对应的value*/@RequestMapping("/header")public String header(@RequestHeader(name = "user-Agent") String userAgent,@RequestHeader(name = "token",required = false) String token){return userAgent+"---"+token;}
}
2.4接受其他controller转发的数据
package com.hl.springmvc02.web;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;@Controller
@RequestMapping("/s1")
public class DispatcherController {@RequestMapping("/getMsg")public String getMsg(HttpServletRequest request){System.out.println("getMsg......");//获取浏览器传递的参数String msg = request.getParameter("msg");//一次转发过程中携带数据(传递数据)request.setAttribute("msg1","hello world!");//转发到其他的controller方法return "/s1/getData";}@RequestMapping("/getData")public String getData(HttpServletRequest request,@RequestAttribute(required = false) String msg1){System.out.println("getData......");//获取request转发携带的数据System.out.println(request.getAttribute("msg1"));System.out.println("--注解获取--"+msg1);//转发到页面return "/index.html";}
}
三、前后端分离---返回数据给前端
统一返回数据格式
/*
R ---> 结果集对象(响应对象)
统一封装 服务端返回给前端的数据*/
@Data
public class R {private Integer code;//状态码private String msg;//描述信息private Object data;//传递的数据//成功的方法public static R ok() {return new R(200,"操作成功",null);}//成功的方法public static R ok(Object data) {return new R(200,"操作成功",data);}//成功的方法public static R ok(String msg ,Object data) {return new R(200,msg,data);}//失败的方法public static R fail(String msg) {return new R(201,msg,null);}public R(Integer code, String msg, Object data) {this.code = code;this.msg = msg;this.data = data;}public R() {}
}
@RestController
@RequestMapping("/response")
public class ResponseController {@RequestMapping("/data")public R data(){return R.ok();}@RequestMapping("/data2")public R data2(){return R.ok("xiaowu");}@RequestMapping("/data3")public R data3(){return R.ok("请求成功","xiaowu");}@RequestMapping("/data4")public R data4(){return R.fail("用户名已存在!");}
}
四、springmvc内部执行流程
五、各种常见错误及解决方案
/*
常见错误类型:
404:路径未找到 http://localhost:8080/product/save4
405: 方法不匹配 前端get ----> 服务端@PostMapping @RequestMapping(method="")
400: 参数赋值错误前端id=abc 服务端:Integer id前端没有传递id null 服务端 int id null--->int 报错前端id没有传值 服务端 @RequestParam(required=true) Integer id
500: 服务端错误1、接收到请求了2、接收到数据3、方法体报错*/
面试
1、接收请求的方式
@RequestMapping ,@GetMapping,@PostMapping 区别
@RequestMapping:默认情况下,接收任意类型请求
限制只能接收特定请求 method = RequestMethod.GET 只接收get请求
method = RequestMethod.GET|POST|PUT|DELETE
注解 | 作用 | 示例 | 特点 |
---|---|---|---|
@RequestMapping | 通用请求映射,可指定 method | @RequestMapping("/user") @RequestMapping(value="/save", method=RequestMethod.POST) | 支持所有 HTTP 方法(GET/POST/PUT/DELETE),但需要手动指定 method |
@GetMapping | 仅处理 GET 请求 | @GetMapping("/user/{id}") | 等同于 @RequestMapping(method=RequestMethod.GET) |
@PostMapping | 仅处理 POST 请求 | @PostMapping("/user") | 等同于 @RequestMapping(method=RequestMethod.POST) |
@PutMapping | 仅处理 PUT 请求 | @PutMapping("/user/{id}") | 适用于更新操作 |
@DeleteMapping | 仅处理 DELETE 请求 | @DeleteMapping("/user/{id}") | 适用于删除操作 |
2、接收数据
参数、请求头、cookie、接收其他controller转发的数据
@RequestBody 注解(没讲 ,接收前端传递的json数据)
参数
//方式一 原生HttpservletRequest@RequestMapping("/save")public String save(HttpServletRequest request) {//接收参数String name = request.getParameter("name");String id = request.getParameter("id");//类型转换时 需要手动转换if(id != null || !id.isEmpty()) {System.out.println(Integer.parseInt(id));}return "save"+id+"--"+name;}//方式二 通过参数名称接受 尽量使用包装类//Integer是对象 允许为null@RequestMapping("/save2")public String save2(Integer id, String name) {return "save2!"+id+"--"+name;}//int是基本类型 不可以为null@RequestMapping("/save3")public String save3(int id, String name) {return "save3!"+id+"--"+name;}//方式三 参数名称不一致时@RequestMapping("/save4")public String save4(@RequestParam(defaultValue = "12345",required = false) Integer id,@RequestParam(name = "qname") String name) {return "save4!"+id+"--"+name;}//方式四 通过对象传递数据@RequestMapping("/save5")public Product save5(Product product, String name){System.out.println(name);return product;}//方式五 restful风格接收 @PathVariable 地址栏传参@RequestMapping("/save6/{id1}/{name}")public Product save6(@PathVariable(name="id1") Integer id,@PathVariable(required = false) String name){System.out.println(id+"----"+name);return new Product(id,name);}
其余见上
3、返回数据给前端 R
code | msg | data
见上
4、各种常见的错误及解决方案
常见错误类型:
404:路径未找到 http://localhost:8080/product/save4
405: 方法不匹配 前端get ----> 服务端@PostMapping @RequestMapping(method="")
400: 参数赋值错误
前端id=abc 服务端:Integer id
前端没有传递id null 服务端 int id null--->int 报错
前端id没有传值 服务端 @RequestParam(required=true) Integer id
500: 服务端错误
1、接收到请求了
2、接收到数据
3、方法体报错
错误码 | 主要原因 | 解决方案 | 示例场景 |
---|---|---|---|
404 | 1. URL路径错误 2. 控制器未加载 | 1. 检查@RequestMapping 路径2. 确认类有 @RestController 注解 | 错误示例:/produkt/list (拼写错误)正确示例: /product/list |
405 | HTTP方法不匹配 | 1. 统一前后端方法 2. 使用 @GetMapping /@PostMapping 明确指定 | 前端:GET /api/user 后端: @PostMapping("/api/user") |
400 | 1. 类型转换失败 2. 必填参数缺失 | 1. 使用包装类Integer 2. 添加 @RequestParam(required=false) | id=abc 传给int id 未传 @RequestParam(required=true) Integer id |
500 | 服务端代码异常 | 1. 添加try-catch 2. 使用 @ControllerAdvice 全局处理 | userService.findById(null) (空指针异常) |
415 | 媒体类型不支持 | 1. 添加@RequestBody 2. 设置 Content-Type: application/json | 前端发送JSON但未加@RequestBody |
401 | 未授权访问 | 1. 检查Token有效性 2. 配置Spring Security白名单 | 访问/admin 接口未携带Token |