• springMvc04 前后端数据传递


    1、Model和ModelAndView的区别

    Model只是用来传输数据的,并不会进行业务的寻址。

    ModelAndView则可以进行业务寻址,即可以设置对应的要请求的静态文件(jsp等)。

    Model是每次请求可以自动创建的,放到方法参数上即可,而ModelAndView是需要自行new的。

    2、接受数据方式

    2.1、方法常见参数类型

    1)处理器方法内如果要使用response和Request对象,则需要在方法上增加该两个参数。

    HttpServletRequest requ,HttpServletResponse resp,

    2)处理器如果要通过Model方式返回数据,则需要在参数上提供Model model,也可以用Map<string,Object> map对象替代。

    Model model
    

    通过如下方法添加数据:

    model.addAttribute("orderList",orderList);

    2)处理器如果要通过Map方式返回数据,则需要在参数上提供Map<string,Object> map,等价与Model

    Map<String,Object> map
    

    通过如下方法添加数据

    map.put("orderList",orderList);

    3)参数绑定所需要的相关参数和参数注解。

    2.2、通过Request获取参数

    最原始的方式,所有客户端提交的数据都可以通过该对象获取。

            //获取某个参数的值
            String id = request.getParameter("id");
            System.out.println(id);
            {
                //获取数组参数的值
                String[] list = request.getParameterValues("id");
                for (String item:list)
                {
                    System.out.println(item);
                }
            }
            {
                //获取所有请求的参数名信息
                Enumeration<String> list = (Enumeration<String>) request.getParameterNames();
                while (list.hasMoreElements()) {
                    String item = list.nextElement();
                    System.out.println(item);
                }
            }

    2.3、简单类型绑定

    只要请求的参数name值和处理器方法的参数名保持一致,则会自动把前端的参数值传递给处理器的参数。

     

    2.4、Bean类型绑定

    参数定义

    数据请求

     

    调试输出

     

    2.5、集合类型绑定 - 简单变量方式1

    2.6、集合类型绑定 - 复杂对象方式2

    定义模型类:包含复杂类型的集合。

    ItemsPo是一个复杂类型,内部包含很多的属性。

    前端界面格式:

     后台处理器方法:

    2.7、集合类型绑定 - Map方式

    定义模型类,包含Map对象

    前端页面格式:

    后台处理器方法:

     集合方法引入自:https://blog.csdn.net/chizhuyuyu/article/details/82414259,未进行验证测试。

    2.8、通过注解接受参数

    @PathVariable

    设定接受Get方式中的请求参数(url参数),可以设定默认值,可以设定是否必须,并且可以设定前端参数名和变量名不统一。

    @PathVariable(value = "name",defaultValue = "张三",required = true) String name

    @RequestParam

    设定接受Get和Post提交请求方式,可以设定默认值,可以设定是否必须,并且可以设定前端参数名和变量名不统一。

    @RequestParam(value = "name",defaultValue = "张三",required = true) String name

    @ModelAttribute

    修饰参数:绑定参数数据,并将参数自动加入到Model容器中,Model内的key是order

    @ModelAttribute(value = "order") ex_Order order

    修饰方法:被@ModelAttribute注解的方法会在Controller每个方法执行之前都执行,因此对于一个Controller中包含多个URL的时候,要谨慎使用。

    @RequestHeader

    用来将请求头信息绑定到参数上。

    @RequestHeader(value = "User-Agent") String userAgent

    @CookieValue

    用来将请求的Cookie数据绑定到参数上。

    @CookieValue(value = "JSESSIONID",defaultValue = "张三",required = true) String sessionId

    @SessionAttributes

    用在类上边:用来指定Model中指定的属性转存到Session中,执行类的方式时结束时,会自动从Model中查看是否有指定的Key,如果有,则自动添加到HttpSession中。

    @SessionAttributes(value = {"user","name"},types = {User.class,String.class})

    3、返回数据方式

    3.1、方法返回参数类型

    处理方法常用的返回类型有:

    1)String,返回的结果只包含逻辑视图名称,返回的数据通过Model对象传递。

        @RequestMapping(value = "returnType1")
        public String returnType1(Model model)
        {
            System.out.println("执行TestController");
            List<ex_Order> orderList = new ArrayList<ex_Order>();
            ex_Order item = new ex_Order();
            item.setOrderId("T006");
            item.setOrderDate(null);
            orderList.add(item);
            model.addAttribute("orderList",orderList);
            return  "/test/index";
        }

    2)ModelAndView,返回的结果包含数据和逻辑视图名称。

        @RequestMapping(value ="/returnType2",method = RequestMethod.GET)
        public ModelAndView returnType2() throws Exception {
            System.out.println("执行TestController");
            List<ex_Order> orderList = new ArrayList<ex_Order>();
            ex_Order item = new ex_Order();
            item.setOrderId("T006");
            item.setOrderDate(null);
            orderList.add(item);
    
            //创建返回的视图对象
            ModelAndView viewResult = new ModelAndView();
            //添加返回的数据和视图,视图映射到/WEB-INF/jsp/test/index.jsp视图
            viewResult.addObject("orderList",orderList);
            viewResult.setViewName("/test/index");
            return  viewResult;
        }
    

    3)返回Void类型,这个是没有视图的返回结果,返回JSON的例子

     具体返回什么内容,通过response.setContentType来设定。

        @RequestMapping(value = "returnType3")
        public void returnType3(HttpServletRequest request, @NotNull HttpServletResponse response) throws  Exception{
            System.out.println("执行TestController");
            List<ex_Order> orderList = new ArrayList<ex_Order>();
            ex_Order item = new ex_Order();
            item.setOrderId("T006");
            item.setOrderDate(null);
            orderList.add(item);
    
            response.setContentType("text/html;charset=utf-8");
            ObjectMapper jsonTool = new ObjectMapper();
            response.getWriter().write(jsonTool.writeValueAsString(orderList));
        }
    

    例如文件下载,图片输出,JSON结果等相关应用都是用该返回类型。

    3.2、返回数据方式

    1)通过ModelAndView返回数据

    2)通过Model返回数据

    3)通过Map<sting,Object>返回数据

    4)通过response直接输出内容

    3.3、转发与跳转

    请求转发:return "forward:url"

    请求重定向:return "redirect:url"

    转发和跳转的小结

    1、转发:浏览器URL的地址栏不变。重定向:浏览器URL的地址栏改变;

    2、转发是服务器行为,重定向是客户端行为;

    3、转发是浏览器只做了一次访问请求。重定向是浏览器做了至少两次的访问请求;

    4、转发跳转之间传输的信息不会丢失,重定向跳转之间传输的信息会丢失。

    转发和重定向的选择

    1、重定向的速度比转发慢,因为浏览器还得发出一个新的请求,如果在使用转发和重定向都无所谓的时候建议使用转发。

    2、因为转发只能访问当前WEB的应用程序,所以不同WEB应用程序之间的访问,特别是要访问到另外一个WEB站点上的资源的情况,这个时候就只能使用重定向了。

  • 相关阅读:
    Can we call an undeclared function in C++?
    Template Metaprogramming in C++
    Templates and Default Arguments
    Templates and Static variables in C++
    Default Assignment Operator and References
    Advanced C++ | Conversion Operators
    Use of explicit keyword in C++
    When should we write our own assignment operator in C++?
    Copy constructor vs assignment operator in C++
    VMWare关闭beep声
  • 原文地址:https://www.cnblogs.com/feihusurfer/p/15887106.html
Copyright © 2020-2023  润新知