Spring MVC视图解析器
- ➢ AbstractCachingViewResolver:
- ➢ XmlViewResolver:
- ➢ ResourceBundleViewResolver
- ➢ UrlBasedViewResolver:
- ➢ InternalResourceViewResolver:
- ➢ FreeMarkerViewResolver
- ➢ ContentNegotiatingViewResolver
- UrlBasedViewResolver的功能与用法
在配置<mvc:annotation-driven…/>元素之后,它会为Spring MVC配置HandlerMapping、HandlerAdapter、HandlerExceptionResolver这三个特殊的Bean,它们解决了“请求URL→Controller的处理方法”的映射。
当Controller的处理方法处理完成后,该处理方法可返回String(逻辑视图名)、View(视图对象)、ModelAndView(同时包括Model与逻辑视图或View),而View对象才代表具体的视图,因此,Spring MVC必须使用ViewResolver将逻辑视图名(String)解析成实际视图(View对象)。
提示:
早期Spring MVC控制器的处理方法要求返回ModelAndView对象,这种方式显得有点过时;现在Spring MVC控制器的处理方法只要返回String(逻辑视图名),而Model只需被定义成处理方法形参即可。
ViewResolver的作用示意图如图
ViewResolver本身是一个接口,它提供了如下常用实现类。
➢ AbstractCachingViewResolver:
抽象视图解析器,负责缓存视图。很多视图都需要在使用前做好准备,它的子类视图解析器可以缓存视图。
➢ XmlViewResolver:
能接收XML配置文件的视图解析器,该XML配置文件的DTD与Spring的配置文件的dtd相同。默认的配置文件是/WEB-INF/views.xml。
➢ BeanNameViewResolver:它会直接从已有的容器中获取id为viewName的Bean作为View。
➢ ResourceBundleViewResolver
:使用ResourceBundle中的Bean定义实现ViewResolver,这个ResourceBundle由bundle的basename指定。这个bundle通常被定义在一个位于CLASSPATH中的属性文件中。
➢ UrlBasedViewResolver:
该视图解析器允许将视图名解析成URL,它不需要显式配置,只要视图名。
➢ InternalResourceViewResolver:
UrlBasedViewResolver的子类,能方便地支持Servlet和JSP视图以及JstlView和TilesView等子类,它是在实际开发中常用的视图解析器,也是Spring MVC默认的视图解析器。
➢ FreeMarkerViewResolver
:UrlBasedViewResolver的子类,能方便地支持FreeMarker视图。与之类似的还有GroovyMarkupViewResolver、TilesViewResolver等。
➢ ContentNegotiatingViewResolver
:它不是一个具体的视图解析器,它会根据请求的MIME类型来“动态”选择适合的视图解析器,然后将视图解析工作委托给所选择的视图解析器负责。
ViewResolver接口及其实现类的继承关系如图所示。
下面对这些视图解析器中的代表实现类进行介绍。
UrlBasedViewResolver的功能与用法
UrlBasedViewResolver继承了AbstractCachingViewResolver基类,是ViewResolver接口的一个简单实现类。UrlBasedViewResolver使用一种拼接URL的方式来解析视图,它可通过prefix属性指定一个前缀,也可通过suffix属性指定一个后缀,然后将逻辑视图名加上指定的前缀和后缀,这样就得到了实际视图的URL。
例如,指定prefix=“/WEB-INF/content/”,suffix=“.jsp”,当控制器的处理方法返回的视图名为“error”时,UrlBasedViewResolver解析得到的视图URL为/WEB-INF/content/error.jsp。默认的prefix和suffix属性值都是空字符串。
在使用URLBasedViewResolver作为视图解析器时,它支持在逻辑视图名中使用forword:前缀或redirect:前缀,其中forword:前缀代表转发到指定的视图资源,redirect:前缀代表重定向到指定的视图资源。
在使用UrlBasedViewResolver时必须指定viewClass属性,表示解析成哪种视图,一般使用较多的是InternalResourceView,用于呈现普通的JSP视图;如果希望使用JSTL,则应该将该属性值指定为JstlView。