SpringBoot中处理的转发与重定向

转发:一次请求,服务器内部调用另外的组件处理,request和response可以共用,有限制性,只能转发到本应用中的某些资源,页面或者controller请求

课可以访问WEB-INF目录下面的页面

 

重定向:两次请求,地址会改变,request和response不能共用,不能直接访问WEB-INF下面的资源,

 

根据所要跳转的资源,可以分为跳转到页面或者跳转到其他controller

SpringBoot中处理的转发与重定向

一、返回ModelAndView时的请求转发

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

1:转发到页面

  1. /**
  2. * 转发返回ModelAndView对象
  3. * @return
  4. * @throws Exception
  5. */
  6. @RequestMapping("/forwardMAV.do")
  7. public ModelAndView forwardMAV()throws Exception{
  8. ModelAndView mv = new ModelAndView();
  9. mv.addObject("type", "转发返回ModelAndView");
  10. //默认情况下使用转发
  11. //mv.setViewName("/result");
  12. //手动显式指定使用转发,此时springmvc.xml配置文件中的视图解析器将会失效
  13. mv.setViewName("forward:/jsp/result.jsp");
  14. return mv;
  15. }

需要在webapp目录下添加jsp/result.jsp文件:

2:转发到controller

使用转发跳转到其他controller中

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

创建OtherController:

  1. /**
  2. * 被跳转的controller
  3. */
  4. @Controller
  5. public class OtherController {
  6. /**
  7. * 被跳转的controller返回result.jsp
  8. * @return
  9. * @throws Exception
  10. */
  11. @RequestMapping("/other.do")
  12. public ModelAndView other()throws Exception{
  13. ModelAndView mv = new ModelAndView();
  14. mv.addObject("type", "被跳转的controller");
  15. mv.setViewName("result");
  16. return mv;
  17. }
  18. }

二、返回ModelAndView时的重定向:发送的get请求,参数在url后面

如果要实现重定向,则需在setViewName()指定的视图前添加redirect:,此时springmvc.xml文件中配置的视图解析器将会失效,即需要在setViewName中写上jsp相对于项目根的路径。重定向的方式在request域中的数据会失效,此时可以通过ModelAndView来传递数据,但是只能传递基本数据类型和String类型,因为spring mvc会将传递的数据以请求参数的方式放到url的后面,此时任何数据类型都会被转换为普通的字符串。另外,我们在jsp中取值的时候需要使用 EL 表达式中的请求参数param读取。

除此之外,你还可以将数据放到HttpSession域中,这里就不演示了。

1.重定向到页面

  1. /**
  2. * 重定向返回ModelAndView对象
  3. * @return
  4. * @throws Exception
  5. */
  6. @RequestMapping("/redirectMAV.do")
  7. public ModelAndView redirectMAV(School school,String name)throws Exception{
  8. ModelAndView mv = new ModelAndView();
  9. //在重定向中可以使用ModelAndView传递数据,但是只能传递基本数据类型和String类型
  10. mv.addObject("school",school);
  11. mv.addObject("name", name);
  12. //使用重定向,此时springmvc.xml配置文件中的视图解析器将会失效
  13. mv.setViewName("redirect:/jsp/result.jsp");
  14. return mv;

result.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. ${school.schoolName}<br>
  8. ${param.school.address}<br>
  9. ${param.name}
  10. </body>
  11. </html>

2,重定向到controller
在重定向到其他controller中的方法的时候,只要保证两者的参数名一致即可实现数据的传递。

  1. @RequestMapping("/redirectMAV.do")
  2. public ModelAndView redirectMAV(School school,String name)throws Exception{
  3. ModelAndView mv = new ModelAndView();
  4. mv.addObject("name", name);
  5. mv.addObject("schoolName", school.getSchoolName());
  6. mv.addObject("address", school.getAddress());
  7. System.out.println(school.getAddress());
  8. //使用重定向,此时springmvc.xml配置文件中的视图解析器将会失效
  9. mv.setViewName("redirect:other.do");
  10. return mv;
  11. }
  1. RequestMapping("/other.do")
  2. public ModelAndView other(String name, School school)throws Exception{
  3. ModelAndView mv = new ModelAndView();
  4. //单个接收
  5. mv.addObject("name", name);
  6. //通过javabean对象接收
  7. mv.addObject("school", school);
  8. System.out.println(school.getAddress());
  9. mv.setViewName("result");
  10. return mv;
  11. }

 

返回String类型的转发

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

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

result.jsp中直接通过request域获取数据,以下两种方式均可。

${requestScope.school.schoolName}

${school.schoolName}

返回String类型的重定向

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

  1. @RequestMapping("/redirectStr.do")
  2. public String redirectStr(School school, Model model)throws Exception{
  3. //这里的数据同样会放在url中,所以只能传递基本数据类型和String类型
  4. model.addAttribute("schoolName", school.getSchoolName());
  5. model.addAttribute("address", school.getAddress());
  6. return "redirect:/jsp/result.jsp";
  7. }

result.jsp中需要通过param来获取数据:

${param.schoolName}

${param.address}

这里转发和重定向跟之前返回ModelAndView的时候一样,所以就不演示了。

 

返回void的重定向和转发

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

request.getRequestDispatcher("/jsp/result.jsp").forward(request, response);

重定向:

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

 

                        <li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true">
                            <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#csdnc-thumbsup"></use>
                        </svg><span class="name">点赞</span>
                        <span class="count">3</span>
                        </a></li>
                        <li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;popu_824&quot;}"><svg class="icon" aria-hidden="true">
                            <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-csdnc-Collection-G"></use>
                        </svg><span class="name">收藏</span></a></li>
                        <li class="tool-item tool-active is-share"><a href="javascript:;"><svg class="icon" aria-hidden="true">
                            <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-csdnc-fenxiang"></use>
                        </svg>分享</a></li>
                        <!--打赏开始-->
                                                <!--打赏结束-->
                                                <li class="tool-item tool-more">
                            <a>
                            <svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg>
                            </a>
                            <ul class="more-box">
                                <li class="item"><a class="article-report">文章举报</a></li>
                            </ul>
                        </li>
                                            </ul>
                </div>
                            </div>
            <div class="person-messagebox">
                <div class="left-message"><a href="https://blog.csdn.net/yubin1285570923">
                    <img src="https://profile.csdnimg.cn/3/9/2/3_yubin1285570923" class="avatar_pic" username="yubin1285570923">
                                            <img src="https://g.csdnimg.cn/static/user-reg-year/1x/2.png" class="user-years">
                                    </a></div>
                <div class="middle-message">
                                        <div class="title"><span class="tit"><a href="https://blog.csdn.net/yubin1285570923" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}" target="_blank">yubin1285570923</a></span>
                                            </div>
                    <div class="text"><span>发布了175 篇原创文章</span> · <span>获赞 25</span> · <span>访问量 5万+</span></div>
                </div>
                                <div class="right-message">
                                            <a href="https://im.csdn.net/im/main.html?userName=yubin1285570923" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信
                        </a>
                                                            <a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}">关注</a>
                                    </div>
                            </div>
                    </div>
    
    SpringBoot中处理的转发与重定向SpringBoot中处理的转发与重定向 别抢我蓝buff 发布了26 篇原创文章 · 获赞 0 · 访问量 2000 私信 关注
    上一篇:SpringMVC异常映射


    下一篇:第五章:ModelAndView