在springmvc中请求的转发和响应的重定向就可以使用HttpServletRequest对象和HttpServletResponse对象又可以使用springmvc提供的"forward"和"redirect"关键字,也可以使用ModelAndView对象来进行转发。
使用最原始的方法
@RequestMapping("/testReturn")
public void testReturnVoid(HttpServletRequest request,HttpServletResponse response) throws Exception{
request.setAttribute("name", "张三");
//转发
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
//重定向
response.sendRedirect(request.getContextPath()+"/testReturnVoid.jsp");
//转发到同一控制器的其他方法中,只需要将对应方法的URL映射写进去
request.getRequestDispatcher("testReturnString").forward(request, response);
//转发到不同一控制器的其他方法中,需要将对应控制器的方法的URL全映射写进去。
request.getRequestDispatcher("/springmvc/testModelAttribute").forward(request, response);
//重定义到同一控制器的其他方法,但是重定向无法重定向到其他的控制器中
response.sendRedirect("testReturnString");
}
注:使用最原始的方法进行转发时,数据可以携带,但是重定向时,数据是无法携带的。并且转发和重定向到对应的jsp页面时,必须将对应页面的名称写全,因为此时不会经过视图解析器。
使用springmvc提供的方法
转发
@RequestMapping("/testForward")
public String testForward(HttpServletRequest request,HttpServletResponse response){
request.setAttribute("name", "张三");
//转发到指定的jsp页面
return "forward:/WEB-INF/pages/success.jsp";
//转发到不同一控制器的其他方法中,需要将对应控制器的方法的URL全映射写进去
return "forward:/springmvc/testModelAttribute";
//转发到同一控制器的其他方法中
return "forward:/testModelAttribute";
}
重定向
@RequestMapping("/testRedirect")
public String testRedirect(){
//重定向到指定的jsp页面
return "redirect:/testReturnVoid.jsp";
//重定向到同一控制器的其他url映射,
return "redirect:testForward";
}
注:使用"forword"进行转发时,"forword"和"redirect"关键字后面的字符串表示的是物理视图地址,此时,该字符串也不会经过springmvc的视图解析器,并且"forword"关键字可以携带信息,"redirect"关键字不能携带信息。
使用ModelAndView
@RequestMapping("/testReturnModeAndView")
public ModelAndView testReturnModeAndView(){
//获取ModelAndView对象
ModelAndView mv = new ModelAndView();
/*
* 设置响应的内容(model的数据),
* model的数据可以是一个对象,
* 也可以是一个集合。
*/
List<String> list = new ArrayList<String>();
list.add("张三");
list.add("李四");
list.add("王五");
mv.addObject("list",list);
//设置响应的逻辑视图名称
mv.setViewName("error");
return mv;
}