数据响应
  • 页面跳转

    • 直接返回字符串

      @RequestMappng("/quick")
      public String quickMethod() {
          return "index";
      }
      

      与spring-mvc的视图解析器前缀、后缀拼接

      <property name="prefix" value="/WEB-INF/views/"/>
      <property name="suffix" value=".jsp"/>
      

      转发资源地址:/WEB-INF/views/index.jsp

    • 通过ModelAndView对象返回

      UserController

      @RequestMappng(value="/quick2")
      public ModelAndView save2() {
          /**
           * Model 封装数据
           * View  展示数据
           */
          ModelAndView modelAndView = new ModelAndView();
          // 设置数据
          modelAndView.addObject("username", "mkl");
          // 设置视图
          modelAndView.setViewName("success")
          return modelAndView
      }
      
      • 自动注入 ModelAndView

        SpringMVC会自动注入ModelAndView在需要的时候
        UserController

        @RequestMappng(value="/quick3")
        public ModelAndView save3(ModelAndView modelAndView) {
            modelAndView.addObject("username", "mkl");
            modelAndView.setViewName("success")
            return modelAndView
        }
        
      • 拆分Model和View

        UserController

        @RequestMappng(value="/quick4")
        public Model save4(Model model) {
            model.addAttribute("username", "miaokela")
            return "success";
        }
        
      • 通过Request域对象

        UserController

        @RequestMappng(value="/quick5")
        public Model save5(HttpServletRequest request) {
            request.addAttribute("username", "miaokela")
            return "success";
        }
        
  • 回写数据

    • 直接返回字符串

      @RequestMappng(value="/quick6")
      public Model save6(HttpServletResponse response) throws IOException {
          response.getWriter().print("hello world");
      }
      
      • 告知SpringMVC 不进行视图跳转 直接进行数据响应
        @RequestMappng(value="/quick7")
        @ResponseBody
        public String save7() throws IOException {
            return "hello world";
        }
        
      • 返回json字符串

        导入坐标: jackson-core、jackson-databind、jackson-annotations

        @RequestMappng(value="/quick8")
        @ResponseBody
        public String save8() throws IOException {
            User user = new User();
            user.setUsername("mkl");
            user.setAge(20);   
            // 使用json转换工具
            ObjectMapper objectMapper = new ObjectMapper();
            String json = objectMapper.writeValueAsString(user);
            return json;
        }
        
    • 返回对象或集合

      @RequestMappng(value="/quick9")
      @ResponseBody
      public User save9() throws IOException {
          User user = new User();
          user.setUsername("mkl");
          user.setAge(20);   
          return user;
      }
      

      配置处理器映射器 告诉SpringMVC返回对象或集合时使用json转换工具
      spring-mvc.xml

      <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
          <property name="messageConverters">
              <list>
                  <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
              </list>
          </property>
      </bean>
      
      • 通过mvc注解驱动代替上面的配置

        spring-mvc.xml

        <mvc:annotation-driven/>
        

        解释

        处理器映射器、处理器适配器、视图解析器是SpringMVC的三大组件
        <mvc:annotation-driven>会自动加载上面三个组件,不需要手动配置
        默认底层就会集成jackson进行对象或者集合的json格式字符串转换
        
请求数据
  • 请求参数

    SpringMVC可以接受如下类型参数

    基本类型参数
    POJO类型参数
    数组类型参数
    集合类型参数
    
    • 基本类型参数

      参数名称与请求参数名称一致,参数值会自动映射匹配
      ?username=miaokela&age=20

      @RequestMappng(value="/quick10")
      @ResponseBody
      public void save10(String username, int age) throws IOException {
          System.out.println(username);
          System.out.println(age);
      }
      
    • POJO类型参数

      POJO参数的属性名和请求参数名一致,参数值会自动映射匹配

      public class User {
          private String username;
          private int age;
          // getter/setter
      }
      
      @RequestMappng(value="/quick11")
      @ResponseBody
      public void save11(User user) throws IOException {
          System.out.println(user);
      }
      
    • 数组类型参数

      业务方法数组名称和请求参数名一致,参数值会自动映射匹配
      ?strs=111&strs=222&strs=333

      @RequestMappng(value="/quick11")
      @ResponseBody
      public void save11(String[] strs) throws IOException {
          System.out.println(Arrays.asList(strs));
      }
      
    • 集合类型参数

      获取集合参数时,需要将集合参数包装到一个POJO中才可以

      public class VO {
          private List<User> userList;
          // getter/setter
          // toString()
      }
      
      @RequestMappng(value="/quick12")
      @ResponseBody
      public void save12(VO vo) throws IOException {
          System.out.println(vo)
      }
      
      • 指定Content-Type为json形式

        方法参数位置使用@RequestBody可以直接接收集合,不需要POJO进行包装

        @RequestMappng(value="/quick13")
        @ResponseBody
        public void save13(@RequestBody List<User> userList) throws IOException {
            System.out.println(userList)
        }
        
      • 开放资源访问权限

        spring-mvc.xml

        <mvc:resources mapping="/js/**" location="/js/"/>
        <mvc:resources mapping="/img/**" location="/img/"/>
        

        或者,让tomcat去找静态资源

        <mvc:default-servlet-handler/>
        
    • 请求数据乱码问题

      配置全局编码过滤filter
      web.xml

      <filter>
          <filter-name></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>
      </filter>
      <filter-mapping>
          <filter-name>CharacterEncodingFilter</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>
      
    • 参数绑定注解 @RequestParam

      请求参数名称与Controller业务方法参数名称不一致时,需要通过@RequestParam注解显示的绑定

      @RequestMappng(value="/quick14")
      @ResponseBody
      public void save14(@RequestParam("name") String username) throws IOException {
          System.out.println(userList)
      }
      
      • @RequestParam 其他参数
        • value
        • required

          设置参数必须传递

          @RequestMappng(value="/quick15")
          @ResponseBody
          public void save15(@RequestParam(value="name", required=false) String username) throws IOException {
              System.out.println(userList)
          }
          
        • defaultValue

          设置参数

          @RequestMappng(value="/quick15")
          @ResponseBody
          public void save15(@RequestParam(value="name", required=false, defaultValue="mkl") String username) throws IOException {
              System.out.println(userList)
          }
          
    • Restful风格参数

      • 路径参数传递
        @RequestMappng(value="/quick15/{username}")
        @ResponseBody
        public void save15(@PathVariable(value="username") String username) throws IOException {
            System.out.println(userList)
        }
        
    • 自定义类型转化器

      SpringMVC默认提供了一些常用的类型转换器
      但是不是所有类型都提供了类型转换器,比如日期类型就需要自定义转换器

      • 步骤

        1.定义转换器类实现Converter接口
        2.在配置文件中声明转换器
        3.在<annotation-driven>中引用转换器
        
      • 实践

        请求: ?date=2020/10/20
        UserController

        @RequestMappng(value="/quick16")
        @ResponseBody
        public void save16(Data date) throws IOException {
            System.out.println(date)
        }
        
        • 转换器接口
          public class DateConverter implements Converter<String, Date> {
              public Date convert(String dataStr) {
                  // 将日期字符串转换成日期对象返回
                  SimpleDateFormat format = new SimpleDateFormat("yyy-MM-dd");
                  Data data = null;
                  try {
                      date = format.parse(dateStr)
                  } catch (ParseException e) {
                      e.printStackTrace();
                  }
                  return date;
              }
          }
          
        • 声明转换器

          spring-mvc.xml

          <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
               <property name="converters">
                  <list>
                      <bean class="com.miaokela.converter.DateConverter"></bean>
                  </list>
               </property>
          </bean>
          
          <!-- 引用转换器 -->
          <mvc:annotation-driven conversion-service="conversionService"/>
          
  • 请求头

    • @RequestHeader

      value: 请求头名称
      required: 是否必须携带请求头
      
      • 示例
        @RequestMappng(value="/quick17")
        @ResponseBody
        public void save17(@RequestHeader(value="User-Agent", required=false) String headerValue) throws IOException {
            System.out.println(headerValue)
        }
        
    • @CookieValue

      value: 指定cookie名称
      required: 是否必须携带cookie

      - 示例
          ```java
          @RequestMappng(value="/quick18")
          @ResponseBody
          public void save18(@CookieValue(value="JESESSOINID", required=false) String jesessionid) throws IOException {
              System.out.println(jesessionid)
          }
          ```
      
posted on 2022-09-20 10:57  _tiny_coder  阅读(17)  评论(0编辑  收藏  举报