想說說自己Spring的學習路程,課余自學Spring將近一年了,還是不得其道。去年暑假學習了一下JSP,并沒有深入理解,所以導致學習Spring時對著書本寫一些demo,感覺自己理解了,其實并不知道內部時什么原理,出了問題不停的百度,一個小問題好幾天解決不了。
學習一種框架最先需要知道的是為什么需要使用這個框架,任何一個框架的發明都是為了解決編程中的一些痛點,打開任何一本hibernate或者其他框架的入門書,第一章都是介紹框架的理念和優勢。如果需要理解這些理念和優勢,那么你需要知道不使用這個框架之前是怎么處理的,才能知道框架做了一些什么事情。
針對Spring的學習,第一步就是理解IoC和AOP;這是基礎;然后學習SpringMVC,其實還是JAVA EE開發,如果要理解這個框架,就要知道沒有這個框架之前,使用的是什么技術。
很多新的技術只不過是引入了新的編程元素對原來技術進行了封裝。
Web開發,首先需要理解的是 HTTP協議,這部分一定要深入理解。理解http請求,其實就是要知道下面這張圖的含義。
<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"/>
還要知道服務器發送給瀏覽器的響應是沒有沒有JS,css和圖片等外部資源的,瀏覽器在解析響應時才會再次請求這些資源,這里會出現一些靜態資源請求不到的問題,SpringMVC是怎么配置的?
接下來,學習Servlet和JSP。這個步驟不是可以跳過的,現在流行的框架Spring MVC和Struts2其實都是基于Servlet的,只有深入理解了Servlet才能理解后面的新技術。
下面幾個知識點可以檢測你是否理解了Servlet:
1、什么是ServletContext,和Tomcat等web容器的關系時什么?Servlet 工作原理解析
簡單的說,我們在瀏覽器點擊鏈接和按鈕產生的消息不是發送給Servlet的,而是發送給web容器的(在JSP出現之前,web容器也叫Servlet容器),web容器接收消息后不知道怎么處理,轉交給我們編寫的Servlet處理,那么web容器怎么和Servlet交流呢?于是就出現了Servlet接口,接口是定義一種規范的良好表達形式。 只要我們編寫的Java類符合Servlet規范,那么就能被Web容器識別并被容器管理。
2、什么是Session?Session在實際工程中的應用場景。以及@SessionAttribute注解的局限性。
3、JSP是面向服務器的,它并不知道瀏覽器是什么鬼,是我們在寫JSP時預設客戶端是瀏覽器,JSP就是一個Servlet。JSP的常用對象和指令。
4、JSP的中文編碼亂碼有幾種情況?各自的解決方法?提示: JSP文件的編碼,瀏覽器的解析編碼,GET請求的編碼,POST的編碼。
5、Servlet是一種接口規范,其中請求和響應是Servlet容器通過向方法的參數賦值HttpServletRequest或者HttpServletResponse傳遞的。在Struts1里面,將doGet()方法里的響應移到返回值里。在Struts2里則:
- 在Controller中徹底杜絕引入HttpServletRequest或者HttpServletResponse這樣的原生Servlet對象。
- 同時將請求參數和響應數據都從響應方法中剝離到了Controller中的屬性變量。
這是一個很大的技術改造,也造成了Struts2的盛行。Spring MVC走的是中間路線,Spring的2.0.8之前的版本甚至直接使用Servlet的doGet的。Spring MVC現在開始流行主要還是因為Schema xml的精簡和基于注解的配置。所以這里出現了新的知識點:Schema Based XML的相關知識和Java5引入的注解原理。
參考文獻:
博客專欄 - SpringMVC深度探險
強烈推薦看兩遍。
書籍:推薦許令波的書《深入分析Java Web技術內幕(修訂版)》和計文柯的《深入理解spring技術內幕》,特別是第二本,對spring的分析很是徹底。
查看源碼是比較快的學習方法,在一個項目里直接利用debug的方式追蹤變量查看源碼,而不是去閱讀源碼。
如何使用eclipse的debug:★ Eclipse Debug 界面應用詳解——Eclipse Debug不為人知的秘密
簡單說下步驟:新建一個maven web項目,將需要的依賴都添加到pom中去,在pom文件夾中打開終端,運行"mvn dependency:sources"就可以下載所有pom中依賴的源碼。如果是eclipse,選中項目,右鍵 run as 選擇 maven build... ,在goal中填入“dependency:sources”,沒有mvn。接著簡單寫一個mvc項目。假設有一個如下的handler method:我們在方法的第一行打一個斷點,進行調試 。
@RequestMApping("/") public ModelAndView indexHandler(){ ModelAndView mv=new ModelAndView("success"); mv.addObject("key", "hello,hsiung!"); mv.addObject("time", new Date()); return mv; }
一步一步往下看,可以在outline的窗口清楚地看到ModelAndView的屬性和方法,可以看到ModelAndView有兩個屬性很重要,一個是view:Object;一個是model:ModelMap,接著可以看到上面方法的第二行調用的是如下代碼:
public ModelAndView addObject(String attributeName, Object attributeValue) { getModelMap().addAttribute(attributeName, attributeValue); return this; }
所以model中實際使用的是ModelMap這個類,那這個類的結構是什么呢?按住Ctrl再單擊ModelMap,就可以看到其實就是一個LinkedHashMap<String, Object>。
2015.6.22
這里提供非常有用的幾個eclipse使用技巧:
1.在面向接口編程中,我們很多時候看到一個方法返回的的是靜態類型是接口的變量,并且實際類型被方法隱藏了。當然,你可以通過追溯進方法去看。其實一般來說,一個接口,會有一個抽象類,然后會有一個default類,一般想要知道接口的具體實現,去看default類就可以。spring比較特殊,很多默認配置的類不是default開頭的。只能靠閱讀guide了確定了。
2. 看一個類在哪些地方被引用,選中類名,Ctrl+Shift+G,
3. 看一個方法在哪些地方被調用,選中方法名,Ctrl+Alt+H。
4.學會看eclipse右側的outline窗口。
關于demo,其實spring project提供了一些很好的MVC demo,
spring-projects/spring-mvc-showcase · GitHub,
spring-projects/spring-petclinic · GitHub。
下載源碼,到pom目錄下打開終端 運行: mvn eclipse:eclipse ,構建成功后直接導入eclipse就可以運行查看效果了。注意,mvn 命令經常一次不能成功,主要是有些maven插件下載失敗以及國內網絡的問題,手動刪除下載失敗的依賴,然后命令多運行幾次就可以成功了。也可以使用開源中國的maven源。
作者:xdahu
鏈接:https://www.zhihu.com/question/21142149/answer/52383396
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。