想說(shuō)說(shuō)自己Spring的學(xué)習(xí)路程,課余自學(xué)Spring將近一年了,還是不得其道。去年暑假學(xué)習(xí)了一下JSP,并沒(méi)有深入理解,所以導(dǎo)致學(xué)習(xí)Spring時(shí)對(duì)著書(shū)本寫(xiě)一些demo,感覺(jué)自己理解了,其實(shí)并不知道內(nèi)部時(shí)什么原理,出了問(wèn)題不停的百度,一個(gè)小問(wèn)題好幾天解決不了。
學(xué)習(xí)一種框架最先需要知道的是為什么需要使用這個(gè)框架,任何一個(gè)框架的發(fā)明都是為了解決編程中的一些痛點(diǎn),打開(kāi)任何一本hibernate或者其他框架的入門(mén)書(shū),第一章都是介紹框架的理念和優(yōu)勢(shì)。如果需要理解這些理念和優(yōu)勢(shì),那么你需要知道不使用這個(gè)框架之前是怎么處理的,才能知道框架做了一些什么事情。
針對(duì)Spring的學(xué)習(xí),第一步就是理解IoC和AOP;這是基礎(chǔ);然后學(xué)習(xí)SpringMVC,其實(shí)還是Java EE開(kāi)發(fā),如果要理解這個(gè)框架,就要知道沒(méi)有這個(gè)框架之前,使用的是什么技術(shù)。
很多新的技術(shù)只不過(guò)是引入了新的編程元素對(duì)原來(lái)技術(shù)進(jìn)行了封裝。
Web開(kāi)發(fā),首先需要理解的是 HTTP協(xié)議,這部分一定要深入理解。理解http請(qǐng)求,其實(shí)就是要知道下面這張圖的含義。
<img src="https://pic1.zhimg.com/bfb576a894f3702b39a0bc3588b72ab0_b.jpg" data-caption="" data-rawwidth="800" data-rawheight="228" class="origin_image zh-lightbox-thumb" width="800" data-original="https://pic1.zhimg.com/bfb576a894f3702b39a0bc3588b72ab0_r.jpg"/>

還要知道服務(wù)器發(fā)送給瀏覽器的響應(yīng)是沒(méi)有沒(méi)有JS,CSS和圖片等外部資源的,瀏覽器在解析響應(yīng)時(shí)才會(huì)再次請(qǐng)求這些資源,這里會(huì)出現(xiàn)一些靜態(tài)資源請(qǐng)求不到的問(wèn)題,SpringMVC是怎么配置的?
接下來(lái),學(xué)習(xí)Servlet和JSP。這個(gè)步驟不是可以跳過(guò)的,現(xiàn)在流行的框架Spring MVC和Struts2其實(shí)都是基于Servlet的,只有深入理解了Servlet才能理解后面的新技術(shù)。
下面幾個(gè)知識(shí)點(diǎn)可以檢測(cè)你是否理解了Servlet:
1、什么是ServletContext,和tomcat等web容器的關(guān)系時(shí)什么?Servlet 工作原理解析
簡(jiǎn)單的說(shuō),我們?cè)跒g覽器點(diǎn)擊鏈接和按鈕產(chǎn)生的消息不是發(fā)送給Servlet的,而是發(fā)送給web容器的(在JSP出現(xiàn)之前,web容器也叫Servlet容器),web容器接收消息后不知道怎么處理,轉(zhuǎn)交給我們編寫(xiě)的Servlet處理,那么web容器怎么和Servlet交流呢?于是就出現(xiàn)了Servlet接口,接口是定義一種規(guī)范的良好表達(dá)形式。只要我們編寫(xiě)的Java類(lèi)符合Servlet規(guī)范,那么就能被Web容器識(shí)別并被容器管理。
2、什么是Session?Session在實(shí)際工程中的應(yīng)用場(chǎng)景。以及@SessionAttribute注解的局限性。
3、JSP是面向服務(wù)器的,它并不知道瀏覽器是什么鬼,是我們?cè)趯?xiě)JSP時(shí)預(yù)設(shè)客戶(hù)端是瀏覽器,JSP就是一個(gè)Servlet。JSP的常用對(duì)象和指令。
4、JSP的中文編碼亂碼有幾種情況?各自的解決方法?提示: JSP文件的編碼,瀏覽器的解析編碼,GET請(qǐng)求的編碼,POST的編碼。
5、Servlet是一種接口規(guī)范,其中請(qǐng)求和響應(yīng)是Servlet容器通過(guò)向方法的參數(shù)賦值HttpServletRequest或者HttpServletResponse傳遞的。在Struts1里面,將doGet()方法里的響應(yīng)移到返回值里。在Struts2里則:
在Controller中徹底杜絕引入HttpServletRequest或者HttpServletResponse這樣的原生Servlet對(duì)象。
同時(shí)將請(qǐng)求參數(shù)和響應(yīng)數(shù)據(jù)都從響應(yīng)方法中剝離到了Controller中的屬性變量。
這是一個(gè)很大的技術(shù)改造,也造成了Struts2的盛行。Spring MVC走的是中間路線(xiàn),Spring的2.0.8之前的版本甚至直接使用Servlet的doGet的。Spring MVC現(xiàn)在開(kāi)始流行主要還是因?yàn)镾chema xml的精簡(jiǎn)和基于注解的配置。所以這里出現(xiàn)了新的知識(shí)點(diǎn):Schema Based XML的相關(guān)知識(shí)和Java5引入的注解原理。
參考文獻(xiàn):
博客專(zhuān)欄 - SpringMVC深度探險(xiǎn)
強(qiáng)烈推薦看兩遍。
書(shū)籍:推薦許令波的書(shū)《深入分析Java Web技術(shù)內(nèi)幕(修訂版)》和計(jì)文柯的《深入理解spring技術(shù)內(nèi)幕》,特別是第二本,對(duì)spring的分析很是徹底。
? ? ? 查看源碼是比較快的學(xué)習(xí)方法,在一個(gè)項(xiàng)目里直接利用debug的方式追蹤變量查看源碼,而不是去閱讀源碼。
如何使用eclipse的debug:★ Eclipse Debug 界面應(yīng)用詳解——Eclipse Debug不為人知的秘密
簡(jiǎn)單說(shuō)下步驟:新建一個(gè)maven web項(xiàng)目,將需要的依賴(lài)都添加到pom中去,在pom文件夾中打開(kāi)終端,運(yùn)行"mvn dependency:sources"就可以下載所有pom中依賴(lài)的源碼。如果是eclipse,選中項(xiàng)目,右鍵 run as 選擇 maven build... ,在goal中填入“dependency:sources”,沒(méi)有mvn。接著簡(jiǎn)單寫(xiě)一個(gè)mvc項(xiàng)目。假設(shè)有一個(gè)如下的handler method:我們?cè)诜椒ǖ牡谝恍写蛞粋€(gè)斷點(diǎn),進(jìn)行調(diào)試 。
@RequestMapping("/")publicModelAndViewindexHandler(){ModelAndViewmv=newModelAndView("success");mv.addObject("key","hello,hsiung!");mv.addObject("time",newDate());returnmv;}
一步一步往下看,可以在outline的窗口清楚地看到ModelAndView的屬性和方法,可以看到ModelAndView有兩個(gè)屬性很重要,一個(gè)是view:Object;一個(gè)是model:ModelMap,接著可以看到上面方法的第二行調(diào)用的是如下代碼:
public ModelAndView addObject(String attributeName, Object attributeValue) {
getModelMap().addAttribute(attributeName, attributeValue);
return this;
}
所以model中實(shí)際使用的是ModelMap這個(gè)類(lèi),那這個(gè)類(lèi)的結(jié)構(gòu)是什么呢?按住Ctrl再單擊ModelMap,就可以看到其實(shí)就是一個(gè)LinkedHashMap。
這里提供非常有用的幾個(gè)eclipse使用技巧:
1.在面向接口編程中,我們很多時(shí)候看到一個(gè)方法返回的的是靜態(tài)類(lèi)型是接口的變量,并且實(shí)際類(lèi)型被方法隱藏了。當(dāng)然,你可以通過(guò)追溯進(jìn)方法去看。其實(shí)一般來(lái)說(shuō),一個(gè)接口,會(huì)有一個(gè)抽象類(lèi),然后會(huì)有一個(gè)default類(lèi),一般想要知道接口的具體實(shí)現(xiàn),去看default類(lèi)就可以。spring比較特殊,很多默認(rèn)配置的類(lèi)不是default開(kāi)頭的。只能靠閱讀guide了確定了。
2. 看一個(gè)類(lèi)在哪些地方被引用,選中類(lèi)名,Ctrl+Shift+G,
3. 看一個(gè)方法在哪些地方被調(diào)用,選中方法名,Ctrl+Alt+H。
4.學(xué)會(huì)看eclipse右側(cè)的outline窗口。
以上就是我的一些分享,希望對(duì)你們有所幫助,覺(jué)得有所收獲的朋友們可以點(diǎn)個(gè)關(guān)注哦,想多多學(xué)習(xí)的朋友們可以進(jìn)我的一個(gè)后端技術(shù)群,群里自己收集了很多Java架構(gòu)資料,大家可以進(jìn)群免費(fèi)領(lǐng)取群號(hào):680075317,也可以進(jìn)群一起交流,比如遇到技術(shù)瓶頸、面試不過(guò)的,大家一些交流學(xué)習(xí)!