Spring,Django,Rails,Express這些框架技術的出現都是爲了解決什麼問題,如今這些框架都應用在哪些方面? - 知乎 https://www.zhihu.com/question/25654738/answer/31302541html
2、那麼問題就來了,框架究竟是什麼?要不要學,怎麼學?前端
上面我說過了,框架其實就是一個或一組特殊的類庫,特殊在什麼地方?特殊在控制權轉移!程序員
框架與通常類庫不一樣的地方是,咱們調用類庫,而框架調用咱們。也就是說框架掌握整個程序的控制權,咱們必須必定程度上把程序流程的控制權交給框架,這樣框架才能更好的幫助咱們。數據庫
下面以JavaWeb開發爲例再進行一些說明,並順便簡單介紹一下JavaWeb的一些脈絡。編程
①
靜態網頁時代後端
原本網站都是一個個靜態HTML組成的,或許這些網頁仍是用Dreamweaver寫的,可是這樣的靜態頁面顯然不能知足咱們,很快咱們就迎來了動態網頁的時代。設計模式
②
Servlet時代瀏覽器
若是熟悉HTTP協議的話,咱們就知道其實訪問網頁的過程不過是一次TCP鏈接罷了。瀏覽器發起TCP鏈接到服務器,服務器接受請求,而後返回HTML代碼做爲響應。那麼咱們徹底能夠等到接受到請求以後,再動態生成HTML代碼返回給客戶端。服務器
Servlet就是這麼作的,其主要代碼不過是利用out.write()一點一點的輸出HTML代碼罷了。固然咱們能夠在其中摻雜一點動態的東西,如返回當前的時間。框架
out.write("<!DOCTYPE html>\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<title>Index Page</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("Hello, " + new Date() + "\r\n");
out.write("</body>\r\n");
out.write("</html>\r\n");
③ JSP包打天下的時代
純粹的Servlet非常醜陋,給前端程序員理解和修改這樣的代碼帶來了不少困難。所以JSP技術被髮明瞭出來,原理也不復雜,就是不直接寫Servlet,而是先寫好JSP文件,再由服務器將JSP文件編譯成Servlet。而JSP中是以常見的HTML標籤爲主,這樣前端程序員就能方便的修改這些代碼了。
<!DOCTYPE html>
<html>
<head>
<title>Index Page</title>
</head>
<body>
Hello, <%=new Date()%>
</body>
</html>
PS:由只使用 Servlet到使用JSP,雖然是一個簡單的變化,但這迎合了先後端專業分工的大趨勢,讓前段人員只須要懂得HTML/CSS/JavaScrip代碼就能夠開始工做,而不須要學習Servlet那枯燥無味的用法,所以藉着JSP技術的東風,JavaWeb技術迅速的擴展開來了。
④ Servlet + JSP 時代
隨着JSP技術的發展,用它寫成的網站也愈來愈大,業務邏輯也愈來愈複雜。開發人員漸漸發現整個網站漸漸的再次變成了一團亂麻,不只僅是JSP中夾雜了大量的Java代碼,頁面之間的耦合關係也愈來愈緊密。
即使是要修改一個簡單的按鈕文本,或者是引入一段靜態的內容,也須要打開愈來愈龐大的JSP頁面,艱難到找到須要修改的部分,有時還不只僅是一處,這種修改是有很大的風險的,徹底有可能引入新的錯誤。
這時候開發者漸漸意識到,僅僅使用JSP是不行的,JSP承擔了太多的責任。這時人們又想起了Servlet,Servlet中主要使用Java代碼,處理業務邏輯很是輕鬆。若是JSP只使用HTML代碼,而將業務邏輯的代碼轉移到Servlet中,就能夠大大的減輕JSP的負擔,而且讓先後端分工更加明確。
⑤
MVC模式時代
在
Servlet + JSP模式的基礎上,Java陣營進一步發展出了一種適合JavaWeb應用的設計模式,MVC設計模式,即將程序分爲顯示層(Viewer),控制層(Controller),模型層(Model)。以下圖所示:
1. 用戶輸入網址或點擊連接或提交表單,瀏覽器發起請求
2. --> 經過互聯網,經過HTTP協議 -->
3. Tomcat接受到HTTP請求,生成HttpServletRequest對象,根據Web.xml的配置,調用開發者編寫的HttpServlet,HttpServlet根據請求內容,調用JavaBean獲取數據,JavaBean從數據庫獲取數據,返回HttpServlet,HttpServlet將數據轉發給JSP,JSP負責將數據渲染爲HTML,由Tomcat負責將HTML轉化爲HTTP響應,返回客戶端。
4. --> 經過互聯網,經過HTTP協議 -->
5. 客戶端瀏覽器接收到HTTP響應,瀏覽器將HTML渲染爲頁面,並運行其中可能存在的JavaScript進一步調整界面。
整個流程必須由開發者精確設計才能運做流暢,其中客戶端HTML和JavaScript屬於前端設計,服務器運行的其餘內容屬於後端設計。雖然符合J2EE規範的Tomcat等應用服務器已經幫咱們實現了最複雜的一塊,即HTTP協議部分,還給咱們提供了JSP這個模板引擎,以及自定義標籤等手段。可是在控制層,在模型層,J2EE能給咱們的幫助少之甚少。
就拿用戶提交一個表單爲例,而咱們在Servlet中獲取參數爲例,雖然不用咱們解析HTTP報文,應該已是要謝天謝地了,可是咱們要作的事情仍然不少,分析一下:
1. 客戶端傳過來的數據全是文本,而咱們須要的是Java對象。
2. 凡是文本就有編碼問題,而這須要先後端配合解決。
3. 客戶端的輸入是不可信的,咱們必須校驗參數的合法性。
4. 咱們還必須將校驗結果反饋給客戶,而且最好不要讓客戶所有從新輸入。
5. 咱們每每不是隻有一個參數須要,而是有幾個甚至更多參數,要妥善的處理各類狀況組合。
這些事情幾乎所有都須要咱們手動編碼來完成,幾乎每個 Servlet 都充斥着這樣的代碼,設置編碼,獲取參數,校驗參數,校驗通不過返回錯誤信息,校驗經過則進行業務處理。而更重要的是,獲取參數僅僅是整個流程中的一小步,咱們的Servlet中存在着大量的重複性,機械性代碼,而處理業務邏輯的代碼可能只有一兩行。
⑥
JavaWeb框架
既然存在着大量的重複,咱們固然不能忍,必須請出DRY大法。顯然JavaWeb應用是一個規模龐大,流程複雜的應用,咱們正須要JavaWeb框架的幫助。以Struts2框架爲例,他能給咱們什麼幫助呢?
1. 在控制層,由Struts2的核心控制器接管控制權,將原本在Web.xml進行配置的一些工做,轉移到自定義的struts.xml文件中,這個文件的配置形式更友好。
2. Struts2封裝了Serlvet Api,使用POJO對象做爲控制器(Action),大量使用反射,不要求繼承特定類,有利於複用及單元測試。提供ActionSupport類,結合struts2標籤,能很方面實現的校驗信息的收集及反饋。
3. 提供國際化支持,在顯示層有國際化相關的標籤,在控制層由國際化相關的API。提供基於配置的校驗及JS生成技術。智能化的參數類型轉換,支持自定義轉換器。提供Action攔截器,方便實現AOP模式。
4. 提供了基於OGNL表達式的數據共享模式,先後端數據交流更簡單,提供了Struts2標籤庫,簡單好用,支持多種模板,如FreeMarker,支持各類插件,如JSON,支持整合多種框架,如Spring。總之一句話,能在各方各面給咱們強大的幫助。
⑦
因此固然要學框架,要用框架,那麼要怎麼學?
1. 用框架要知其然,還要知其因此然,要大致明白框架實現一個功能特性的原理,不能只是會用,只是以爲很神奇就能夠了。就拿前面的Hibernate + Spring聲明式事務爲例,要弄明白框架這部分是怎麼實現的。
2. 首先要夯實你的語言基礎,如JavaSE基礎,語法掌握,用法掌握,有些同窗語法還不熟練就開始學框架,等於地基沒打就起高樓,你可能會快一步,可是早晚要遇到瓶頸,甚至摔跟頭。
3. 那麼什麼時候開始學習框架?我不建議新手一開始就直接使用框架。
就好像一開始學習編程語言,你們都不推薦直接使用IDE,必定要用命令行本身編譯運行幾個文件以後,瞭解清楚了以後纔可使用IDE,要否則對於底層原理不瞭解,遇到問題無法本身手動排查。
4. 使用框架也是同樣,若是不是本身寫多了重複性的代碼,就很難理解框架爲何要這麼設計。若是不嘗試幾種不一樣的實現,就很難理解框架爲了靈活性而作出的設計和擴展點。若是不寫幾十個權限檢查語句,就很難理解AOP到底有什麼好處。
5. 框架這麼好,我該所有使用框架嗎?首先只有在規模以上的程序中,纔有應用框架的必要,一個簡單的程序不必使用框架,固然若是你很熟練,使用也無所謂。
6. 要學習一下框架的核心源代碼,要爲擴展框架作好準備,由於雖然框架基本上還算靈活,可是面對錯綜複雜的業務需求,永遠不可能面面俱到,而你不瞭解框架的話,可能會給你實現業務需求形成麻煩。這也是有些人堅持使用Servlet+JSP原生開發,而不是用框架的理由。
7. 只要程序大了,歸根究底仍是要使用框架的,不是用別人寫好的,就是本身寫一套。這裏我不建議本身寫,不要重複造輪子,總有專業造輪子的。你草草寫就的每每不如別人已經千錘百煉的代碼。除非你是爲了學習與研究的目的,本身寫,那就是一件很好的事情。