SpringMVC(7) —— 结果跳转方式


1.ModelAndView

  • 设置ModelAndView对象 , 返回的结果将根据该对象中存储的view的名称 , 配合视图解析器添加前缀后后缀,最后跳到指定的页面 .

  • 页面 : {视图解析器前缀} + viewName +{视图解析器后缀}

    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
         id="internalResourceViewResolver">
       <!-- 前缀 -->
       <property name="prefix" value="/WEB-INF/jsp/" />
       <!-- 后缀 -->
       <property name="suffix" value=".jsp" />
    </bean>
    
  • 对应的controller类【做法很老,不推荐,但是用于理解原理很好】

    public class ControllerTest1 implements Controller {
    
       public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
           //返回一个模型视图对象
           ModelAndView mv = new ModelAndView();
           mv.addObject("msg","ControllerTest1");
           mv.setViewName("test");
           return mv;
      }
    }
    

2.ServletAPI

    除了使用 对象实现视图跳转之外,我们在学习javaweb的时候可以直接使用转发和重定向实现相同的效果,且不需要视图解析器

  • 通过设置ServletAPI , 不需要视图解析器 .
  • 通过HttpServletResponse进行输出
  • 通过HttpServletResponse实现重定向
  • 通过HttpServletResponse实现转发
@Controller
public class ResultGo {

   @RequestMapping("/result/t1")
   public void test1(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
       rsp.getWriter().println("Hello,Spring BY servlet API");
  }

   @RequestMapping("/result/t2")
   public void test2(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
       rsp.sendRedirect("/index.jsp");//重定向
  }

   @RequestMapping("/result/t3")
   public void test3(HttpServletRequest req, HttpServletResponse rsp) throws Exception {
       //转发
       req.setAttribute("msg","/result/t3");
       req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,rsp);//转发
  }

}

转发和重定向的区别

在这里插入图片描述

    但是在实际开发中,我们基本不会直接使用servletAPI来实现视图跳转,更多的是直接使用视图解析器实现


3.没有视图解析器情况下通过SpringMVC来实现转发和重定向

    通过springMVC来实现转发和重定向 - 无需视图解析器;它的原理还是调用了servletAPI中的转发和重定向,只是springMVC对上面两个操作做出了封装,所以我们使用的时候更加方便

    测试前,需要将spring容器中装配的视图解析器注释掉

@Controller
public class ResultSpringMVC {
   @RequestMapping("/rsm/t1")
   public String test1(){
       //转发1,直接写上视图的全限定名
       return "/index.jsp";
  }

   @RequestMapping("/rsm/t2")
   public String test2(){
       //转发2,在视图名称前加一个"forward:"
       return "forward:/index.jsp";
  }

   @RequestMapping("/rsm/t3")
   public String test3(){
   //重定向,在视图名称前面加一个"redirect:",注意:重定向不能访问web-inf文件夹下的资源
       return "redirect:/index.jsp";
  }
}
  • 测试
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

4.有视图解析器情况下通过SpringMVC来实现转发和重定向

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
    但是springmvc默认情况下使用的就是转发,所以在使用转发的时候我们不必显式的指明它

  • 在显式的指明使用转发的情况下,我们必须写出转发的资源的全限定名,因为此时转发不会走视图解析器
  • 在不显式的指明使用转发的情况下,我们只需要写出视图名称,此时返回的是视图名称,经过视图解析器的拼接才会得到指定的视图的资源位置,然后再将视图和数据进行渲染就得到了用户需要的页面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


5.小结

从上面的测试效果来看,我们可以得出以下结论

  • 在springMVC中,不管你开不开起视图解析器,使用springMVC封装的重定向和转发都不会走视图解析器,而是直接重定向和转发
  • 由于springMVC封装的重定向和转发原理还是使用的servletAPI中的重定向和转发,所以重定向不能访问web-inf文件夹下的资源
  • 不走视图解析器的时候,不管你是使用转发还是重定向,都需要写资源的全限定名
  • springMVC之所以可以封装和使用重定向和转发,是因为DispatcherServlet本质还是一个servlet
  • DispatcherServler也是Spring MVC中的唯一Servlet,它的声明周期也是由Servlet容器管理,在第一次访问时创建,在容器关闭时销毁;显而易见的,DispatcherServler 实例在Servlet容器中,而不是Spring自己的IoC容器中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值