spring mvc DispatcherServlet详解之---视图渲染过程(二)
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.
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