
在《springMV(7)模型视图方法源码综合分析》一文中,我们介绍了ModelAndView的用法,它会在控制层方法调用完毕后作为返回值返回,里面封装好了我们的业务逻辑数据和视图对象或视图名
。下一步,视图对象往往会对模型进一步渲染,再由视图解析器进一步解析并向前端发出响应。在下面,我们详细介绍视图和视图解析器的各种分类。jsp web项目
在View接口中,定义了一个核心方法是:
void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;
1
1
它的作用主要是渲染模型数据,整合web资源,并以特定形式响应给客户,这些形式可以是复杂JSP页面,也可以是简单的json、xml字符串。
针对不同的响应形式,spring为我们设计了不同的View实现类:
针对不同的视图对象,我们使用不同的视图解析器来完成实例化工作。我们可以在spring上下文配置多个视图解析器,并通过order属性来指定他们之间的解析优先级顺序,order 越小,对应的 ViewResolver 将有越高的解析视图的权利。当一个 ViewResolver 在进行视图解析后返回的 View 对象是 null 的话就表示该 ViewResolver 不能解析该视图,这时候就交给优先级更低的进行解析,直到解析工作完成,如果所有视图解析器都不能完成将解析,则会抛出异常。
类似于视图,Spring也为我们提供了众多的视图解析器实现类:

1.View接口
视图基础接口,它的各种实现类是无状态的,因此是线程安全的。 该接口定义了两个方法:

2.AbstractView抽象类
View接口的基础实现类。我们稍微介绍一下这个抽象类。
首先看下这个类的属性:

再看下抽象类中接口方法的实现:
getContentType方法直接返回contentType属性即可。

render方法:

3.AbstractUrlBasedView抽象类
继承自AbstractView抽象类,增加了1个类型为String的url参数。
4.InternalResourceView类
继承自AbstractUrlBasedView抽象类的类,表示JSP视图。
我们看下这个类的renderMergedOutputModel方法(AbstractView抽象类定义的抽象方法,为View接口提供的render方法服务)。

5.JstlView类
JSTL视图,继承自InternalResourceView,该类大致上与InternalResourceView类一致。
6.AbstractTemplateView抽象类
继承自AbstractUrlBasedView抽象类,重写了renderMergedOutputModel方法,在该方法中会调用renderMergedTemplateModel方法,renderMergedTemplateModel方法为新定义的抽象方法。

该抽象类有几个boolean属性exposeSessionAttributes,exposeRequestAttributes。 设置为true的话会将request和session中的键值和值丢入到renderMergedTemplateModel方法中的model这个Map参数中。
这个类是某些模板引擎视图类的父类。 比如FreemarkerView,VelocityView。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-77343-1.html