spring MVC如何解析视图
试图是渲染数据模型展示给用户的组件,我们平时在控制器中写的return "success";
返回的就是逻辑试视图,必须由视图解析器解析了视图,我们才能找到视图模型,例如:
<!-- 视图解析器对象 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
这就是一个简单的视图解析器,我们控制器一般返回三种视图对象:
- String
- ModelAndView
- View
而我们常用的View由两种:
- InternalResourceView:转发视图
- RedirectView:重定向视图
在DispatcherServlet处理这些视图时,都会将他们转化为ModelAndView视图,然后由视图解析器ViewResolver
解析为视图对象,根据视图对象找到资源位置进行访问
InternalResourceView
我们返回字符串或者ModelAndView都是通过InternalResourceView
方式,实现内部资源跳转,我们先介绍它
1.debug运行我们的程序
找到标蓝的方法,这就是我们解析视图名的重点,之前的过程都不是我们关注的重点,注意看这个方法: resolveViewName
2.resolveViewName()
进入该方法,看图中的标记,这个过程表示我们正在利用我们自定义的解析器解析视图
那么具体解析过程是怎样的呢?请继续往下看:
我们进入这个方法
3.
我们通过一张图片来解析view对象是怎样返回的
这个最终返回的view就对应上一个步骤的view对象,之后的执行步骤可以看我另一篇文章ModelAndView执行流程
这就是一个完整的解析InternalResourceView类型View的过程
RedirectView
下面一种情况:
@RequestMapping("/test")
public String testModelAndView(){
/*ModelAndView mav = new ModelAndView();
mav.addObject("username","root");
mav.setViewName("success");*/
return "redirect:/index.jsp";
}
与上面一样,我们进入resolveViewName()
方法,再继续进入
我们进入对应的条件:
然后返回该view,赋值给对应的view,一直返回
总结:
- InternalResourceView:转发视图,通过创建请求转发对象rd.forward()进行转发
- RedirectView:重定向视图,通过response.sedRedirect()进行重定向