SpringMVC控制类的Controller方法返回值

  1. Controller方法返回值
  1. 返回字符串
  1. 逻辑视图名

controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。

//指定逻辑视图名,经过视图解析器解析为jsp物理路径:/WEB-INF/jsp/itemList.jsp

return "itemList";

 

参考第一天内容

  1. Redirect重定向

Contrller方法返回字符串可以重定向到一个url地址

如下商品修改提交后重定向到商品编辑页面。

/**

 * 更新商品

 *

 * @param item

 * @return

 */

@RequestMapping("updateItem")

public String updateItemById(Item item) {

    // 更新商品

    this.itemService.updateItemById(item);



    // 修改商品成功后,重定向到商品编辑页面

    // 重定向后浏览器地址栏变更为重定向的地址,

    // 重定向相当于执行了新的request和response,所以之前的请求参数都会丢失

    // 如果要指定请求参数,需要在重定向的url后面添加 ?itemId=1 这样的请求参数

    return "redirect:/itemEdit.action?itemId=" + item.getId();

}
  1. forward转发

Controller方法执行后继续执行另一个Controller方法

如下商品修改提交后转向到商品修改页面,修改商品的id参数可以带到商品修改方法中。

 

/**

 * 更新商品

 *

 * @param item

 * @return

 */

@RequestMapping("updateItem")

public String updateItemById(Item item) {

    // 更新商品

    this.itemService.updateItemById(item);


    // 修改商品成功后,继续执行另一个方法

    // 使用转发的方式实现。转发后浏览器地址栏还是原来的请求地址,

    // 转发并没有执行新的request和response,所以之前的请求参数都存在

    return "forward:/itemEdit.action";



}

//结果转发到editItem.action,request可以带过去

return "forward: /itemEdit.action";

 

需要修改之前编写的根据id查询商品方法

因为请求进行修改商品时,请求参数里面只有id属性,没有itemId属性

修改,如下图::

java controller 模拟错误返回 controller返回值_ModelMap

使用request和response进行重定向和转发

java controller 模拟错误返回 controller返回值_Model_02

  1. 返回ModelAndView

controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view。

java controller 模拟错误返回 controller返回值_Model_03

参考第一天的内容

 

使用modelAndView默认都是使用转发的方式的,如果要使用重定向,需要创建RediectView(没有意义)。

  1. 返回void

如果不做任何处理,默认会转发到当前的请求的url:

案例:

@RequestMapping("/addStu")

    publicvoid addStudent(){

//可以使用request,response转发或者重定向

       System.out.println("添加学生,返回void");

//在方法中不做任何重定向和转发操作

      

// 当方法的返回值为void时,默认会转发进入当前的url 类似:return "addStu"  /WEB-INF/jsp/addStu.jsp

    }

java controller 模拟错误返回 controller返回值_ModelAndView_04

 

 

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

1、使用request转发页面,如下:

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

request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request, response);

2、可以通过response页面重定向:

response.sendRedirect("url")

response.sendRedirect("/springmvc_d02_c02/itemEdit.action");

 

  1. 可以通过response指定响应结果,例如响应json数据如下:
response.getWriter().print("{\"abc\":123}");

 

  1. 代码演示

以下代码一次测试,演示上面的效果

/**

 * 返回void测试

 *

 * @param request

 * @param response

 * @throws Exception

 */

@RequestMapping("queryItem")

public void queryItem(HttpServletRequest request, HttpServletResponse response) throws Exception {

    // 1 使用request进行转发

    // request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request,

    // response);



    // 2 使用response进行重定向到编辑页面

    // response.sendRedirect("/springmvc_d02_c02/itemEdit.action");



    // 3 使用response直接显示

    response.getWriter().print("{\"abc\":123}");

}
  1. 返回Model(使用Model传递数据)

Model可以认为是ModelAndView的一部分,纯粹的只是分装了数据模型。

在返回Model时由于没有视图的部分, 所有springMVC默认和void的处理方式一样,转发到当前的URL。

案例:

@RequestMapping("/userInfo")

    public Model userInfo(Model model){

       User user = userService.queryById(1);

model.addAttribute("user", user);

       return model;

    }

转发到当前的url

java controller 模拟错误返回 controller返回值_集合_05

 

添加JSP

java controller 模拟错误返回 controller返回值_springMVC_06

响应结果:

java controller 模拟错误返回 controller返回值_springMVC_07

Model同样有4个方法可以添加数据模型对象:

java controller 模拟错误返回 controller返回值_ModelMap_08

默认对象都是放在request作用域中的。

 

其实使用Model设置数据模型时,可以没有返回值:

java controller 模拟错误返回 controller返回值_ModelAndView_09

所有的model中的数据默认都是设置在request作用域中的。

  1. ModelMap传递数据

ModelMap本来就是一个Map,就是用来设置数据的。

java controller 模拟错误返回 controller返回值_ModelAndView_10

ModelMap在初始化的时候,可以设置数据。

java controller 模拟错误返回 controller返回值_springMVC_11

构造之后,通过可以通过API设置数据模型;

java controller 模拟错误返回 controller返回值_ModelAndView_12

所有的API和Model一样,是Model的一个非直接实现类。

 

所以当返回ModelMap时,所有的处理和Model的处理是一样的。

案例:

java controller 模拟错误返回 controller返回值_springMVC_13

使用ModelMap替换Model没有任何问题。

 

ModelMap是类,是可以自己创建对象的。

情况一:返回void

java controller 模拟错误返回 controller返回值_Model_14

情况二:返回ModelMap

java controller 模拟错误返回 controller返回值_集合_15

 

  1. 返回一个Map

当返回一个java.util.Map时,处理方式几乎和ModelMap完全一致:

java controller 模拟错误返回 controller返回值_Model_16

 

使用Map作为处理方法的参数,spring同样会创建Map对象设置数据模型到作用域中。

java controller 模拟错误返回 controller返回值_集合_17

 

  1. 返回一个javaBean对象

案例:

java controller 模拟错误返回 controller返回值_springMVC_18

直接返回user对象,响应方式和void一致。

注意:springMVC默认会将对象的名称作为key,将对象设置到request的作用域中。

java controller 模拟错误返回 controller返回值_springMVC_19

  1. 返回一个List

响应处理依然和void一致。

案例:

java controller 模拟错误返回 controller返回值_springMVC_20

 

测试:无论controller中的返回值的对象名称是什么?页面都是通过userList获取。

java controller 模拟错误返回 controller返回值_springMVC_21

当返回值为List是,默认springMVC会将list设置到request作用域中,并且给list的key为: xxxList     其中xxx是List 中存储的类型的类名的首字母小写的组成。

例如:List<String> sts = new ArrayList<String>()    在页面中通过JSTL获取的key是:stringList

  1. 返回Set

java controller 模拟错误返回 controller返回值_ModelAndView_22

Set和List几乎一致,唯一的区别是set和list集合的本质区别。