springMVC-请求响应

springmvc------一 站式web框架,核心是处理http请求响应。

前后端分离:需要序列化,服务端把数据序列化成字符串或者流给前端,前端又把json转成对象,前端的叫反序列化。前端把数据序列化转成字符串给服务器,服务器收到字符串转成对象。(转化为json字符串进行网络传输)

序列化:对象转字符串

反序列化:字符串转对象

@RequestMapping路径映射

路径位置通配符:多个都能匹配上,就精确优先

* : 匹配任意多个字符(0-n)不能匹配多个路径------使用/**解决

** :匹配任意多层路径

? : 匹配任意一个字符

精确程度:完全匹配------?------*------**

精确路径必须全局唯一

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

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

}

请求限定

请求方式:method

请求参数:params

请求头:headers

请求内容类型:consumes

响应内容类型:produces

java 复制代码
@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,封装文件对象

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

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

使用@RequestParam

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

java 复制代码
    /**
     * 默认一定要携带的参数,否则报错
     * 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";
    }

@PathVariable-路径变量

java 复制代码
    /**
     * @PathVariable路径变量标识-取路径id的值
     * @param id
     * @return
     */
    @RequestMapping("/handle/{id}")  //{id}路径变量,动态的
    public String handle08(@PathVariable Integer id)  {
            System.out.println("id:"+id);
        return "success";
    }

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

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

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

java 复制代码
/**
     *使用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对象

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

使用 MultipartFile封装文件对象

java 复制代码
    /**
     *例:前端发送表单数据,表单包含数据,和头像图片和生活照图片
     * 接受文件上传
     * @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> :响应头、响应体数据(文件下载)

java 复制代码
@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);
    }
}

日期处理

数据转换

反序列化:前端提交的日期字符串------>日期对象

序列化:日期对象------>日期字符串

默认的日期格式:xxxx-xx-05T06:46:58.000+00:00

解决方法:使用@JsonFormat注解(json转对象,对象转json)

java 复制代码
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date birthday;
相关推荐
喻米粒06222 小时前
RabbitMQ消息相关
java·jvm·spring boot·spring·spring cloud·sentinel·java-rabbitmq
mqiqe9 小时前
Spring MVC 页面跳转方案与区别
python·spring·mvc
Pasregret9 小时前
04-深入解析 Spring 事务管理原理及源码
java·数据库·后端·spring·oracle
Micro麦可乐9 小时前
最新Spring Security实战教程(七)方法级安全控制@PreAuthorize注解的灵活运用
java·spring boot·后端·spring·intellij-idea·spring security
翻滚吧键盘10 小时前
spring打包,打包错误
java·后端·spring
_Djhhh10 小时前
基于SpringAOP面向切面编程的一些实践(日志记录、权限控制、统一异常处理)
java·spring boot·spring·maven·sprint
星星不打輰11 小时前
Spring基于注解进行开发
java·spring
陈大爷(有低保)11 小时前
Spring中都用到了哪些设计模式
java·后端·spring
程序员 小柴11 小时前
SpringCloud概述
后端·spring·spring cloud
陈三一12 小时前
关于多数据源下Spring声明式事务管理失效问题的分析与解决
数据库·spring