SpringMVC之ViewResolver和View
配置文件中和ViewResolve有关的部分
<!--视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- webroot到一指定文件夹文件路径 --> <property name="prefix" value="/"/> <!-- 视图名称后缀 --> <property name="suffix" value=".jsp"/> </bean>
自己写的处理器处理用户的请求,在处理完请求后返回一个ModelAndView对象
package com.wangbiao.springMVC; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.multiaction.MultiActionController; public class HelloWorld extends MultiActionController{ public ModelAndView sayHelloWorld(HttpServletRequest request, HttpServletResponse response) { String param = request.getParameter("param"); System.out.println("springMVC测试:helloWorld;"+param); ModelAndView mv = new ModelAndView(); mv.addObject("content", "springMVC HelloWorld:"+param); mv.setViewName("springMVC/helloWorld"); ServletContext ctx = this.getServletContext(); return mv; } }
可以看出处理器返回MdoelAndView对象并向此对象中设一个viewName,ViewName是逻辑视图名,还向MdoelAndView中传入了数值,其实就是向MdoelAndView传入了一个Map对象,这个Map对象就是我们常说的数据模型Modle。
ViewResolve和View的作用
1. ViewResolve的作用就是通过解析MdoelAndView,将MdoelAndView中的逻辑视图名变为一个真正的View对象,并将MdoelAndView中的Model取出。
2. View的作用就是在获取到ViewResolve传来的View和Model,对Model进行渲染,通过View对象找到要展示给用户的物理视图,将渲染后的视图展示给用户。用很直白的话将就是将数据通过request存储起来,找到要展示给用户的页面,将这些数据放在页面中,并将页面呈现给用户。
ViewResolve的初始化流程
1. ViewResolve和前面的HandlerMapping,HandlerAdapter一样,首先是在启动服务的时候,IOC容器会根据配置文件里面的ViewResolve相关信息对ViewResolve进行实例化。
2. 然后存储到DispatcherServlet的 List<ViewResolver> viewResolvers属性中。
3. 当要解析MdoelAndView对象的时候,会遍历viewResolvers,从中取出一个viewResolver对进行解析。
4. 要是解析出View对象,就不再进行遍历,要是解析出的View对象是空的,接着从viewResolvers中取出viewResolver对MdoelAndView对象进行解析。
ResolverView和View相关类的介绍
1.类AbstractCachingViewResolver
AbstractCachingViewResolver实现了ResolverView接口。AbstractCachingViewResolver类的主要作用就是在缓存中通过逻辑视图名查找视图,如果没有查找到,就去创建一个新的视图,并将该视图存入缓存中。
2.类UrlBasedViewResolver
UrlBasedViewResolver继承了AbstractCachingViewResolver。UrlBasedViewResolver的主要作用是创建一个View的对象,这个View的对象可以在配置文件中配置,也可以取默认的,默认的就是JstlView,读取配置文件中对ResolverView的配置,根据逻辑视图名找到真正视图的路径,将路径存入View对象中。这样就得到了一个View对象。
3.类AbstractView
AbstractView实现了View接口。AbstractView的主要作用是渲染视图和将model中的数据取出来并传给页面。AbstractView渲染视图只是实现了一个抽象方法,该功能主要靠AbstractView的孙子类InternalResourceView来实现
4.AbstractUrlBasedView类
主要是起到一个承上启下的作用,其他的作用这个我也不知道。
5.InternalResourceView类
InternalResourceView继承了AbstractUrlBasedView,InternalResourceView的主要作用就是拿到视图的路径,创建一个RequestDispatcher对象。将视图路径给RequestDispatcher,RequestDispatcher条用forward方法,将视图展示给用户。