Controller中的转发与重定向

转发和重定向的区别

转发:一次请求,会在同一个url下处理请求,因此速度会更快,而且用户的变量和session会保持不变。

重定向:两次请求,会重新发送url请求,响应速度会变慢,但是会重新初始化用户的变量和session。

一、返回ModelAndView时的请求转发
当controller中的方法返回ModelAndView的时候,默认是使用的转发。当然,我们也可以显式的指出要使用转发,此时,需在 setViewName()指定的视图前添加forward:,此时springmvc.xml文件中配置的视图解析器将会失效,即需要在setViewName中写上jsp相对于项目根的路径。

转发到页面

 ModelAndView mv = new ModelAndView();
    mv.addObject("type", "转发返回ModelAndView");
    //默认情况下使用转发
    //mv.setViewName("/result"); 
    //手动显式指定使用转发,此时springmvc.xml配置文件中的视图解析器将会失效
    mv.setViewName("forward:/jsp/result.jsp");

使用转发跳转到其他controller中

@RequestMapping("/forwardMAV.do")
public ModelAndView forwardMAV()throws Exception{
 
    ModelAndView mv = new ModelAndView();
 
    //手动显式指定使用转发,此时springmvc.xml配置文件中的视图解析器将会失效
    mv.setViewName("forward:other.do");
    return mv;
}

二、返回ModelAndView时的请求重定向

重定向到页面

    ModelAndView mv = new ModelAndView(); 
    //在重定向中可以使用ModelAndView传递数据,但是只能传递基本数据类型和String类型
    mv.addObject("school",school);
    mv.addObject("name", name); 
    //使用重定向,此时springmvc.xml配置文件中的视图解析器将会失效
    mv.setViewName("redirect:/jsp/result.jsp");

重定向到Controller请求

    ModelAndView mv = new ModelAndView(); 
    mv.addObject("name", name);
    mv.addObject("schoolName", school.getSchoolName());
    mv.addObject("address", school.getAddress());
    System.out.println(school.getAddress());
    //使用重定向,此时springmvc.xml配置文件中的视图解析器将会失效
    mv.setViewName("redirect:other.do");
    return mv;

返回String类型的转发和重定向

String类型的转发

整体上跟之前ModelAndView差不多,只不过在controller中的方法参数会被自动的放到request域中。

@RequestMapping("/forwardStr.do")
public String forwardStr(School school)throws Exception{
 
    //默认会使用转发
    //return "result";
    //显式的使用转发
    return "forward:/jsp/result.jsp";
}

String类型的重定向

想传递数据的话,需要使用之前介绍过的Model实现,这里的数据同样会放在url中,所以只能传递基本数据类型和String类型。

@RequestMapping("/redirectStr.do")
public String redirectStr(School school, Model model)throws Exception{
 
    //这里的数据同样会放在url中,所以只能传递基本数据类型和String类型
    model.addAttribute("schoolName", school.getSchoolName());
    model.addAttribute("address", school.getAddress());
 
    return "redirect:/jsp/result.jsp";
}
result.jsp中需要通过param来获取数据

 

当方法没有返回值即返回void的时候,重定向和转发操作都是使用的servlet的api,就是:
转发:

request.getRequestDispatcher("/jsp/result.jsp").forward(request, response);
重定向:

response.sendRedirect(request.getContextPath()+"/jsp/result.jsp");

你可能感兴趣的:(java框架学习)