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;
相关推荐
趁你还年轻_2 小时前
Spring 官方推荐构造函数注入
java·spring·log4j
努力的小郑2 小时前
BeanFactory与ApplicationContext全面指南与实战
spring boot·spring
IT-ZXT8883 小时前
Spring 框架之IOC容器加载重要组件
java·后端·spring
ademen6 小时前
spring4第7-8课-AOP的5种通知类型+切点定义详解+执行顺序
java·spring
努力的小郑6 小时前
BeanFactory与FactoryBean,别再傻傻分不清!(SpringBoot版)
spring
趁你还年轻_7 小时前
Spring之事务管理方式
spring
武子康8 小时前
Java-39 深入浅出 Spring - AOP切面增强 核心概念 通知类型 XML+注解方式 附代码
xml·java·大数据·开发语言·后端·spring
ademen10 小时前
spring4第6课-bean之间的关系+bean的作用范围
java·spring
clk660713 小时前
SSM 框架核心知识详解(Spring + SpringMVC + MyBatis)
java·spring·mybatis
椰椰椰耶18 小时前
[网页五子棋][匹配模块]实现胜负判定,处理玩家掉线
java·开发语言·spring boot·websocket·spring