spring mvc DispatcherServlet详解之---视图渲染过程(二)

2014-11-23 17:33:35 · 作者: · 浏览: 67
ilesView, VelocityLayoutView, VelocityToolboxView, VelocityView, XsltView
--------------------------------------------------------------------------------
public interface ViewMVC View for a web interaction. Implementations are responsible for rendering content, and exposing the model. A single view exposes multiple model attributes.
This class and the MVC approach associated with it is discussed in Chapter 12 of Expert One-On-One J2EE Design and Development by Rod Johnson (Wrox, 2002).
View implementations may differ widely. An obvious implementation would be JSP-based. Other implementations might be XSLT-based, or use an HTML generation library. This interface is designed to avoid restricting the range of possible implementations.
Views should be beans. They are likely to be instantiated as beans by a ViewResolver. As this interface is stateless, view implementations should be thread-safe.
复制代码
spring提供了如此多的视图,那么肯定的是也会有很多视图解析器:
复制代码
org.springframework.web.servlet
Interface ViewResolver
All Known Implementing Classes:
AbstractCachingViewResolver, AbstractTemplateViewResolver, BeanNameViewResolver, ContentNegotiatingViewResolver, FreeMarkerViewResolver, InternalResourceViewResolver, JasperReportsViewResolver, ResourceBundleViewResolver, TilesViewResolver, TilesViewResolver, UrlBasedViewResolver, VelocityLayoutViewResolver, VelocityViewResolver, XmlViewResolver, XsltViewResolver
Functional Interface:
This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.
--------------------------------------------------------------------------------
public interface ViewResolverInterface to be implemented by objects that can resolve views by name.
View state doesn't change during the running of the application, so implementations are free to cache views.
Implementations are encouraged to support internationalization, i.e. localized view resolution.
复制代码
其中,针对JSP提供的InternalResourceViewResolver与InternalResourceView。
我们先看一下view的render方法是什么样子的?
根据InternalResourceView的继承关系:
org.springframework.web.servlet.view.AbstractView
org.springframework.web.servlet.view.AbstractUrlBasedView
org.springframework.web.servlet.view.InternalResourceView
最终找到render方法在AbstractView中,如下代码所示:
复制代码
/**
* Prepares the view given the specified model, merging it with static
* attributes and a RequestContext attribute, if necessary.
* Delegates to renderMergedOutputModel for the actual rendering.
* @see #renderMergedOutputModel
*/
@Override
public void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception {
if (logger.isTraceEnabled()) {
logger.trace("Rendering view with name '" + this.beanName + "' with model " + model +
" and static attributes " + this.staticAttributes);
}
Map mergedModel = createMergedOutputModel(model, request, response);
prepareResponse(request, response);
renderMergedOutputModel(mergedModel, request, response);
}
复制代码
流程如下:
创建一个动态值和静态属性的map;
设置response 报文头;
把渲染view的工作放到r