1. 程式人生 > >SpringMVC原始碼剖析(一)- 從抽象和介面說起

SpringMVC原始碼剖析(一)- 從抽象和介面說起

註明:文章是本人在中國開源網上看到的經典文章,出處:http://my.oschina.net/lichhao 作者:相見歡

SpringMVC作為Struts2之後異軍突起的一個表現層框架,正越來越流行,相信javaee的開發者們就算沒使用過SpringMVC,也應該對其略有耳聞。我試圖通過對SpringMVC的設計思想和原始碼實現的剖析,從抽象意義上的設計層面和實現意義上的程式碼層面兩個方面,逐一揭開SpringMVC神祕的面紗,本文的程式碼,都是基於Spring的 3.1.3RELEASE版本。

任何一個框架,都有自己特定的適用領域,框架的設計和實現,必定是為了應付該領域內許多通用的,煩瑣的、基礎的工作而生。SpringMVC作為一個表現層框架,也必須直面Web開發領域中表現層中的幾大課題,並給出自己的回答:

  • URL到框架的對映。
  • http請求引數繫結
  • http響應的生成和輸出

這三大課題,組成一個完整的web請求流程,每一個部分都具有非常廣闊的外延。SpringMVC框架對這些課題的回答又是什麼呢?

學習一個框架,首要的是要先領會它的設計思想。從抽象、從全域性上來審視這個框架。其中最具有參考價值的,就是這個框架所定義的核心介面。核心介面定義了框架的骨架,也在最抽象的意義上表達了框架的設計思想。

下面我以一個web請求流程為載體,依次介紹SpringMVC的核心介面和類。

使用者在瀏覽器中,輸入了http://www.xxxx.com/aaa/bbb.ccc的地址,回車後,瀏覽器發起一個http請求。請求到達你的伺服器後,首先會被SpringMVC註冊在web.xml中的前端轉發器DispatcherServlet接收,DispatcherServlet是一個標準的Servlet,它的作用是接受和轉發web請求到內部框架處理單元。

下面看一下第一個出現在你面前的核心介面,它是在org.springframework.web.servlet包中定義的HandlerMapping介面:

01 package org.springframework.web.servlet;
02
03 import javax.servlet.http.HttpServletRequest;
04
05 public interface HandlerMapping {
06
07 String PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE = HandlerMapping.class.getName() + ".pathWithinHandlerMapping";
08
09 String BEST_MATCHING_PATTERN_ATTRIBUTE = HandlerMapping.class.getName() + ".bestMatchingPattern";
10
11 String INTROSPECT_TYPE_LEVEL_MAPPING = HandlerMapping.class.getName() + ".introspectTypeLevelMapping";
12
13 String URI_TEMPLATE_VARIABLES_ATTRIBUTE = HandlerMapping.class.getName() + ".uriTemplateVariables";

相關推薦

SpringMVC原始碼剖析- 抽象介面

註明:文章是本人在中國開源網上看到的經典文章,出處:http://my.oschina.net/lichhao 作者:相見歡 SpringMVC作為Struts2之後異軍突起的一個表現層框架,正越來越流行,相信javaee的開發者們就算沒使用過Sprin

SpringMVC原始碼剖析SpringMVC整體架構分析建立

先看一下Servlet的繼承結 前面的Servlet體系我都有講過HttpServlet實現了根據動作分發請求 其他結構重要的類為HttpServletBean,FrameworkServlet ,DispatcherServlet 在Spring中實現了XXXAware

springmvc學習筆記 -- 零搭建,基礎入門

out hand char webapp core localhost list ges del 1、新建maven項目 參考mybatis學習筆記(五) -- maven+spring+mybatis從零開始搭建整合詳細過程(上)第一部分,修改配置 2、修

Glide原始碼分析用法來看之with方法

繼續啃原始碼,用過Glide的人,肯定都覺得它好好用,我們一般只需要幾行程式碼,就可以達到我們想要的效果,可以在這個背後是什麼呢?就需要我們來看了。 我一般看原始碼,我喜歡先從用法來看,然後一步一步的再細扣,所以就先從用法來看Glide的整體流程。 用過Glide的人,用下面這段

Koa原始碼閱讀搭建Web伺服器說

先複習一下使用原生 Node.js 搭建一個 Web 伺服器。 var http = require('http'); var server = http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'te

STL原始碼剖析

歡迎大家來訪二笙的小房子,一同學習分享生活! 寫在前面 學習STL,瞭解STL的歷史與發展,深度剖析STL原始碼,提高自己的程式設計能力!!! 1.瞭解STL 1.1 STL概述 STL誕生:為了建立資料結構和演算法的一套標準,並且降低其間的耦合關係以提

SpringMVC原始碼剖析- HandlerExceptionResolver異常解析器家族揭祕

在Spring MVC中,所有用於處理在請求處理過程中丟擲的異常,都要實現HandlerExceptionResolver介面。HandlerExceptionResolver是Spring MVC提供的非常好的通用異常處理工具,不過需要注意的是,它只能處理請求過程中丟擲的

Python 原始碼剖析【python物件】

處於研究python記憶體釋放問題,在閱讀部分python原始碼,順便記錄下所得。 (基於《python原始碼剖析》(v2.4.1)與 python原始碼(v2.7.6)) 先列下總結:         python 中一切皆為物件,所以會先講明白pyth

darknet原始碼剖析

darknet編譯較為簡單,在github上下載程式碼後直接make即可。注意更改makefile檔案中的相關選項。 GPU=1 CUDNN=1 OPENCV=0 OPENMP=0 DEBUG=1 編譯完成後即可開始使用。根據yolov3的訓練與測試過程,對darknet

【推薦】SpringMVC原始碼總結HandlerMappingHandlerAdapter入門

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {          HttpServletRequest processedRequest = reque

Kaggle競賽優勝者原始碼剖析

比賽題目連結:https://www.kaggle.com/c/amazon-employee-access-challenge 優勝者Github:https://github.com/pyduan/amazonaccess     該題目提供的資料集特徵數較少,能拿到

Redis原始碼剖析伺服器與客戶端互動流程

Redis中的C/S模型 Redis底層還是基於網路請求的,對於單機資料庫而言,網路請求僅僅是在一臺機器上互動,即伺服器客戶端都在一臺計算機上 當在終端輸入redis-serve時,便啟動了一個Redis伺服器,隨後開始初始化內部資料,對於Redis而言包括

caffe原始碼剖析--整體目錄結構

從今天開始,我們來細緻的分析一下caffe的原始碼。(此係列僅分析caffe原始版本,對於caffe2不涉及,並且只分析各類實現的cpu版,對於gpu實現筆者精力和能力有限,暫不作分析) 分析原始碼之前,我們需要對caffe的程式碼結構有一定的瞭解,只有充分了解了原始碼的組

SpringMVC原始碼剖析- DispatcherServlet的前世今生

上一篇文章《SpringMVC原始碼剖析(一)- 從抽象和介面說起》中,我介紹了一次典型的SpringMVC請求處理過程中,相繼粉墨登場的各種核心類和介面。我刻意忽略了原始碼中的處理細節,只列出最簡單的類甚至是介面類,目的就是讓大家先從最高層次的抽象意義上來審視Spr

Spark SQL原始碼剖析SQL解析框架Catalyst流程概述

Spark SQL模組,主要就是處理跟SQL解析相關的一些內容,說得更通俗點就是怎麼把一個SQL語句解析成Dataframe或者說RDD的任務。以Spark 2.4.3為例,Spark SQL這個大模組分為三個子模組,如下圖所示 其中Catalyst可以說是Spark內部專門用來解析SQL的一個框架,在H

vue 原始碼學習 目錄結構構建過程簡介

Flow vue框架使用了Flow作為型別檢查,來保證專案的可讀性和維護性。vue.js的主目錄下有Flow的配置.flowconfig檔案,還有flow目錄,指定了各種自定義型別。 在學習原始碼前可以先看下Flow的語法 官方文件 目錄結構 vue.js原始碼主要在src下 src ├── com

AFNetworking3.1.0原始碼分析整體框架功能模組

簡介 1:基於系統NSURLSession類族封裝完成HPPT/HPPTS(GET,PUT,PSOT,DELEATE,HEAD)網路請求 2:擴充套件部分UIKit控制元件,比如擴充套件UIIMag

零開始學習區塊鏈技術--原始碼編譯比特幣

寫在開始之前,為什麼你一定要學習區塊鏈技術? 技術的變革和迭代一直在飛速發展中,作為有著15年程式開發經驗的我,常常在思考現在的我們到底改如何做,到底應該學習些什麼,才能跟上新的時代變革,保持自身的競爭力,並且能為這個世界帶來更好的改變呢? 答案是,學習

優秀開源軟件學習系列——零學習Spring4以及學習方法分享

文檔 軟件 準備 相關性 培訓 獎勵 在哪裏 方式 列表 一、目的1.掌握Spring4怎樣使用,以便將這個框架作為自己的一項技能。2.掌握Spring官網是怎樣介紹其產品的,在心中對Spring有最官方的、最直觀的了解。在Spring的相關領域,能夠知道怎麽下載Sprin

30天自制操作系統計算機結構到匯編程序入門

ios 是什麽 program 信號 解釋 根目錄 自己 保存 音樂 學習這本書不代表我要親自動手把這本書中的代碼敲一遍哦,只是借機來學習一下操作系統。之前有段時間也在看操作系統的知識,怎麽說呢之前的看的書都是偏講理論多一些,對於我這個非科班出身的來說,由於之前的計算機知識