現(xiàn)在我們web的前端頁面都是使用velocity這樣的模板語言進行開發(fā),拋棄了jsp,這樣的選擇又會給我們java的web開發(fā)帶來什么樣的好處。
框架有一個很籠統(tǒng)的好處:
第一,可以加快開發(fā)進程,在類似項目中重用代碼將為開發(fā)者節(jié)省大量的時間和精力.框架為執(zhí)行繁瑣的代碼任務提供預建模塊。
框架的優(yōu)點其實只有一個:就是讓使用者只關心核心業(yè)務的開發(fā),框架幫你屏蔽原有技術跟業(yè)務開發(fā)無關的各類技術問題。
像jQuery,struts2或springMVC這類框架之所以優(yōu)秀,就是它們在這點上做的太好了,以至于很多使用它的程序員都已經不清楚原有技術的真實面目,因此我們要將struts2理解的更好,使用的更加熟練和深入,這里我們就要跳出struts2的技術,到struts2技術的源頭servlet,仔細研究下servlet的特點,只有這樣我們才能把struts2框架學的更好。
前面我講到傳統(tǒng)的servlet是根據(jù)http協(xié)議進行定義的,它會按你請求方式(post還是get方式)來處理用戶的請求,但是對于一名程序開發(fā)人員而言,一個請求,具體到一個url,其實對于服務端而言就是服務端對外提供的一個功能,或者說是服務端對外的一個動作,如果我們使用servlet開發(fā)程序我們就得把http的動作轉化為具體的業(yè)務動作,這就讓程序開發(fā)變得繁瑣,增強了開發(fā)的難度,所以struts2替代servlet的javabean就屏蔽了servlet里http的請求方式和具體業(yè)務動作轉化的問題,javabean里的每一個方法都可以和每一個url請求一一對應,這必然減輕了開發(fā)的難度問題。
jsp其實是一種服務端技術而非客戶端技術,不過它看起來似乎更像html技術,最早的jsp開發(fā)里都是直接將java代碼寫到頁面里,這種壞處誰都知道,之后javaEE規(guī)范提供了自定義標簽技術,使用一種類似html標簽的方式來解析java代碼,struts2框架提供了一整套完整的自定義標簽技術對于業(yè)務開發(fā)帶來的將是質的飛越。
spring提供了一種方式,這種方式就是spring提供一個容器,我們在xml文件里定義各個對象的依賴關系,由容器完成對象的構建,當我們java代碼里需要使用某個實例的時候就可以從容器里獲取,那么對象的構建操作就被spring容器接管,所以它被稱為控制反轉,
控制反轉的意思就是本來屬于java程序里構建對象的功能交由容器接管,
依賴注入就是當程序要使用某個對象時候,容器會把它注入到程序里,這就叫做依賴注入。
aop解決程序開發(fā)里事務性,和核心業(yè)務無關的問題
spring的作用是被標榜為程序之間的解耦,spring能降低不同模塊之間的耦合度,原因就是在程序開發(fā)里不同模塊之間信息的溝通是通過對象傳遞完成的,而對象能否順利傳遞就是要合理的構建好對象,而管理好對象的構建方式就能管理好對象傳遞,這就是spring給系統(tǒng)架構設計帶來的好處。
現(xiàn)在做項目都會使用框架
SSH框架(Struts+SpringMVC+spring+hibernate),SSM(Struts/springMVC+Spring+Mybatis),做項目分層是為了更好的解耦,分層可以完全不用你框架就能夠解決,為什么還不需要這么多框架呢?
而且現(xiàn)在公司很多web項目的控制層的技術框架由struts2遷移到springMVC,為什么我們現(xiàn)在做Java的web開發(fā),會選擇struts2或者springMVC這樣的框架,而不是使用servlet加jsp這樣的技術呢?特別是現(xiàn)在我們web的前端頁面都是使用velocity這樣的模板語言進行開發(fā),拋棄了jsp,這樣的選擇又會給我們java的web開發(fā)帶來什么樣的好處,延著這個問題的思路,我又發(fā)現(xiàn)新的疑問,為什么現(xiàn)在很多java企業(yè)級開發(fā)都會去選擇spring框架,spring框架給我們開發(fā)的應用帶來了什么?這么一深入的想還真是不太想的明白,我似乎很難找到一串能讓人完全信服的答案,最終我發(fā)現(xiàn),這些我認為我很熟悉很常用的技術,其實還有很多讓我陌生不解的地方,這些陌生和不解的地方也正是我是否能更高層次使用它們的關鍵,不過struts2,spring這樣的技術經過這么多年的積累已經是相當龐大和復雜,它們的面很廣,本人雖然已經用了它們很長時間,還是有很多技術不熟悉和不清楚.
使用框架有一個很籠統(tǒng)的好處:第一,可以加快開發(fā)進程,在類似項目中重用代碼將為開發(fā)者節(jié)省大量的時間和精力.框架為執(zhí)行繁瑣的代碼任務提供預建模塊.這個好處放在哪一個框架都是很適用的.但是再往深層的想呢?
其實在軟件里有很多優(yōu)秀的框架,有一種類型的框架,它的特點是建立在一個現(xiàn)有技術的基礎上,提供和現(xiàn)有技術一樣業(yè)務功能的技術框架,這個新的技術框架比原技術更加易用,更加健壯同時功能更加強大,例如:jQuery,以及本文所要談到的struts2和springMVC,深究這些框架都是相當之復雜,但是它們的優(yōu)點其實只有一個:就是讓使用者只關心核心業(yè)務的開發(fā),框架幫你屏蔽原有技術跟業(yè)務開發(fā)無關的各類技術問題。像jQuery,struts2或springMVC這類框架之所以優(yōu)秀,就是它們在這點上做的太好了,以至于很多使用它的程序員都已經不清楚原有技術的真實面目,因此我們要將struts2理解的更好,使用的更加熟練和深入,這里我們就要跳出struts2的技術,到struts2技術的源頭servlet,仔細研究下servlet的特點,只有這樣我們才能把struts2框架學的更好。
Servlet的作用
是接收瀏覽器傳給服務端的請求(request),并將服務端處理完的響應(response)返回給用戶的瀏覽器,瀏覽器和服務端之間通過http協(xié)議進行溝通,其過程是瀏覽器根據(jù)用戶的選擇將相關信息按http協(xié)議報文的規(guī)范組裝請求的http報文,報文通過網絡傳輸?shù)街付ǖ姆掌?,服務器通過特定的web容器接收這個報文信息,例如:tomcat,jetty,jboss這樣的web容器,web容器會將http報文解析出來,如果是用戶請求,最終解析出來的報文信息會用一個request對象存儲起來,服務端使用這個request做完相應的處理后,服務端程序將結果信息封裝到response對象里,然后將response對象交給web容器,web容器則把這個response對象轉變?yōu)閔ttp協(xié)議的報文,并將報文回傳給瀏覽器,瀏覽器最后解析這個響應報文,將最終結果展示給用戶。
servlet接口
Web容器創(chuàng)造了servlet接口,servlet接口就是開發(fā)人員自己實現(xiàn)業(yè)務邏輯的地方,程序員開發(fā)servlet就好比做填空題,而填空題的語境或者說上下文提示就是由request和response對象,但是javaEE規(guī)范里的servlet接口很簡單,就三個方法init,service和destory,但是這個接口太籠統(tǒng),所以規(guī)范里還提供了一個HttpServlet類,這個類根據(jù)http請求類型提供了doGet,doPost等方法,servlet接口最大的特點就是根據(jù)http協(xié)議的特點進行定義,因此做servlet開發(fā)時候如果使用者對http協(xié)議特點不是特別熟悉,都會碰到或多或少令人迷惑的問題,特別是碰到一些復雜特殊的請求時候:例如文件上傳,返回特殊的文件格式到瀏覽器,這時候使用servlet開發(fā)就不是很方便了,servlet開發(fā)還有個問題可能大家常常被忽視,就是請求的數(shù)據(jù)的類型轉化。
數(shù)據(jù)的類型轉化
http協(xié)議傳輸都是文本形式,到了web容器解析后也是文本類型,如果碰到貨幣,數(shù)字,日期這樣的類型需要我們根據(jù)實際情況進行轉化,如果頁面?zhèn)魉偷男畔⒎浅6啵覀兙筒坏貌蛔龃罅款愋娃D化,這種工作沒有什么技術含量,是個體力活而且很容易導致程序錯誤。同時java的企業(yè)開發(fā)都是圍繞javabean進行,類型轉化好的數(shù)據(jù)還要封裝到對應的javabean里,這種轉來轉去的事情對于項目開發(fā)絕對不是什么好事情,
DTO對象(數(shù)據(jù)傳輸對象)
所以古老的struts1為這種問題找到了一種解決方案,就是定義了一個DTO對象(數(shù)據(jù)傳輸對象),專門負責做這樣的事情,不過到了struts2,整個替代servlet的action本身就是一個javabean。
javabean開發(fā)
Java的企業(yè)開發(fā)一個技術特點就是使用javabean進行的,struts2的特點之一就是它替代servlet的操作類就是一個典型的javabean,首先struts2框架將頁面?zhèn)鬏數(shù)臄?shù)據(jù)進行類型轉化和封裝后將請求信息封裝到了這個javabean的屬性里,這樣我們開發(fā)web程序時候就省去了煩心的類型轉化和封裝的問題,前面我講到傳統(tǒng)的servlet是根據(jù)http協(xié)議進行定義的,它會按你請求方式(post還是get方式)來處理用戶的請求,但是對于一名程序開發(fā)人員而言,一個請求,具體到一個url,其實對于服務端而言就是服務端對外提供的一個功能,或者說是服務端對外的一個動作,如果我們使用servlet開發(fā)程序我們就得把http的動作轉化為具體的業(yè)務動作,這就讓程序開發(fā)變得繁瑣,增強了開發(fā)的難度,所以struts2替代servlet的javabean就屏蔽了servlet里http的請求方式和具體業(yè)務動作轉化的問題,javabean里的每一個方法都可以和每一個url請求一一對應,這必然減輕了開發(fā)的難度問題。
struts2的處理優(yōu)勢
Servlet另一個作用就是構造response對象,讓頁面獲得正確的響應,其實現(xiàn)代的瀏覽器是一個多媒體工具,文字,圖片,視屏等等東西都可以在瀏覽器里顯示,資源的不同就會導致http響應報文的差別,如果我們使用servlet開發(fā)就要根據(jù)資源的不同在java程序里用硬編碼的形式處理,這樣的程序很難復用,而且如果程序員對某種資源的處理理解不到位,就會導致問題的出現(xiàn),struts2通過配置文件的形式將這樣的邏輯從java程序里剝離出來,使用配置的方式進行統(tǒng)一管理,這個做法和spring的AOP方式類似,這樣就讓結果處理方式更加統(tǒng)一,更加利于管理,同時也提升了程序的健壯性以及降低了開發(fā)的難度。
MVC開發(fā)模式
Servlet在MVC開發(fā)模式里就是其中C層即控制層,控制層就像俄羅斯的雙頭鷹(一個頭向東看一個頭向西看)一樣,一個頭向M層模型層看,一個頭向V層視圖層看,模型層也是用java編寫的,控制層也屬于服務端語言開發(fā),所以M層和C層的溝通沒有天然的障礙,但是和V層視圖層就不一樣了,這是一個跨語言的溝通,對于瀏覽器,它只懂得html,Javascript和css,瀏覽器是理解不了java這種語言的東西,但是要讓服務端的東西能被瀏覽器理解接受,我們就必須得把服務端的響應信息放到頁面里,
jsp技術的由來
因此就需要一個技術把java的信息轉化到html頁面里,這就是javaEE規(guī)范里提供了jsp技術,jsp其實是一種服務端技術而非客戶端技術,不過它看起來似乎更像html技術,最早的jsp開發(fā)里都是直接將java代碼寫到頁面里,這種壞處誰都知道,之后javaEE規(guī)范提供了自定義標簽技術,使用一種類似html標簽的方式來解析java代碼,struts2框架提供了一整套完整的自定義標簽技術,這似乎聽起來不算啥,但是它的作用非凡,因為自定義標簽之所以叫自定義就是每個人都可以自己來定義,如果沒有一個規(guī)范必然產生混亂,而且一套完善的自定義標簽是個系統(tǒng)工程,一套完整的自定義標簽相當于我們在自己定義一套新的開發(fā)語言,做程序的人聽到這個一定就會明白開發(fā)一套完整的自定義標簽的工作量和開發(fā)難度都是難以想象的,而且自定義標簽都是和控制層緊密相連,其難度又會增加一個維度,所以struts2提供的自定義標簽對于業(yè)務開發(fā)帶來的將是質的飛越。
Servlet監(jiān)聽器和過濾器
Servlet里還有兩個重要的技術:監(jiān)聽器和過濾器,對于監(jiān)聽器在web開發(fā)里使用的場景比較少,都是一些十分特別的情況才會使用,大部分web開發(fā)里可以忽略它的使用,我們用的最多的監(jiān)聽器可能就是對ServletContext創(chuàng)建和銷毀的監(jiān)聽器,ServletContext是整個web應用的全局對象,它和Web應用的生命周期綁定在一起,因此使用這個監(jiān)聽器對Web應用的全局信息進行初始化和銷毀操作,例如spring容器的初始化操作。比較有意思的是過濾器,
struts2特有功能攔截器
在struts2里有個攔截器,它們的作用相同都是用來攔截請求的,因為攔截器是struts2的特有功能,在struts2里使用攔截器自然比使用過濾器更順手,其實攔截器所用的技術比過濾器更加先進,因為攔截器使用了反射技術,因此攔截器攔截的面更大,控制請求的能力更強,它能完成的任務也會更加的豐富多彩。
在我第一次接觸struts2是在gxpt系統(tǒng)中,有人告訴我struts設計的一個目的就是想屏蔽在控制層里操作request和response對象,因為這兩個http協(xié)議的兒子會造成web開發(fā)里思路的混亂,但是我在實際開發(fā)里卻經常不自覺的使用這兩個對象。struts2里用到了太多反射機制,特別是使用注解做配置,在java里反射的執(zhí)行效率是非常低的,直接使用servlet一定能提升web應用的執(zhí)行效率。其實這個倒很難做到,因為當時我沒法在servlet里靈活的運用spring技術。
spring技術
spring技術可以說是java企業(yè)開發(fā)里最重要的技術,不過真的理解spring的作用和意義還真是一件麻煩的事情,很多人對spring理解其實都是停留在使用階段(例如:聲明式事務很好用等等),當今的spring技術生態(tài)環(huán)境里可謂是蔚為壯觀,spring已經包羅萬象,它的內容之多完全不亞于它的本源java語言了,而spring這么大的框都是建立在ioc和aop技術之上,只有深入理解了這兩個技術我們才能明白為什么spring這個框能裝的下那么多東西了。
ioc技術控制反轉/依賴注入
首先是ioc,ioc技術第一個解釋叫做控制反轉,它還有個解釋就是依賴注入,這兩個名字很難從字面理解,但是當你理解它的原理后就會發(fā)現(xiàn)它們的描述是何等準確。
Ioc技術的本質就是構建對象的技術
換句話說就是將一個類實例化成對象的技術,在java里實例化類通過new關鍵字進行的,每次new一個類都會產生一個新的實例對象,這么做視乎很浪費,有時這種浪費還挺危險,因為在程序開發(fā)時候我們常常只需要某個類永遠只能產生一個的實例對象這個時候就得使用單例模式,此外在設計模式里還可以通過工廠方式產生對象,使用過spring的人看到上面的文字就知道了,
spring里bean的定義就和上面的內容一一對應,
lscope屬性single產生單例對象
lprototype產生新對象
lbean還可以通過工廠方式產生對象
可以說spring的bean就是制造對象的工具。面向對象編程里對象相當于顯示生活中的一個實體,例如我們有個對象作用是完成打獵的操作,那么打獵這個對象內部包含兩個輔助對象:人和槍,只有人和槍賦予了打獵這個對象,那么打獵對象才能完成打獵的操作,但是構建一個人和槍的對象并不是看起來那么簡單,這里以槍為例,要創(chuàng)造一把槍我們需要金屬,需要機床,需要子彈,而機床和子彈又是兩個新對象,這些對象一個個相互嵌套相互關聯(lián),大伙試想下如果我們在java代碼里構建一個槍的對象那是何其的復雜,假如我們要構造的不是簡單的槍對象而是更加復雜的航空母艦,那么構造這個對象的成本之高是讓人難以想象的,怎么來消除這種對象相互嵌套相互依賴的關系了?
Spring容器
spring提供了一種方式,這種方式就是spring提供一個容器,我們在xml文件里定義各個對象的依賴關系,由容器完成對象的構建,當我們java代碼里需要使用某個實例的時候就可以從容器里獲取,那么對象的構建操作就被spring容器接管,所以它被稱為控制反轉,
控制反轉的意思
就是本來屬于java程序里構建對象的功能交由容器接管,
依賴注入的意思
就是當程序要使用某個對象時候,容器會把它注入到程序里,這就叫做依賴注入。
使用某個類提供的功能的兩種方式
在java開發(fā)里我們想使用某個類提供的功能,有兩種方式,
l一種就是構造一個新的類,新的類繼承該類
l另一種方式則是將某個類定義在新類里,那么兩個類之間就建立一種關聯(lián)關系,spring的ioc容器就是實現(xiàn)了這種關聯(lián)關系(記住不是繼承關系哦)
那么某個類要被賦予到新類有哪些辦法了?
一般只有兩種:一種就是通過構造函數(shù),一種就是通過setXXX方式,這也是spring容器使用到了兩種標準的注入方式。
aop的思想
不管是上面說的繼承方式,還是關聯(lián)方式其實都是增強目標對象能力的開發(fā)手段,在設計模式里有一種代理模式,代理模式將繼承模式和關聯(lián)模式結合在一起使用,代理模式就是繼承模式和關聯(lián)模式的綜合體,不過這個綜合體的作用倒不是解決對象注入的問題,而是為具體操作對象找到一個保姆或者是秘書,這就和小說里的二號首長一樣,這個二號首長對外代表了具體的實例對象,實例對象的入口和出口都是通過這個二號首長,因為具體的實例對象是一號首長,一號首長是要干大事的,所以一些事務性,重復性的工作例如泡茶,安排車子,這樣的工作是不用勞煩一號首長的大駕,而是二號首長幫忙解決的,這就是aop的思想,aop解決程序開發(fā)里事務性,和核心業(yè)務無關的問題,但這些問題對于業(yè)務場景的實現(xiàn)是很有必要的,在實際開發(fā)里aop也是節(jié)省代碼的一種方式。
Spring的核心技術的作用本質就是一個溝通機制,spring總是盡全力的讓溝通的雙方信息暢通,同時降低雙方的溝通成本,在現(xiàn)實機構里一個善于溝通的人肯定是該公司的領導,很會溝通的領導能調動起各種資源的積極性,善于溝通的領導就會做到海納百川,讓各種不同人追隨他,所以當今的spring就是一個大框,什么都可以往里裝。
spring的作用
Spring很像銀行,它不能直接創(chuàng)造物質財富,但是一切資源都要通過它進行流通,它能控制經濟發(fā)展的走向,回到程序的世界,
spring的作用是被標榜為程序之間的解耦,spring能降低不同模塊之間的耦合度,原因就是在程序開發(fā)里不同模塊之間信息的溝通是通過對象傳遞完成的,而對象能否順利傳遞就是要合理的構建好對象,而管理好對象的構建方式就能管理好對象傳遞,這就是spring給系統(tǒng)架構設計帶來的好處。
以上就是長沙牛耳教育java學院小編針對“理解真正的Javaweb開發(fā)框架”的內容進行的回答,希望對大家有所幫助,如果對于學習Java的學習計劃,怎么學才有效率,或者學完如果找工作的問題,請在線咨詢,有專業(yè)老師隨時為你服務。
相關推薦
零基礎學Java編程,這些內容你一定要知道
學習Java編程了解一些免費Java開發(fā)工具
初學者學Java編程真的很難?
新手自學Java編程需要多長時間呢
學習Java編程可以做什么