每一年都奔走在自己热爱里

没有人是一座孤岛,总有谁爱着你

SpringMVC学习笔记(二)-参数与返回值

SpringMVC学习笔记(二)-参数与返回值

控制器方法参数
  • 在控制器中可以包含以下四类参数。参数由系统自动赋值

    • HttpServletRequest
    • HttpServletResponse
    • HttpSession
    • 请求中携带的参数
  • 参数乱码的过滤器设置

    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <!--设置项目使用的字符编码-->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <!--强制请求使用encoding的编码方式-->
        <init-param>
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <!--拦截所有请求-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
逐个接收
  • 保证请求参数名与控制器方法参数名相同即可
  • 框架使用request.getParameter("xxxx")接收参数
  • 前端控制器调用对应的控制器方法将接受的参数值赋予对应的形参
  • 框架自动转换数据类型
  • 面临的问题:
    • 参数数据为空,使用包装类型
    • 请求参数名与形参名不一致:
      • 解决办法:@RequestPram,value属性设置为请求中的参数名,放置在形参前
      • 此注解存在属性:boolean required() default true,默认必须存在对应的请求参数
对象接收
  • 保证请求参数名与对象属性名一致
  • 对象对应的类需要有无参构造方法及属性对应的set方法
    • 框架在处理时会调用对象的类的无参构造方法创建对象,之后调用对应属性的set方法进行赋值
  • 此时无法再使用@RequestParameter注解
控制器方法的返回值
  • 控制器方法的返回值表示返回处理的结果,包含:

    • ModelAndView:处理结果既有数据又有视图
    • String:返回的处理结果只有视图,执行转发操作,可以为完整视图路径或视图逻辑名称
    • void
    • Object
  • void

    • 无直接返回处理结果,可用于AJAX请求的处理

    • Maven配置

      • <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.11.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.11.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.11.3</version>
        
      ```
    • 传统的json数据处理

      • objectMapper om = new ObjectMapper();
        String json = om.writerValueAsString(xxx);
        response.setContentType("application/json;charset=utf-8");
        PrintWriter pw = response.getWriter();
        pw.println(json);
        pw.flush();
        

      pw.close();
      ```

  • Object

    • 返回对象为数据,用于响应AJAX请求,可以是List、Map、Intdege... ...

    • HttpMessageConverter接口,作用:

      • 实现请求数据转换为java对象
        • boolean canRead(Class<?> clazz,MediaType mediaType);方法检查clazz对象能否转为mediaType格式,MediaType类比于MINI
        • T read(Class<? extends T> clazz, HttpInputMessage inputMessage);方法接收请求中的数据,转换为clazz对应的对象
      • 将对象转为json或其他数据格式
        • boolean canWrite(Class<?> clazz, MediaType mediaType);
        • void write(T t, MediaType contentType, HttpOutputMessage outputMessage)
      • 实现类:
        • MappingJackson2HttpMessageConverter:使用jackson工具库的objectmapper把java对象转为json数据格式
        • StringHttpMessageConverter:将字符串类型的数据进行格式转换和编码
    • 框架根据控制器方法的返回值类型,自动查找使用的实现类

    • 默认情况下SpringMVC使用了HttpMessageConverter接口的4个实现类,包括StringHttpMessageConverter,但是不包括MappingJackson2HttpMessageConverter

    • 在SpringMVC的配置文件中加入注解驱动<mvc:annotation-driven/>标签后,SpringMVC会创建HttpMessageConverter接口的七个实现类

    • @ResponseBody

      • 将转换为json数据的java对象通过HttpServletResponse输出到浏览器,功能是输出

      • 可以区分返回值String是视图还是数据,此时返回到浏览器的是文本数据,此时响应头Content-Type为text/plain;charset=ISO-8859-1,使用StringHttpMessageConverter处理的,解决办法:

        • 设置 @RequestMapping的produces属性

    • 框架的处理流程:

      • 框架根据控制器方法的返回值类型,使用HttpMessageConverter接口的实现类MappingJackson2HttpMessageConverter

      • 使用MappingJackson2HttpMessageConverter的write()方法将java对象转换为json数据格式,此时设置了媒体的类型及编码方式

      • 框架使用@ResponseBody注解将转化的json数据输出到浏览器

        @RequestMapping(path = "/findById")
        @ResponseBody
        public Product findById(int id){
            return productService.findById(id);
        }
        
posted @ 2020-12-13 14:15  雨下整夜~  阅读(118)  评论(0)    收藏  举报