当前位置: 首页 > article >正文

springMVC-请求响应

springmvc——一 站式web框架,核心是处理http请求响应。
前后端分离:需要序列化,服务端把数据序列化成字符串或者流给前端,前端又把json转成对象,前端的叫反序列化。前端把数据序列化转成字符串给服务器,服务器收到字符串转成对象。(转化为json字符串进行网络传输)
序列化:对象转字符串
反序列化:字符串转对象

@RequestMapping路径映射

路径位置通配符:多个都能匹配上,就精确优先
    * : 匹配任意多个字符(0-n)不能匹配多个路径——使用/**解决
   ** :匹配任意多层路径
    ? : 匹配任意一个字符
     精确程度:完全匹配——?——*——**
     精确路径必须全局唯一

/**
 * //@RestController(处理请求和响应数据)<——@Controller、@ResponseBody
 * @ResponseBody:(告诉spring,把返回的内容写到响应体中,每次请求进来执行目标方法)
 */
@RestController
public class HelloController {

     * @return
     */
    @RequestMapping("/hello")
    public String hello(){
        return "Hello spring MVC 你好!";
    }

}

请求限定

   请求方式:method
   请求参数:params
   请求头:headers
   请求内容类型:consumes
   响应内容类型:produces

@RestController
public class HelloController {

/**
 * 限定请求方式-接收post请求
 *     GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS,TRACE;
  */
    @RequestMapping(value = "/test01",method = RequestMethod.POST)
    public String test01(){
        return "Hello spring MVC 你好!";
    }

    /**
     *限定请求参数-接收参数请求
     *  name:表示必须包含name=username参数 (http://localhost:8080/test02?name=username)
      */
    @RequestMapping(value = "/test02",params ={ "name=username"})
    public String test02(){
        return "Hello spring MVC 你好!";
    }

    /**
     * 限定请求头-接收请求头请求
     * accept:表示必须包含请求头Accept
     * @return
     */
    @RequestMapping(value = "/test03",headers = {"Accept"})
    public String test03(){
        return "Hello spring MVC test03";
    }

    /**
     * 请求内容类型-接收请求内容类型请求
     * application/json:表示浏览器必须携带json格式数据。
     */
    @RequestMapping(value = "/test04",consumes = {"application/json"})
    public String test04(){
        return "Hello spring MVC test04";
    }

    /**
     * 响应内容类型
     * text/html;charset=UTF-8:生产html页面
     * @return
     */
    @RequestMapping(value = "/test05",produces = {"text/html;charset=UTF-8"})
    public String test05(){
        return "<h1>hello</h1>";
    }
}

请求处理

~使用普通变量,收集请求参数

~使用@RequestParam

~使用POJO,统一封装多个参数

~@CookieValue获取Cookie数据

~使用POJO,级联封装复杂对象

~使用@RequestBody,封装JSON对象

~使用@RequestPart/@RequestParam,封装文件对象

使用普通变量,收集请求参数

    /**
     *请求参数-使用普通变量
     * 要求:变量名和参数名保持一致
     */
    @RequestMapping("/handle01")
    public String handle01(String username, String password) {
        System.out.println("username"+username+",password:"+password);
        return "success";
    }

使用@RequestParam

@RequestParam():取出某个请求参数的值,请求参数可以和变量名不一致。

    /**
     * 默认一定要携带的参数,否则报错
     * required = false:可以不携带//默认为true
     * defaultValue:默认值,参数可以不带
     * 无论请求参数是来自请求体还是url?后面,都可以取到(请求参数)
     * @return
     */
    @RequestMapping("/handle02")
    public String handle02(@RequestParam("username") String name,
                           @RequestParam(value = "password", defaultValue = "123456")String pwd,
                           @RequestParam("phone")String phone,
                           @RequestParam(value="agreement",required = false)boolean agree)  {
        System.out.println("username"+name+",password:"+pwd+",cellphone:"+phone+",agreement:"+agree);
        return "success";
    }

使用POJO,统一封装多个参数

/**
     *请求参数-pojo统一封装参数
     * 自动把请求参数和pojo属性进行匹配
     * 效果:pojo的所有属性值都来自请求参数
     * @return
     */
    @RequestMapping("/handle03")
    public String handle03(Person person) {
        System.out.println(person);
        return "success";
    }

使用POJO,级联封装复杂对象

/**
     *使用pojo级联封装复杂属性
     * 属性套属性,对象套对象
     * 例如:①address属性中有三个属性,可以把address当成对象。
     *     ②前端传过来的属性能选多个,可以封装成数组。
     * @Data
     * public class Person {
     *     private String username;
     *     private Address address;
     *     private String[] hobby;
     * }
     * @Data
     * class Address{
     *     private String province;
     *     private String city;
     * }
     * @return
     */
    @RequestMapping("/handle06")
    public String handle05(Person person)  {
        System.out.println(person);
        return "success";
    }

使用@RequestBody,封装JSON对象

 /**
     * 接受json数据
     * @RequestBody 获取请求体的json数据,自动转为person对象(反序列化)
     * 发出:请求体是json字符串,不是key=value
     * @return
     */
    @RequestMapping("/handle07")
    public String handle06(@RequestBody Person person)  {
        System.out.println(person);
        return "success";
    }

使用MultipartFile封装文件对象

    /**
     *例:前端发送表单数据,表单包含数据,和头像图片和生活照图片
     * 接受文件上传
     * @RequestParam取出文件项(前端参数名称),封装到MultipartFile,就可以拿到文件内容
     * @param person
     * @return
     */
    @RequestMapping("/handle08")
    public String handle07(Person person, @RequestParam("headerImage") MultipartFile headerImgFile,
                           @RequestParam("lifeImage") MultipartFile[] lifeImgFiles) throws IOException {
        //1、获取原始文件名
        String originalFilename = headerImgFile.getOriginalFilename();
        //2、文件保存
        headerImgFile.transferTo(new File("E:\\img\\" + originalFilename));
//        以上处理了头像,下面处理多个生活照
        if (lifeImgFiles.length > 0) {
            for (MultipartFile imgFile : lifeImgFiles) {
                imgFile.transferTo(new File("E:\\img\\" + imgFile.getOriginalFilename()));
            }
            System.out.println("=======生活照保存结束==========");
        }
        System.out.println(person);
        //文件大小
        long size = headerImgFile.getSize();
        //获取文件流
        InputStream inputStream = headerImgFile.getInputStream();
        return "success";
    }

响应处理

1.@ResponseBody+对象:响应json等非页面数据

2.ResponseEntity<B> :响应头、响应体数据(文件下载)

@RestController
public class ResponseTestController {

    /**
     * 会自动返回的对象转为json
     * @return
     */
    @RequestMapping("/resp01")
    public Person resp01() {
        Person person = new Person();
        return person;
    }

    /**
     * 文件下载
     *  HttpEntity,拿到整个请求数据
     *  ResponseEntity,拿到整个响应数据(响应头,响应体,状态码)
     *  可以用作文件下载模板-只需要修改文件下载位置和文件名即可。
     * @return
     */
    @RequestMapping("/download")
    public ResponseEntity<InputStreamResource> download() throws Exception {

        FileInputStream fileInputStream = new FileInputStream("E:\\photo.png");

//       一口气读会溢出  所以使用分段读- InputStreamResource
//        byte[] bytes = fileInputStream.readAllBytes();

//      文件名中文乱码-解决乱码问题
        String encode = URLEncoder.encode("1.jpg", "UTF-8");
//        解决文件太大会内存溢出问题
        InputStreamResource resource = new InputStreamResource(fileInputStream);

        return ResponseEntity.ok()
//                内容类型,流
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
//                内容大小
                .contentLength(fileInputStream.available())
//                Content-Disposition:内容处理方式
                .header("Content-Disposition","attachment;filename="+encode)
                .body(resource);
    }
}


http://www.kler.cn/a/452315.html

相关文章:

  • Linux -- 互斥的底层实现
  • 【Linux】centos7安装php7.4
  • RK3506开发板:智能硬件领域的新选择,带来卓越性能与低功耗
  • Kubernetes(k8s)离线部署DolphinScheduler3.2.2
  • EMS(energy managment system)从0到1
  • 全面掌握 AutoGluon:从入门到生产环境的实践指南
  • 【数学建模】利用Matlab绘图(2)
  • linux 常用 Linux 命令指南
  • Linux大数据方向shell
  • 借助Aspose.html控件, 使用 Java 编程将 HTML 转换为 BMP
  • 基于java出租车计价器设计与实现【源码+文档+部署讲解】
  • ffmpeg之播放一个yuv视频
  • 常见问题解决方案:Keen CommonWeb 开源项目
  • CVPR-2024 | 具身导航模型大一统!NaviLLM:学习迈向具身导航的通用模型
  • Unity中如何修改Sprite的渲染网格
  • NFC 碰一碰发视频源码搭建技术详解,支持OEM
  • 从零用java实现 小红书 springboot vue uniapp (6)用户登录鉴权及发布笔记
  • 【Trick】解决服务器cuda报错——RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED
  • 前端三大主流框架:React、Vue、Angular
  • 网络管理-期末项目(附源码)
  • PySide6如何实现点击TableWidget列表头在该列右侧显示列表选择框筛选列数据
  • 数据仓库是什么?数据仓库简介
  • 设计一个自己的AI Agent
  • .NET 9 中的 多级缓存 HybridCache
  • Android绘图Path基于LinearGradient线性动画渐变,Kotlin(2)
  • HarmonyOS NEXT 实战之元服务:静态案例效果---电台推荐