跳到主要內容

深入淺出Spring MVC_包裝設計


※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面



網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。



摘要


本文旨在詳細分析SpringMVC工作原理以及作為開發者如何基於SpringMVC做擴展。因為SpringMVC分析的文章比較多,所以本文重點講解如何利用SpringMVC的擴展點實現我們的需求。


什麼是Spring MVC


SpringMVC的作用是什麼呢?需要解決什麼問題呢?


下圖是一個客戶端與服務端的交互



在之前的詳解http報文(2)-web容器是如何解析http報文的一文中我也提到過。
這次再更細緻的分析一遍。一個請求如何中客戶端發到服務端,再從服務端返回內容。乾的這件事在web中叫請求動態內容,區別於靜態內容。在java語言中,為了解決這件事定義了一個規範就是servlet。具體的實現由各大廠商自己定義。


大體部分分為兩部分一塊是建立連接、一塊是傳輸內容。所以servlet規範包括兩大部分,,一部分是servlet接口,定義處理請求的規範。一部分是servlet容器的,去管理加載servlet實例。


輕量級的servlet容器有tomcat/jetty/undertow,servlet框架有SpringMVC/Struts/Webx這些,本篇重點講解SpringMVC


SpringMVC工作流程



Spring MVC 顧名思義就是處理Controll-Model-View的。



  1. DispatchServlet 是入口,doDispatch方法開始處理請求

  2. 首先經過controll,controll包含兩部分,一部分是url處理映射,將url與具體的處理bean映射起來。也就是HandleMapping,另一部分是具體的Handle,因為需要不同的handle,所以定義了HandleAdapter.

  3. Model比較簡單,主要就是ModelView對象,

  4. View 包含兩部分,一部分是ViewName的解析,另一部分是ViewName的對應的模板引擎,來渲染出最終的模板引擎。


常見擴展點


基於以上,Spring MVC 提供了不同層面的擴展,方便開發者實現定製化的功能,而不需要底層代碼的修改


一. Filter


Filter其實不算是SpringMVC,是servlet的,這時候請求還沒有到DispatchServlet。Filter允許對請求和響應做一些統一的定製化處理,比如你限流、日誌、trace。


實現javax.servlet.Filter接口即可


二. Controll - HandleMapping,HandlerAdapter


HandleMapping屬於Controll層面,我們可以編寫任意的HandlerMapping實現類,然後定義策略來決定一個web請求到HandlerExecutionChain對象的生成。


繼承RequestMappingHandlerMapping 類即可。
這個具體案例可以看下fredal的博客-使用基於 SpringMVC 的透明 RPC 開發微服務


簡要來說,他的rpc通信協議是基於http的。所以rpc調用就是基於服務端還是原來的restful api。寫法給普通的前端去掉無異,然後包一層rpc client。方便客戶端調用。但是這樣太麻煩了,對於不需要暴露給前端的API,單純是服務間的rpc調用。再走一遍servlet-SpringMVC沒必要。


※產品缺大量曝光嗎?你需要的是一流包裝設計!



窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。




所以他基於RequestMappingHandlerMapping做了一個改造。不再基於SpringMVC,而是自己定義了一套rpc的範式,然後轉換為springmvc。


三. Controll - Interceptor


Interceptor屬於Controll層面,我們可以自定義各種攔截器,在一個請求被真正處理之前、請求被處理但還沒輸出到響應中、請求已經被輸出到響應中之後這三個時間點去做任何我們想要做的事情。廣泛應用於Log,Session,鑒權等場景。


實現HandlerInterceptor接口即可


四. View - HandlerMethodArgumentResolver


解析方法參數的,可以很方便的擴展http請求參數。
實現HandlerMethodArgumentResolver接口即可


比如需要從http header中處理設備信息


@Component
public class DeviceResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(final MethodParameter methodParameter) {
return methodParameter.getParameterType().equals(DeviceInfo.class);
}

@Override
public Object resolveArgument(final MethodParameter methodParameter,
final ModelAndViewContainer modelAndViewContainer,
final NativeWebRequest nativeWebRequest,
final WebDataBinderFactory webDataBinderFactory) throws Exception {
HttpServletRequest request =
(HttpServletRequest) nativeWebRequest.getNativeRequest(HttpServletRequest.class);

// 從head頭中獲取設備信息
String id = request.getHeader("x-device-id");
if (id != null) {
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.setId("id");
return deviceInfo;
}
return null;
}
}

五. View - Converter


類型轉換器,主要和序列化相關,參數綁定時springmvc會對將前端傳來的參數通過某種規則轉化成方法定義的參數的類型,默認實現的有StringHttpMessageConverterByteArrayHttpMessageConverter等等,默認的不能滿足需求時我們可自己定義此接口來實現自己的類型的轉換。


繼承AbstractHttpMessageConverter 即可。


六. View- HandlerExceptionResolver


異常處理,通常需要定義的全局異常。


@ControllerAdvice 註解即可
在一次和前端的相互甩鍋的問題記錄中有總結過這種


七. 修改requestbody 內容


當我們需要對RequestBody的內容進行統一處理時,因為HandlerMethodArgumentResolver只能處理特定類型的,做不到這點要求。


實現RequestBodyAdvice 接口即可。比如我需要處理requestbody中的內容,將emoji輸入轉換掉


@RestControllerAdvice
public class EmojiReplaceAdvice implements RequestBodyAdvice {
@Override
public boolean supports(final MethodParameter methodParameter, final Type targetType,
final Class<? extends HttpMessageConverter<?>> converterType) {
return methodParameter.hasParameterAnnotation(EmojiReplace.class);
}

@Override
public Object handleEmptyBody(final Object body, final HttpInputMessage inputMessage,
final MethodParameter parameter, final Type targetType,
final Class<? extends HttpMessageConverter<?>> converterType) {
return body;
}

@Override
public HttpInputMessage beforeBodyRead(final HttpInputMessage inputMessage,
final MethodParameter parameter,
final Type targetType, final Class<? extends HttpMessageConverter<?>> converterType)
throws IOException {
return new HttpInputMessage() {
@Override
public InputStream getBody() throws IOException {
final String content = IOUtils.toString(inputMessage.getBody());
final String emojiUnicodeToAlias = StringUtil.parseEmojiUnicodeToAlias(content);
return new ByteArrayInputStream(
emojiUnicodeToAlias.getBytes(StandardCharsets.UTF_8));
}

@Override
public HttpHeaders getHeaders() {
return inputMessage.getHeaders();
}
};
}

@Override
public Object afterBodyRead(final Object body, final HttpInputMessage inputMessage,
final MethodParameter parameter, final Type targetType,
final Class<? extends HttpMessageConverter<?>> converterType) {
return body;
}
}

總結


這篇文章主要是系統的概括了SpringMVC的工作原理和各種擴展機制,屬於高度概括,細節不足。具體的每個擴展點的實現、坑、應用場景需要在之後的文章繼續闡述。


參考


https://fredal.xin/develop-with-transparent-rpc

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

南投搬家公司費用需注意的眉眉角角,別等搬了再說!



上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務





Orignal From: 深入淺出Spring MVC_包裝設計

留言

這個網誌中的熱門文章

掃地機器人可以隨身帶上飛機嗎?我想要拿去送給國外的朋友

掃地機器人如果要隨身戴上飛機需要滿足兩個條件: 一個是掃地機器人連同你的隨身行李,整體的體積和重量要符合上機條件,這個具體每家航空公司都不同,可以諮詢,簡單的說就是隨身行李不要超寬超重。 還有一個就是由於掃地機器人內置了鋰電池,所以內置電池的容量要符合相關規定,每個掃地機器人電池容量都不同,具體自行查詢。 根據民航的相關安全要求,凡帶有鋰電池的電子設備均不可以托運,但符合重量要求,尺寸要求以及電量要求的鋰電池及其設備是可以帶上飛機的。 《鋰電池航空運輸規範》中內含鋰離子電池的設備電池額定能量不應超過100Wh的規定,符合國標GB31241-2014,並通過UN38.3航空運輸認證等國際安全標準,所以可以帶上飛機。但是不能托運,只能隨身攜帶。 掃地機器人     掃地機器人     掃地機器人吸塵器 http://www.greenh3y.com/?p=400 Orignal From: 掃地機器人可以隨身帶上飛機嗎?我想要拿去送給國外的朋友

不滿國際規範斷財路 非洲多國擬退野生動保公約

摘錄自2019年09月01日中央通訊社非洲報導 非洲南部多國揚言退出「瀕臨絕種野生動植物國際貿易公約」,因為公約多數成員拒絕放寬象牙與犀牛角交易,並且幾乎全面禁止將野生捕獲的大象送到動物園。 這個公約嚴格規範全球野生動物交易,包括限制象牙與犀牛角交易。 本週在日內瓦召開修訂「瀕臨絕種野生動植物國際貿易公約」(CITES)的會議期間,由於區域集團非南開發共同體(SADC)的多項提案遭否決,這個集團與公約的關係惡化。 全球大象數量最多的區域波札那、納米比亞與辛巴威要求販售取自自然死亡、充公與汰除的大象象牙,這項提議被居多數的101票否決。 40多年前制訂的CITES規範約3萬6000種動植物交易,並設計有助於遏止非法交易和制裁違規國家的機制。 不過有16個成員國的非南開發共同體部分會員批評CITES對非洲國家的問題視若無睹。 坦尚尼亞環境部長西蒙巴徹恩(George Simbachawene)於日內瓦召開的會議中表示:「結果無法採取進步、公平、包容與基於科學的的保育策略。」 他說:「該是認真重新考慮我們加入CITES是否有任何實質益處的時候了。」 本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理 【搬家相關資訊指南】 台中搬家 , 彰化搬家 , 南投搬家 前需注意的眉眉角角,別等搬了再說! 避免吃悶虧無故遭抬價! 台中搬家公司 免費估價,有契約讓您安心有保障! 評比 彰化搬家公司費用 , 南投搬家公司費用 收費行情懶人包大公開 彰化搬家費用 , 南投搬家費用 ,距離,噸數怎麼算?達人教你簡易估價知識! Orignal From: 不滿國際規範斷財路 非洲多國擬退野生動保公約

春河劇團《叫我林彩香》 9/16新竹縣政府文化局登場

春河劇團《叫我林彩香》舞台劇訂於9月16日下午在新竹縣政府文化局演藝廳演出。(圖/新竹縣政府提供) 記者蔡孟尚/新竹報導 春河劇團《叫我林彩香》舞台劇訂於9月16日下午在新竹縣政府文化局演藝廳登場,導演也是劇團團長郎祖筠表示,《叫我林彩香!》是公視劇《我的婆婆怎麼那麼可愛》的前傳,劇情回到婆婆年輕時那個經濟起飛的年代,透過母女之間的相處,刻畫台灣女性在社會轉變過程中的角色與地位,「林彩香」是個代名詞,每個自我意識覺醒的女生,都是可敬、可愛的林彩香。 《叫我林彩香》 演員有高玉珊、呂曼茵、鍾瑶、陳漢典、楊小黎、吳怡霈,劇情以以女性視角剖析傳統台灣家庭、社會,除了可以看到當時代人們對於女性角色的刻板印象外,也可以一窺台灣當時的時代樣貌,例如大家族裡的婆婆是如何咄咄逼人、母親一個女人如何隻身照養一大票小孩,而作為一個女人到底又該如何面對整個社會?年輕時期的彩香嚮往外面世界的自由,從女兒成為了母親,又從母親變成了婆婆,彩香的重心似乎又從外界,慢慢的被拉回家庭中,《叫我林彩香!》劇名的由來,是林彩香對著整個世界的一聲吶喊,不管現在是什麼身分,她最希望的便是可以讓自己被所有給認可。 請問 台中電動車 哪裡在賣比較便宜可以到台中景泰電動車門市去看看總店:臺中市潭子區潭秀里雅潭路一段102-1號。 電動車補助 推薦評價好的 iphone維修 中心擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢住家的頂樓裝 太陽光電 聽說可發揮隔熱功效一線推薦東陽能源擁有核心技術、產品研發、系統規劃設置、專業團隊的太陽能發電廠商。 網頁設計 一頭霧水該從何著手呢? 回頭車 貨運收費標準宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念 台中搬家公司 教你幾個打包小技巧,輕鬆整理裝箱!還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」 台中搬家 公司費用怎麼算?擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司好山好水 露營車 漫遊體驗露營車x公路旅行的十一個出遊特色。走到哪、玩到哪,彈性的出遊方案,行程跟出發地也可客製 Google地圖已可更新顯示 潭子電動車 充電站設置地點!!廣告預算用在刀口上, 台北網頁設計 公司幫您達到更多曝光...