springmvc02

#新星杯·14天创作挑战营·第11期#

目录

一、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.2cookie数据

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 请求默认访问方法
    @GetMapping
    public 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请求执行的默认方法
    @PostMapping
    public 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/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、方法体报错
     */

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、方法体报错

错误码主要原因解决方案示例场景
4041. URL路径错误
2. 控制器未加载
1. 检查@RequestMapping路径
2. 确认类有@RestController注解
错误示例:
/produkt/list(拼写错误)
正确示例:
/product/list
405HTTP方法不匹配1. 统一前后端方法
2. 使用@GetMapping/@PostMapping明确指定
前端:GET /api/user
后端:@PostMapping("/api/user")
4001. 类型转换失败
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值