转发:一次请求,服务器内部调用另外的组件处理,request和response可以共用,有限制性,只能转发到本应用中的某些资源,页面或者controller请求可以访问WEB-INF目录下面的页面
重定向:两次请求,地址会改变,request和response不能共用,不能直接访问WEB-INF下面的资源,
根据所要跳转的资源,可以分为跳转到页面或者跳转到其他controller
一、返回ModelAndView时的请求转发
当controller中的方法返回ModelAndView的时候,默认是使用的转发。当然,我们也可以显式的指出要使用转发,此时,需在 setViewName()指定的视图前添加forward:,此时springmvc.xml文件中配置的视图解析器将会失效,即需要在setViewName中写上jsp相对于项目根的路径。
1:转发到页面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /** * 转发返回ModelAndView对象 * @return * @throws Exception */ @RequestMapping ( "/forwardMAV.do" ) public ModelAndView forwardMAV() throws Exception{ ModelAndView mv = new ModelAndView(); mv.addObject( "type" , "转发返回ModelAndView" ); //默认情况下使用转发 //mv.setViewName("/result"); //手动显式指定使用转发,此时springmvc.xml配置文件中的视图解析器将会失效 mv.setViewName( "forward:/jsp/result.jsp" ); return mv; } |
需要在webapp目录下添加jsp/result.jsp文件:
2:转发到controller
使用转发跳转到其他controller中
1 2 3 4 5 6 7 8 9 | @RequestMapping ( "/forwardMAV.do" ) public ModelAndView forwardMAV() throws Exception{ ModelAndView mv = new ModelAndView(); //手动显式指定使用转发,此时springmvc.xml配置文件中的视图解析器将会失效 mv.setViewName( "forward:other.do" ); return mv; } |
创建OtherController:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /** * 被跳转的controller */ @Controller public class OtherController { /** * 被跳转的controller返回result.jsp * @return * @throws Exception */ @RequestMapping ( "/other.do" ) public ModelAndView other() throws Exception{ ModelAndView mv = new ModelAndView(); mv.addObject( "type" , "被跳转的controller" ); mv.setViewName( "result" ); return mv; } } |
二、返回ModelAndView时的重定向:发送的get请求,参数在url后面
如果要实现重定向,则需在setViewName()指定的视图前添加redirect:,此时springmvc.xml文件中配置的视图解析器将会失效,即需要在setViewName中写上jsp相对于项目根的路径。重定向的方式在request域中的数据会失效,此时可以通过ModelAndView来传递数据,但是只能传递基本数据类型和String类型,因为spring mvc会将传递的数据以请求参数的方式放到url的后面,此时任何数据类型都会被转换为普通的字符串。另外,我们在jsp中取值的时候需要使用 EL 表达式中的请求参数param读取。
除此之外,你还可以将数据放到HttpSession域中,这里就不演示了。
1.重定向到页面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /** * 重定向返回ModelAndView对象 * @return * @throws Exception */ @RequestMapping ( "/redirectMAV.do" ) public ModelAndView redirectMAV(School school,String name) throws Exception{ ModelAndView mv = new ModelAndView(); //在重定向中可以使用ModelAndView传递数据,但是只能传递基本数据类型和String类型 mv.addObject( "school" ,school); mv.addObject( "name" , name); //使用重定向,此时springmvc.xml配置文件中的视图解析器将会失效 mv.setViewName( "redirect:/jsp/result.jsp" ); return mv; |
result.jsp
1 2 3 4 5 | < title >Title</ title > ${school.schoolName}< br > ${param.school.address}< br > ${param.name} |
2,重定向到controller
在重定向到其他controller中的方法的时候,只要保证两者的参数名一致即可实现数据的传递。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @RequestMapping ( "/redirectMAV.do" ) public ModelAndView redirectMAV(School school,String name) throws Exception{ 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; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | RequestMapping( "/other.do" ) public ModelAndView other(String name, School school) throws Exception{ ModelAndView mv = new ModelAndView(); //单个接收 mv.addObject( "name" , name); //通过javabean对象接收 mv.addObject( "school" , school); System.out.println(school.getAddress()); mv.setViewName( "result" ); return mv; } |
返回String类型的转发
这个整体上跟之前ModelAndView差不多,只不过在controller中的方法参数会被自动的放到request域中。
1 2 3 4 5 6 7 8 | @RequestMapping ( "/forwardStr.do" ) public String forwardStr(School school) throws Exception{ //默认会使用转发 //return "result"; //显式的使用转发 return "forward:/jsp/result.jsp" ; } |
result.jsp中直接通过request域获取数据,以下两种方式均可。
1 2 3 | ${requestScope.school.schoolName} ${school.schoolName} |
返回String类型的重定向
这里要想传递数据的话,需要使用之前介绍过的Model实现,这里的数据同样会放在url中,所以只能传递基本数据类型和String类型。
1 2 3 4 5 6 7 8 9 | @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来获取数据:
1 2 3 | ${param.schoolName} ${param.address} |
这里转发和重定向跟之前返回ModelAndView的时候一样,所以就不演示了。
返回void的重定向和转发
当方法没有返回值即返回void的时候,重定向和转发操作都是使用的servlet的api,就是:
转发:
1 | request.getRequestDispatcher( "/jsp/result.jsp" ).forward(request, response); |
重定向:
1 | response.sendRedirect(request.getContextPath()+ "/jsp/result.jsp" ); |
***************************************
1 2 3 4 5 6 7 8 9 10 11 12 | @RequestMapping (value= "/aa" ,method=RequestMethod.GET) public ModelAndView aaa (HttpServletRequest request) { String user = request.getParameter( "username" ); ModelAndView mv = new ModelAndView ( "xyxyh/declaration/delcleView" ); mv.addObject( "pas" , "bb" ): return mv } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @RequestMapping (value= "/aa" ,method=RequestMethod.GET) public ModelAndView aaa (HttpServletRequest request,ModelMap model) { String user = request.getParameter( "username" ); ModelAndView mv = new ModelAndView ( "xyxyh/declaration/delcleView" ); mv.addObject( "pas" , "bb" ): model.addAttribute( "typeFlag" , "aaaaa" ); return mv } |
到此这篇关于SpringBoot中处理的转发与重定向方式的文章就介绍到这了,更多相关SpringBoot 转发与重定向内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!