springMVC源码分析--视图AbstractView和InternalResourceView(二)
2017-02-20 20:57
555 查看
上一篇博客 springMVC源码分析--视图View(一)中我们介绍了简单介绍了View的结构实现及运行流程,接下来我们介绍一下View的实现类做的处理操作。
AbstractView实现了render方法,主要做的操作是将model中的参数和request中的参数全部都放到Request中,然后就转发Request就可以了。
@Override
public void render(Map<String, ?> 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);
}
//将model和request中的参数全部放到mergedModel中
Map<String, Object> mergedModel = createMergedOutputModel(model, request, response);
//存放头部信息
prepareResponse(request, response);
//将mergedModel中的参数值放到request中
renderMergedOutputModel(mergedModel, getRequestToExpose(request), response);
}createMergedOutputModel中的操作就是将所有的数据放到mergedModel中。
AbstractView实现了render方法,主要做的操作是将model中的参数和request中的参数全部都放到Request中,然后就转发Request就可以了。
@Override
public void render(Map<String, ?> 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);
}
//将model和request中的参数全部放到mergedModel中
Map<String, Object> mergedModel = createMergedOutputModel(model, request, response);
//存放头部信息
prepareResponse(request, response);
//将mergedModel中的参数值放到request中
renderMergedOutputModel(mergedModel, getRequestToExpose(request), response);
}createMergedOutputModel中的操作就是将所有的数据放到mergedModel中。
protected Map<String, Object> createMergedOutputModel(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) { @SuppressWarnings("unchecked") Map<String, Object> pathVars = (this.exposePathVariables ? (Map<String, Object>) request.getAttribute(View.PATH_VARIABLES) : null); // Consolidate static and dynamic model attributes. int size = this.staticAttributes.size(); size += (model != null ? model.size() : 0); size += (pathVars != null ? pathVars.size() : 0); Map<String, Object> mergedModel = new LinkedHashMap<String, Object>(size); mergedModel.putAll(this.staticAttributes); if (pathVars != null) { mergedModel.putAll(pathVars); } if (model != null) { mergedModel.putAll(model); } // Expose RequestContext? if (this.requestContextAttribute != null) { mergedModel.put(this.requestContextAttribute, createRequestContext(request, response, mergedModel)); } return mergedModel; }prepareResponse中的操作就是在头部中添加信息。
protected void prepareResponse(HttpServletRequest request, HttpServletResponse response) { if (generatesDownloadContent()) { response.setHeader("Pragma", "private"); response.setHeader("Cache-Control", "private, must-revalidate"); } }renderMergedOutputModel是在子类中实现的,我们介绍一下我们经常使用的普通jsp源码使用的InternalResourceView
@Override protected void renderMergedOutputModel( Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception { //把model中的所有数据放到request中 exposeModelAsRequestAttributes(model, request); exposeHelpers(request); //看看是否有跳转页面 String dispatcherPath = prepareForRendering(request, response); // Obtain a RequestDispatcher for the target resource (typically a JSP). RequestDispatcher rd = getRequestDispatcher(request, dispatcherPath); if (rd == null) { throw new ServletException("Could not get RequestDispatcher for [" + getUrl() + "]: Check that the corresponding file exists within your web application archive!"); } // If already included or response already committed, perform include, else forward. if (useInclude(request, response)) { response.setContentType(getContentType()); if (logger.isDebugEnabled()) { logger.debug("Including resource [" + getUrl() + "] in InternalResourceView '" + getBeanName() + "'"); } //加载页面 rd.include(request, response); } else { // Note: The forwarded resource is supposed to determine the content type itself. if (logger.isDebugEnabled()) { logger.debug("Forwarding to resource [" + getUrl() + "] in InternalResourceView '" + getBeanName() + "'"); } //转发操作 rd.forward(request, response); } }以上代码就完成了springMVC的所有处理操作,springMVC最终的操作就是调用request及response完成请求操作了。
相关文章推荐
- springMVC源码分析--视图AbstractView和InternalResourceView(二)
- Springmvc视图解析器InternalResourceViewResolver问题分析
- 数据传递--------博客-----------springMVC源码分析--RequestToViewNameTranslator请求到视图名称的转换
- springMVC初探视图解析器——InternalResourceViewResolver(内部资源视图解析器)
- springMVC源码分析--RequestToViewNameTranslator请求到视图名称的转换
- springMVC源码分析--视图View(一)
- SpringMVC 视图解析器InternalResourceViewResolver(真实路径和逻辑路径)
- springMVC源码分析--RequestToViewNameTranslator请求到视图名称的转换
- springmvc中如何正确的解析视图InternalResourceViewResolver
- SpringMVC视图解析器InternalResourceViewResolver
- springMVC初探视图解析器——InternalResourceViewResolver
- 【SpringMVC】视图解析器InternalResourceViewResolve(四)
- springMVC源码分析--RequestToViewNameTranslator请求到视图名称的转换
- 视图解析器InternalResourceViewResolver
- Thinkphp源码分析系列(九)–视图view类
- Spring mvc 视图解析器 ContentNegotiatingViewResolver 源码分析
- SpringMVC源码分析(3):分析ModelAndView的形成过程