学习笔记——Spring Boot(7)

SpringMVC中Controller的几种返回值

在编写controller时,我们会发现mapping中会有不同的返回值,这次我通过查询其他人的博客,总结一下各个返回值:

  1. 返回ModelAndView
  2. 返回Map
  3. 返回View
  4. 返回String
  5. 无返回值(void)

(1)返回ModelAndView

      使用ModelAndView类用来存储处理完后的结果数据,以及显示该数据的视图。从名字上看ModelAndView中的Model代表模型,View代表视图,这个名字就很好地解释了该类的作用。业务处理器调用模型层处理完用户请求后,把结果数据存储在该类的model属性中,把要返回的视图信息存储在该类的view属性中,然后让该ModelAndView返回该Spring MVC框架。框架通过调用配置文件中定义的视图解析器,对该对象进行解析,最后把结果数据显示在指定的页面上。

@RequestMapping(method=RequestMethod.GET)
   public ModelAndView index(){
   ModelAndView modelAndView = new ModelAndView("/user/index");
   modelAndView.addObject("xxx", "xxx");
   return modelAndView;
}

      通过ModelAndView构造方法可以指定返回的页面名称,也可以通过setViewName()方法跳转到指定的页面 ,使用addObject()设置需要返回的值,addObject()有几个不同参数的方法,可以默认和指定返回对象的名字。

@RequestMapping(method=RequestMethod.GET)
public ModelAndView index(){
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("xxx", "xxx");
    modelAndView.setViewName("/user/index");
    return modelAndView;
}

注意:Model中存的数据,最终都会存放到HttpServletRequest对象中,页面上可以通过HttpServletRequest对象获取数据。

(2)返回Map

      map返回的就是一串字符串,例子:

@RequestMapping("/demo2/show") 
public Map<String, String> getMap() { 
   Map<String, String> map = new HashMap<String, String>(); 
   map.put("key1", "value-1"); 
   map.put("key2", "value-2"); 
   return map; 
}

(3)返回View

      可查看博客Spring MVC之View Resolver,其中举例子:

@RequestMapping(value = "/htmlorjson/{type}", method = {RequestMethod.GET, RequestMethod.POST})
    public ModelAndView ajaxPaymentBatchApproveProcess(@PathVariable String type)
    {
        if ("html".equals(type))
        {
             //index表示指定路径下的jsp页面的名称
            ModelAndView mav = new ModelAndView("index");
            return mav;
        }
        else
        {
            ModelAndView mav = new ModelAndView(new MappingJackson2JsonView());
            mav.addObject("result", "failed");
            return mav;
        }
    }

(4)返回String

逻辑视图名

Controller类方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。 
这里写图片描述

Redirect重定向

Contrller类方法返回结果重定向到一个url地址,如下商品信息修改提交后重定向到商品查询方法,参数无法直接带到商品查询方法中。

@RequestMapping(value="/updateitem",method={RequestMethod.POST,RequestMethod.GET})
public String updateItems(Items items) {
    itemService.updateItem(items);
    // '/'是不包含工程名的根目录,即http://localhost:8080/springmvc-web2/item/itemList.action
    return "redirect:/item/itemList.action";
}

redirect方式相当于“response.sendRedirect()”,转发后浏览器的地址栏变为转发后的地址,因为转发即执行了一个新的request和response。由于新发起一个request,原来的参数在转发时就不能传递到下一个url,如果要传参数可以在/item/itemList.action后边加参数,如下:

return "redirect:/item/itemList.action?id=xxx&name=xxx";

这里写图片描述
但如果你使用的是Model接口,那么SpringMVC框架会自动将Model中的数据拼装到/item/itemList.action后面。

forward转发

Controller类方法执行后继续执行另一个Controller类方法,如下商品修改提交后转向到商品修改页面,修改商品的id参数可以直接带到商品修改方法中。

@RequestMapping(value="/updateitem",method={RequestMethod.POST,RequestMethod.GET})
public String updateItems(Items items) throws UnsupportedEncodingException {
    itemService.updateItem(items);
    return "forward:/item/itemList.action";
}

forward方式相当于“request.getRequestDispatcher().forward(request,response)”,转发后浏览器地址栏还是原来的地址。转发并没有执行新的request和response,而是和转发前的请求共用一个request和response。所以转发前请求的参数在转发后仍然可以读取到。 
这里写图片描述

(5)无返回值(void)

      在Controller类方法形参上可以定义request和response,使用request或response指定响应结果:

  1. 使用request转向页面,如下:

    request.getRequestDispatcher("页面路径").forward(request, response);

    之前我们实现商品列表的查询,返回的是ModelAndView,如果现在该方法的返回值是void,那么就应使用request跳转页面,如下:

    @RequestMapping("/itemList2")
    public void itmeList2(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 查询商品列表
        List<Items> itemList = itemService.getItemList();
        // 向页面传递参数
        request.setAttribute("itemList", itemList);
        // 如果使用原始的方式做页面跳转,必须给的是jsp的完整路径
        request.getRequestDispatcher("/WEB-INF/jsp/itemList.jsp").forward(request, response);
    }

    注意:如果使用原始的方式做页面跳转,那么必须给定jsp页面的完整路径。

  2. 也可以通过response实现页面重定向:

    response.sendRedirect("url")
  3. 也可以通过response指定响应结果,例如响应json数据如下:

    response.setCharacterEncoding("utf-8");
    response.setContentType("application/json;charset=utf-8");
    response.getWriter().write("json串");

    例如,将以上itmeList2方法修改为:

    @RequestMapping("/itemList2")
    public void itmeList2(HttpServletRequest request, HttpServletResponse response) throws Exception {
        PrintWriter writer = response.getWriter();
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/json;charset=utf-8");
        writer.write("{\"id\":\"123\"}");
    }

    此时,在浏览器地址栏中输入url访问地址:http://localhost:8080/springmvc-web2/item/itemList2.action进行访问,我们可在浏览器看到如下效果: 
    这里写图片描述

猜你喜欢

转载自blog.csdn.net/nanshenjiang/article/details/81514846