SpringMVC控制类的Controller方法返回值
- Controller方法返回值
- 返回字符串
- 逻辑视图名
controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
//指定逻辑视图名,经过视图解析器解析为jsp物理路径:/WEB-INF/jsp/itemList.jsp
return "itemList";
参考第一天内容
- 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();
}
- 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属性
修改,如下图::
使用request和response进行重定向和转发
- 返回ModelAndView
controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view。
参考第一天的内容
使用modelAndView默认都是使用转发的方式的,如果要使用重定向,需要创建RediectView(没有意义)。
- 返回void
如果不做任何处理,默认会转发到当前的请求的url:
案例:
@RequestMapping("/addStu") publicvoid addStudent(){ //可以使用request,response转发或者重定向 System.out.println("添加学生,返回void"); //在方法中不做任何重定向和转发操作
// 当方法的返回值为void时,默认会转发进入当前的url 类似:return "addStu" /WEB-INF/jsp/addStu.jsp } |
在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");
- 可以通过response指定响应结果,例如响应json数据如下:
response.getWriter().print("{\"abc\":123}");
- 代码演示
以下代码一次测试,演示上面的效果
/**
* 返回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}");
}
- 返回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
添加JSP
响应结果:
Model同样有4个方法可以添加数据模型对象:
默认对象都是放在request作用域中的。
其实使用Model设置数据模型时,可以没有返回值:
所有的model中的数据默认都是设置在request作用域中的。
- ModelMap传递数据
ModelMap本来就是一个Map,就是用来设置数据的。
ModelMap在初始化的时候,可以设置数据。
构造之后,通过可以通过API设置数据模型;
所有的API和Model一样,是Model的一个非直接实现类。
所以当返回ModelMap时,所有的处理和Model的处理是一样的。
案例:
使用ModelMap替换Model没有任何问题。
ModelMap是类,是可以自己创建对象的。
情况一:返回void
情况二:返回ModelMap
- 返回一个Map
当返回一个java.util.Map时,处理方式几乎和ModelMap完全一致:
使用Map作为处理方法的参数,spring同样会创建Map对象设置数据模型到作用域中。
- 返回一个javaBean对象
案例:
直接返回user对象,响应方式和void一致。
注意:springMVC默认会将对象的名称作为key,将对象设置到request的作用域中。
- 返回一个List
响应处理依然和void一致。
案例:
测试:无论controller中的返回值的对象名称是什么?页面都是通过userList获取。
当返回值为List是,默认springMVC会将list设置到request作用域中,并且给list的key为: xxxList 其中xxx是List 中存储的类型的类名的首字母小写的组成。
例如:List<String> sts = new ArrayList<String>() 在页面中通过JSTL获取的key是:stringList。
- 返回Set
Set和List几乎一致,唯一的区别是set和list集合的本质区别。