美文网首页Ping说SSM
SpringMVC之数据处理

SpringMVC之数据处理

作者: Ping开源 | 来源:发表于2021-07-14 00:07 被阅读0次

    六、数据处理

    目录:处理提交数据、数据显示到前端、乱码问题

    1.处理提交数据

    1)提交的域名称和处理方法的参数名一致。
    提交数据http://localhost:8080/hello?name=ping
    处理方法

    @RequestMapping("/hello") 
    public String hello(String name){ 
      System.out.println(name); 
      return "hello"; 
    }
    

    后台输出:ping
    2)提交的域名称和处理方法的参数名不一致。
    提交数据http://localhost:8080/hello?username=ping
    处理方法

    //@RequestParam("username"):username提交的域的名称
    @RequestMapping("/hello")
    public String hello(@RequestParam("username") String name){ 
      System.out.println(name); 
      return "hello"; 
    }
    

    后台输出:ping
    3)提交的是对象。
    要求提交的表单域和对象的属性名一致,参数使用对象即可。
    实体类

    public class User { 
      private int id; 
      private String name; 
      private int age; 
      //构造 
      //get/set 
      //tostring() 
    }
    

    提交数据http://localhost:8080/mvc/user?name=ping&id=1&age=20
    处理方法

    @RequestMapping("/user") 
    public String user(User user){ 
      System.out.println(user); 
      return "hello"; 
    }
    

    后台输出:User { id=1, name='ping', age=20 }
    说明:如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null。

    2.数据显示到前端

    1)通过ModelAndView

    public class ControllerTest1 implements Controller { 
      public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { 
        //返回一个模型视图对象 
        ModelAndView mv = new ModelAndView(); mv.addObject("msg","ControllerTest1"); 
        mv.setViewName("test"); 
        return mv; 
      } 
    }
    

    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"; 
    }
    

    3)通过Model

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

    3.乱码问题

    测试
    ①编写一个提交的表单。

    <form action="/t" method="post">
      <input type="text" name="name">
      <input type="submit">
    </form>
    

    ②后台编写对应的处理类。

    @Controller public class Encoding { 
      @RequestMapping("/t") 
      public String test(Model model,String name){ 
        model.addAttribute("msg",name);
        //获取表单提交的值 
        return "test";
        //跳转到test页面显示输入的值 
      }
    }
    

    ③输入测试后产生乱码。
    以前乱码问题通过过滤器解决,而SpringMVC给我们提供了一个过滤器,可以在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>/*</url-pattern>
    </filter-mapping>
    

    修改了xml文件需要重启服务器。
    注意:有些极端情况下,这个过滤器对get的支持不好。
    处理方法
    Ⅰ修改Tomcat配置文件:设置编码

    <Connector URIEncoding="utf-8" port="8080" protocol="HTTP/1.1" 
                        connectionTimeout="20000" 
                        redirectPort="8443" />
    

    Ⅱ自定义过滤器
    在web.xml中配置这个过滤器即可。

    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; 
      } 
    }
    

    总结:乱码问题需要在尽可能设置编码的地方,都设置为统一编码UTF-8。

    相关文章

      网友评论

        本文标题:SpringMVC之数据处理

        本文链接:https://www.haomeiwen.com/subject/ctsdpltx.html