zoukankan      html  css  js  c++  java
  • SpringMVC:数据处理

    SpringMVC:数据处理

    处理提交数据

    1、提交的域名称和处理方法的参数名一致

    提交数据 : http://localhost:8080/user/t1?name=yuansi

    处理方法 :

    @RequestMapping("/user/t1")
        //如果加了@RequestParam那么前端必须和@RequestParam里的字段对应
        public String test1(String name, Model model){
            //1.接收前端参数
            System.out.println("接收前端的参数:"+name);
            //2.将结果出传递给前端
            model.addAttribute("msg",name);
            return "Test";
        }
    

    后台输出 : yuansi

    2、提交的域名称和处理方法的参数名不一致

    提交数据 : http://localhost:8080/user/t1?username=yuansi

    处理方法 :

    @RequestMapping("/user/t1")
        //如果加了@RequestParam那么前端必须和@RequestParam里的字段对应
        public String test1(@RequestParam("username") String name, Model model){
            //1.接收前端参数
            System.out.println("接收前端的参数:"+name);
            //2.将结果出传递给前端
            model.addAttribute("msg",name);
            return "Test";
        }
    

    后台输出 : yuansi

    3、提交的是一个对象

    要求提交的表单域和对象的属性名一致 , 参数使用对象即可

    1. 实体类

      public class User {
          private int id;
          private String name;
          private int age;
          //构造
          //get/set
          //tostring()
      }
      
    2. 提交数据 : http://localhost:8080/mvc04/user?name=yuansi&id=1&age=18

    3. 处理方法 :

      @RequestMapping("/user")
      //那么前端传的参数必须和user类的字段对应
          public String test2(User user, Model model){
              //1.接收前端参数
              System.out.println("接收前端的参数:"+user);
              //2.将结果出传递给前端
              model.addAttribute("msg",user);
              return "Test";
          }
      

      后台输出 : User { id=1, name='yuansi', age=18 }

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

    数据显示到前端

    第一种 : 通过ModelAndView

    @RequestMapping("/mav/t1")
    public ModelAndView ModelAndViewTest() throws Exception {
        //返回一个模型视图对象
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","user");//放值
        mv.setViewName("Test");//返回页面
        return mv;
    }
    

    第二种 : 通过ModelMap

    model和ModelMap关系

    //LinkedhashMap
    //ModelMap:继承了LinkedhashMap,所以它拥有LinkedhashMap全部功能
    //model:精简版(大部分情况,我们都直接使用Model)
    

    ModelMap

    @RequestMapping("/mm/t2")
    public String ModelMapTest(ModelMap modelMap){
        //封装要显示到视图中的数据
        //相当于req.setAttribute("name",name);
        modelMap.addAttribute("msg","asd");//放值
        return "Test";//返回页面
    }
    

    第三种 : 通过Model

    Model

     @RequestMapping("/m/t3")
        public String modelTest(Model model){
            //封装要显示到视图中的数据
            //相当于req.setAttribute("name",name);
            model.addAttribute("msg","asd");//放值
            return "Test";//返回页面
        
    

    对比

    就对于新手而言简单来说使用区别就是:

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

    当然更多的以后开发考虑的更多的是性能和优化,就不能单单仅限于此的了解。

    请使用80%的时间打好扎实的基础,剩下18%的时间研究框架,2%的时间去学点英文,框架的官方文档永远是最好的教程。

    乱码问题

    不得不说,乱码问题是在我们开发中十分常见的问题,也是让我们程序猿比较头大的问题!

    以前乱码问题通过过滤器解决 , 而SpringMVC给我们提供了一个过滤器 , 可以在web.xml中配置 .

    修改了xml文件需要重启服务器!

    配置SpringMVC的中文乱码过滤

    1. 我们可以在首页编写一个提交的表单

      form.jsp:

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

      跳转到页面Test.jsp

      <%@ page contentType="text/html;charset=UTF-8"language="java" %>
      <html>
          <head>    
              <title>Title</title>
          </head>
          <body>    
              ${msg}word!
          </body>
      </html>
      
    2. 后台编写对应的处理类

      @Controller
      public class EncodingController {
          @RequestMapping("/e/t1")
          public String test(String name , Model model)throws UnsupportedEncodingException {
              System.out.println(name);
              model.addAttribute("msg",name);
              return "Test";
          }
      }
      

    配置web/xml

    <!--2.配置SpringMVC的中文乱码过滤-->
        <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>
             <!--/ 匹配所有的请求:(不包括jsp)-->
             <!--/* 匹配所有的请求:(包括jsp)-->
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    

    有些极端情况下.这个过滤器对get的支持不好 .

    处理方法 :

    修改tomcat配置文件 : 设置编码!

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

    自定义过滤器

    package com.ys.fiter;
    import javax.servlet.*;
    import java.io.IOException;
    //实现Filter接口设置过滤器
    public class EncodingFilter implements Filter {
        public void init(FilterConfig filterConfig) throws ServletException {
        }
    
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            servletRequest.setCharacterEncoding("utf-8");
            servletResponse.setCharacterEncoding("utf-8");
            filterChain.doFilter(servletRequest,servletResponse);
        }
        public void destroy() {
        }
    }
    

    web.xml配置:

    <!--自己配置的中文乱码过滤器-->
        <filter>
            <filter-name>encoding</filter-name>
            <filter-class>com.ys.fiter.EncodingFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>encoding</filter-name>
            <url-pattern>/*</url-pattern>
             <!-- / 匹配所有的请求:(不包括jsp页面)-->
            <!--/* 匹配所有的请求:(包括jsp页面)-->
        </filter-mapping>
    

    这个也是在网上找的一些大神写的,一般情况下,SpringMVC默认的乱码处理就已经能够很好的解决了!

    然后在web.xml中配置这个过滤器即可!

    乱码问题,需要平时多注意,在尽可能能设置编码的地方,都设置为统一编码 UTF-8!

    package com.ys.fiter;
    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 EncodingFilterDiy implements Filter{
            public void destroy() {
            }
            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);
            }
            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;
            }
    }
    
    

    web.xml配置:

        <filter>
            <filter-name>encoding</filter-name>
            <filter-class>com.ys.fiter.EncodingFilterDiy</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>encoding</filter-name>
            <url-pattern>/*</url-pattern>
             <!-- / 匹配所有的请求:(不包括jsp页面)-->
            <!--/* 匹配所有的请求:(包括jsp页面)-->
        </filter-mapping>
    
    
  • 相关阅读:
    绿豆加速器
    电脑派位系统(新生入学摇号) v2016
    硬盘安装win10
    msbuild
    async
    win sshd
    Ftp软件
    nginx basic auth 登陆验证模块
    深入理解docker的link机制
    Docker Compose to CoreOS
  • 原文地址:https://www.cnblogs.com/yu-si/p/12342240.html
Copyright © 2011-2022 走看看