请求转发的场景:
1.在控制类(Controller)下的void类型控制方法中,若是需要转发其他页面,可在参数中增加HttpServletRequest request参数,通过
request.getRequestDispatcher("WEB-INF/../..jsp").forward(request,response);
实现请求转发。
2.返回ModelAndView时,显示的转发请求,需要关键词(forward),在设置视图时需要设置全部路径,形式为
ModelAndView mv;
mv.setViewName("forward:/WEB-INF/../...jsp");
若是转发到其他控制类
mv.setViewName("forward:/***.do");
3.返回String时的请求转发,很简单:
return "forward:/WEB-INF/../...jsp"
实现请求转发时,参数传递的方式有很多,可以自己选择
mv.addObject("User","user"); //ModelAndView对象mv传递(返回String类型时不可用)
request.setAttribute("User","user"); //HttpServletRequest对象参数传递
重定向的场景:
1.返回ModelAndView重定向页面时,使用关键词redirect,由于重定向的页面无法通过request来获取参数,因此传递参数不能用request,重定向的页面不能访问WEB-INF下的资源,使用model传参时不能传自定义的java对象,并且前端接收参数需要EL表达式中的请求参数param读取,因为视图解析器会将Map的value放入URL后作为请求参数传出去,任何类型的value都会转化为String类型,会导致前端接收不到自定义的对象(注:是在重定向中的规则)使用model传参时
User user=new User();
ModelAndView mv=new ModelAndView();
mv.addObject("name",user.getName());
mv.addObject("password",user.getPassword());
mv.setViewName("redirect:/aaa.jsp"); //注意,重定向不能访问WEB-INF下的资源
return mv;
还可以使用HttpSession传参
session.setAttribute("User","user");
mv.setViewName("redirect:/aaa.jsp");
这里就可以传java对象,前端直接用user.name接收,无需param请求参数
重定向控制器时,规则与重定向页面相同,将需要重定向的页面改为请求路径就好啊,新的控制器在接收参数时,可以用同名参数接收,也可以用属性与参数对应的java对象来接收
2.返回String类型时重定向
关键词redirect,传递参数有两种,Model和RedirectAttribute,后者专门用来传参并且继承于前者,所以规则一样,不能传递自定义java对象,只能传递基础类型
mv.addObject("name",user.getName());
mv.addObject("password",user.getPassword());
return "redirect:/aaa.jsp";
rd.addAttribute("name",user.getName()); //rd是在方法的参数中定义的RedirectAttribute rd
rd.addAttribute("password",user.getPassword());
return "redirect:/aaa.jsp";
注意:使用 RedirectAttribute时需要在SpringMVC配置中注册注解驱动
<mvc:annotation-driven/>
重定向到控制器方法时,规则与重定向页面相同,将需要重定向的页面改为请求路径就好啊,新的控制器在接收参数时,可以用同名参数接收,也可以用属性与参数对应的java对象来接收
3.返回void时
传参使用HttpSession,重定向使用response.sendRedirect(request.getContextPath()+"/aaa.jsp");
@RequestMapping("/aaa.do)
public void doaaa(User user,HttpSession session,HttpServletRequest requst,HttpServletResponse response){
session.setAttribute("name",user.getName());
seesion.setAttribute("password",user.getPassword());
try{
response.sendRedirect(request.getContextPath()+"/aaa.jsp");
}catch(IOException e){
e.printStackTrace();
}
}