springMVC源码分析--视图AbstractView和InternalResourceView(二)

来源:互联网 发布:idc销售网站php源码 编辑:程序博客网 时间:2024/05/04 13:35

上一篇博客 springMVC源码分析--视图View(一)中我们介绍了简单介绍了View的结构实现及运行流程,接下来我们介绍一下View的实现类做的处理操作。

AbstractView实现了render方法,主要做的操作是将model中的参数和request中的参数全部都放到Request中,然后就转发Request就可以了。

@Overridepublic 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
@Overrideprotected 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完成请求操作了。


2 0
原创粉丝点击