• springMVC数据处理-请求,接收,乱码,json格式


    一:接收数据

    1. 请求的参数名称和接收的参数名一致
      请求:http://localhost:8080/hello?name=zhangsan
      接收参数:

      @RequestMapping("/hello")
      public String hello(String name){
          System.out.println(name);
          return "hello";
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5

      控制台输出:zhangsan

    2. 请求的参数名称和接收的参数名不一致
      请求:http://localhost:8080/hello?username=zhangsan
      接收参数:

      @RequestMapping("/hello")
      public String hello(@RequestParam("username") String name){
          System.out.println(name);
          return "hello";
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5

      控制台输出:zhangsan

    3. 请求的参数和用于接收参数对象的属性名一致
      实体类:

      public class User {
          private int id;
          private String name;
          private int age;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5

      请求:
      http://localhost:8080/user?name=zhangsan&id=1&age=15
      接收参数:

      @RequestMapping("/user")
      public String user(User user){
          System.out.println(user);
          return "hello";
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5

      控制台输出 : User { id=1, name=’zhangsan’, age=15 }

      如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null

    二:传递数据给前端

    1. 通过ModelAndView

      public ModelAndView testMode(){
              //返回一个模型视图对象
              ModelAndView mv = new ModelAndView();
              mv.addObject("msg","ControllerTest1");
              mv.setViewName("test");
              return mv;
          }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    2. 通过ModelMap

      @RequestMapping("/hello")
      public String hello(@RequestParam("username") String name, ModelMap model){
          //封装要显示到视图中的数据
          //相当于req.setAttribute("name",name);
          model.addAttribute("name",name);
          System.out.println(name);
          return "hello";
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    3. 通过Model

      @RequestMapping("/hello")
      public String hello(@RequestParam("username") String name, Model model){
          //封装要显示到视图中的数据
          //相当于req.setAttribute("name",name);
          model.addAttribute("msg",name);
          System.out.println(name);
          return "test";
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8

    区别:

    • Model 只有几个方法,只适合用于储存数据,继承了ModelMap
    • ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承了 LinkedMap 的方法和特性;
    • ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制视图层的跳转。

    三:中文乱码问题

    1. 方法一:SpringMVC自带过滤器CharacterEncodingFilter, 在web.xml中配置
      <filter>
          <filter-name>encoding</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>encoding</filter-name>
          <url-pattern>/*
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
    2. 方法二:修改tomcat配置文件,设置编码!
      <Connector URIEncoding="utf-8" port="8080" protocol="HTTP/1.1"
                 connectionTimeout="20000"
                 redirectPort="8443" />
      
      • 1
      • 2
      • 3
    3. 方法三:自定义过滤器
      package com.kuang.filter;
      import javax.servlet.*;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletRequestWrapper;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      import java.io.UnsupportedEncodingException;
      import java.util.Map;
      /**
       * 解决get和post请求 全部乱码的过滤器
       */
      public class GenericEncodingFilter implements Filter {
          @Override
          public void destroy() {
          }
          @Override
          public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
              //处理response的字符编码
              HttpServletResponse myResponse=(HttpServletResponse) response;
              myResponse.setContentType("text/html;charset=UTF-8");
              // 转型为与协议相关对象
              HttpServletRequest httpServletRequest = (HttpServletRequest) request;
              // 对request包装增强
              HttpServletRequest myrequest = new MyRequest(httpServletRequest);
              chain.doFilter(myrequest, response);
          }
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
          }
      }
      //自定义request对象,HttpServletRequest的包装类
      class MyRequest extends HttpServletRequestWrapper {
          private HttpServletRequest request;
          //是否编码的标记
          private boolean hasEncode;
          //定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰
          public MyRequest(HttpServletRequest request) {
              super(request);// super必须写
              this.request = request;
          }
          // 对需要增强方法 进行覆盖
          @Override
          public Map getParameterMap() {
              // 先获得请求方式
              String method = request.getMethod();
              if (method.equalsIgnoreCase("post")) {
                  // post请求
                  try {
                      // 处理post乱码
                      request.setCharacterEncoding("utf-8");
                      return request.getParameterMap();
                  } catch (UnsupportedEncodingException e) {
                      e.printStackTrace();
                  }
              } else if (method.equalsIgnoreCase("get")) {
                  // get请求
                  Map<String, String[]> parameterMap = request.getParameterMap();
                  if (!hasEncode) { // 确保get手动编码逻辑只运行一次
                      for (String parameterName : parameterMap.keySet()) {
                          String[] values = parameterMap.get(parameterName);
                          if (values != null) {
                              for (int i = 0; i < values.length; i++) {
                                  try {
                                      // 处理get乱码
                                      values[i] = new String(values[i]
                                              .getBytes("ISO-8859-1"), "utf-8");
                                  } catch (UnsupportedEncodingException e) {
                                      e.printStackTrace();
                                  }
                              }
                          }
                      }
                      hasEncode = true;
                  }
                  return parameterMap;
              }
              return super.getParameterMap();
          }
          //取一个值
          @Override
          public String getParameter(String name) {
              Map<String, String[]> parameterMap = getParameterMap();
              String[] values = parameterMap.get(name);
              if (values == null) {
                  return null;
              }
              return values[0]; // 取回参数的第一个值
          }
          //取所有值
          @Override
          public String[] getParameterValues(String name) {
              Map<String, String[]> parameterMap = getParameterMap();
              String[] values = parameterMap.get(name);
              return values;
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
      • 64
      • 65
      • 66
      • 67
      • 68
      • 69
      • 70
      • 71
      • 72
      • 73
      • 74
      • 75
      • 76
      • 77
      • 78
      • 79
      • 80
      • 81
      • 82
      • 83
      • 84
      • 85
      • 86
      • 87
      • 88
      • 89
      • 90
      • 91
      • 92
      • 93
      • 94
      • 95
      • 96

    四:json格式数据

    JSON 是 JavaScript 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串

    1.JavaScript 中对象与json转换

    var obj = {a: 'Hello', b: 'World'}; //这是一个对象,键名也是可以使用引号包裹的
    var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串
    
    • 1
    • 2

    JSON字符串转换为JavaScript 对象,使用 JSON.parse() 方法:

    var obj = JSON.parse('{"a": "Hello", "b": "World"}'); 
    //结果是 {a: 'Hello', b: 'World'}
    
    • 1
    • 2

    JavaScript 对象转换为JSON字符串,使用 JSON.stringify() 方法:

    var json = JSON.stringify({a: 'Hello', b: 'World'});
    //结果是 '{"a": "Hello", "b": "World"}'
    
    • 1
    • 2

    2.Java中json格式与对象转换

    jackson:

    引入jar包

    <dependency>
    	<groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.9</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ObjectMapper属性配置:

    //序列化所有属性,对象中属性为null的时候,会打印该属性为null
    objectMapper.setSerializationInclusion(Include.ALWAYS);
    //序列化时,对象中属性为null的时候,会忽略该属性
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    //取消时间的转化格式,默认是时间戳,可以取消,同时需要设置要表现的时间格式
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
    //时间格式设置默认为true,会显示时间戳
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);
    //美化输出,转换为格式化的json
    mapper.enable(SerializationFeature.INDENT_OUTPUT);  
    //强制JSON 空字符串("")转换为null对象值:
    mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT); 
    //允许序列化空的POJO类,否则序列化空对象是会抛出异常
    mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);  
    //在遇到未知属性的时候不抛出异常。
    mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); 
    //json中有新增的字段并且是实体类类中不存在的忽略
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
    //允许没有引号的字段名(非标准)出现。
    mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
    //允许单引号(非标准)
    mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
    //强制转义非ASCII字符
    mapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, true); 
    //如果是空对象的时候,不抛异常
    objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    常见ObjectMapper使用方法

    ObjectMapper mapper = new ObjectMapper();
    //对象转为字符串
    String jsonStr = mapper.writeValueAsString(Object);
    //对象转为byte数组
    byte[] byteArr = mapper.writeValueAsBytes(Object);
    //json字符串转为对象
    Object object= mapper.readValue(jsonStr, Object.class);
    //byte数组转为对象
    Object object= mapper.readValue(byteArr, Object .class);
    //字符串转list
    List<T> list= objectMapper.readValue(jsonStr, new TypeReference<List<T>>() {});
    //或
    List<T> list= mapper.readValue(jsonStr, List.class);
    //字符串转map
    Map<String, Object> map= mapper.readValue(jsonStr, Map.class);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    fastjson:

    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import com.kuang.pojo.User;
    import java.util.ArrayList;
    import java.util.List;
    public class FastJsonDemo {
        public static void main(String[] args) {
            //创建一个对象
            User user1 = new User("张三", 3, "男");
            User user2 = new User("李四", 3, "男");
            User user3 = new User("王五", 3, "男");
            User user4 = new User("小花", 3, "男");
            List<User> list = new ArrayList<User>();
            list.add(user1);
            list.add(user2);
            list.add(user3);
            list.add(user4);
            System.out.println("*******Java对象 转 JSON字符串*******");
            String str1 = JSON.toJSONString(list);
            System.out.println("JSON.toJSONString(list)==>"+str1);
            String str2 = JSON.toJSONString(user1);
            System.out.println("JSON.toJSONString(user1)==>"+str2);
            System.out.println("\n****** JSON字符串 转 Java对象*******");
            User jp_user1=JSON.parseObject(str2,User.class);
            System.out.println("JSON.parseObject(str2,User.class)==>"+jp_user1);
            System.out.println("\n****** Java对象 转 JSON对象 ******");
            JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2);
            System.out.println("(JSONObject) JSON.toJSON(user2)==>"+jsonObject1.getString("name"));
            System.out.println("\n****** JSON对象 转 Java对象 ******");
            User to_java_user = JSON.toJavaObject(jsonObject1, User.class);
            System.out.println("JSON.toJavaObject(jsonObject1, User.class)==>"+to_java_user);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
  • 相关阅读:
    【Python项目】过马路游戏
    minio文件服务器-docker docker-compose 搭建部署以及使用大全
    搭建Web环境、初识JSP
    tp5事务和加锁
    Go 使用kafka读写
    react跳转传参方式
    【Node.js】 第三章 http模块
    将十进制转化成其他进制‘支持2-16进制(C语言)昨天码完忘发了,呜呜呜
    【CSS】选择器优先级,值与单位
    408-2013
  • 原文地址:https://blog.csdn.net/qq_41863697/article/details/127836740