上一篇博客 sPRingMVC源碼分析--視圖View(一)中我們介紹了簡(jiǎn)單介紹了View的結(jié)構(gòu)實(shí)現(xiàn)及運(yùn)行流程,接下來(lái)我們介紹一下View的實(shí)現(xiàn)類(lèi)做的處理操作。
AbstractView實(shí)現(xiàn)了render方法,主要做的操作是將model中的參數(shù)和request中的參數(shù)全部都放到Request中,然后就轉(zhuǎn)發(fā)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中的參數(shù)全部放到mergedModel中 Map<String, Object> mergedModel = createMergedOutputModel(model, request, response); //存放頭部信息 prepareResponse(request, response); //將mergedModel中的參數(shù)值放到request中 renderMergedOutputModel(mergedModel, getRequestToExpose(request), response); }createMergedOutputModel中的操作就是將所有的數(shù)據(jù)放到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是在子類(lèi)中實(shí)現(xiàn)的,我們介紹一下我們經(jīng)常使用的普通jsp源碼使用的InternalResourceView@Override protected void renderMergedOutputModel( Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception { //把model中的所有數(shù)據(jù)放到request中 exposeModelAsRequestAttributes(model, request); exposeHelpers(request); //看看是否有跳轉(zhuǎn)頁(yè)面 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() + "'"); } //加載頁(yè)面 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() + "'"); } //轉(zhuǎn)發(fā)操作 rd.forward(request, response); } }以上代碼就完成了springMVC的所有處理操作,springMVC最終的操作就是調(diào)用request及response完成請(qǐng)求操作了。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注