深入淺出的理解框架(Struts2疗韵、Hibernate丈屹、Spring)與 MVC 設計模式

現(xiàn)在許許多多的初學者和程序員,都在趨之若鶩地學習Web開發(fā)的寶典級框架:Struts2伶棒,Spring,Hibernate彩库。似乎這些框架成為了一個人是否精通Java肤无,是否會寫J2EE程序的唯一事實標準和找工作的必備基礎。

然而骇钦,如果在面試的時候問這些程序員宛渐,你們?yōu)槭裁匆獙W習這些框架?這些框架的本質(zhì)到底是什么眯搭?似乎很少很少有人能夠給我非常滿意的答復窥翩。因為他們都在為了學習而學習,為了工作而學習鳞仙,而不是在真正去深入了解一個框架寇蚊。其實所有的人都應該思考這樣的問題:為什么要學習框架?框架到底給我?guī)砹耸裁垂骱茫拷酉聛碚贪叮覀円缘卿涀鳛橐粋€最簡單的例子,來看看不同的年代借笙,我們是怎么寫Web程序的扒怖。

在很多年前,我們這么寫程序的

很多年前业稼,那是一個貧苦的年代盗痒,如果我們要使用Java在網(wǎng)頁上做一些動態(tài)的交互功能。很多人會告訴你一個技術(shù)低散,叫做JSP俯邓。在我還對Java非常困惑的時候,就有人告訴我熔号,JSP是個好東西看成,它可以在HTML代碼里面寫Java代碼來完成邏輯。

<%   
     String name = request.getParameter("name");   
     String password = request.getParameter("password");   
   
     UserHandler userHandler =new UserHandler();   
     if(userHandler.authenticate(name, password)) {   
%>   
<p>恭喜你跨嘉,登錄成功</p>   
<%   
      } else {   
%>   
<p>對不起川慌,登錄失敗</p>   
<%   
      }   
%>

作為一張JSP吃嘿,它可以接收從別的JSP發(fā)送過來的登錄請求,并進行處理梦重。這樣兑燥,我們不需要任何額外的配置文件,也不需要任何框架的幫忙琴拧,就能完成邏輯降瞳。

后來,我們放棄了在頁面上寫邏輯

后來蚓胸,程序?qū)懙迷絹碓蕉嗾跫ⅲ覀儼l(fā)現(xiàn),這種在HTML代碼中編寫Java代碼來完成邏輯的方式存在著不少問題:

  1. Java代碼由于混雜在一個HTML環(huán)境中而顯得混亂不堪沛膳,可讀性非常差扔枫。一個JSP文件有時候會變成幾十K,甚至上百K锹安。要找一段邏輯短荐,經(jīng)常無法定位。

  2. 編寫代碼時非常困惑叹哭,不知道代碼到底應該寫在哪里忍宋,也不知道別人是不是已經(jīng)曾經(jīng)實現(xiàn)過類似的功能,到哪里去引用风罩。

  3. 突然之間糠排,某個需求發(fā)生了變化。于是超升,每個人蒙頭開始全程替換乳讥,還要小心翼翼的,生怕把別人的邏輯改了廓俭。

  4. 邏輯處理程序需要自己來維護生命周期云石,對于類似數(shù)據(jù)庫事務、日志等眾多模塊無法統(tǒng)一支持研乒。

在這個時候汹忠,如果有一個產(chǎn)品,它能夠?qū)㈨撁嫔系哪切㎎ava代碼抽取出來雹熬,讓頁面上盡量少出現(xiàn)Java代碼宽菜,該有多好。于是許多人開始使用servlet來處理那些業(yè)務邏輯竿报。

publicclass LoginServlet extends HttpServlet {   
    
    /* (non-Javadoc)  
     * @see javax.servlet.http.HttpServlet#doPost

(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)  
     */  
    @Override  
    protectedvoid doPost(HttpServletRequest req, HttpServletResponse resp) throws 

ServletException, IOException {   
        String message =null;   
        RequestDispatcher dispatcher = req.getRequestDispatcher("/result.jsp");   
        String name = req.getParameter("name");   
        String password = req.getParameter("password");   
            
        UserHandler userHandler =new UserHandler();   
        if(userHandler.authenticate(name, password)) {   
            message ="恭喜你铅乡,登錄成功";   
        } else {   
            message ="對不起,登錄失敗";   
        }   
            
        req.setAttribute("message", message);   
        dispatcher.forward(req, resp);   
    }   
} 

在這里烈菌,我們需要在web.xml中為這個servlet配置url的請求關系阵幸。

<servlet>   
  <servlet-name>Login</servlet-name>   
    <servlet-class>   
      com.demo2do.servlet.LoginServlet   
  </servlet-class>   
</servlet>   
<servlet-mapping>   
  <servlet-name>Login</servlet-name>   
  <url-pattern>   
    /Login   
  </url-pattern>   
</servlet-mapping>

代碼重構(gòu)到這里花履,我們發(fā)現(xiàn),其實我們的工作量本身并沒有減少挚赊,只是代碼從JSP移動到了Servlet诡壁,使得整個流程看上去稍微清楚了一些。然而荠割,為了這么點干凈妹卿,我們付出的代價是什么?為每個servlet都在web.xml里面去做一個url的請求配置蔑鹦!

再后來夺克,出現(xiàn)框架

時代進一步發(fā)展,人們發(fā)現(xiàn)簡單的JSP和Servlet已經(jīng)很難滿足人們懶惰的要求了嚎朽。于是铺纽,人們開始試圖總結(jié)一些公用的Java類,來解決Web開發(fā)過程中碰到的問題火鼻。這時,橫空出世了一個框架雕崩,叫做struts魁索。它非常先進地實現(xiàn)了MVC模式,成為了廣大程序員的福音盼铁。

struts的代碼示例我就不貼了粗蔚,網(wǎng)上隨便搜搜你可以發(fā)現(xiàn)一堆一堆的。在一定程度上饶火,struts能夠解決web開發(fā)中的職責分配問題鹏控,使得顯示與邏輯分開。不過在很長一段時間內(nèi)肤寝,使用struts的程序員往往無法分別我們到底需要web框架幫我們做什么当辐,我們到底需要它完成點什么功能?

我們到底要什么

在回顧了我們寫代碼的歷史之后鲤看,我們回過頭來看看缘揪,我們到底要什么?

無論是使用JSP义桂,還是使用Struts1找筝,或是Struts2,我們至少都需要一些必須的元素(如果沒有這些元素慷吊,或許我還真不知道這個程序會寫成什么樣子):

  1. 數(shù)據(jù)

在這個例子中袖裕,就是name和password。他們共同構(gòu)成了程序的核心載體溉瓶。事實上急鳄,我們往往會有一個User類來封裝name和password谤民,這樣會使得我們的程序更加OO。無論怎么說攒岛,數(shù)據(jù)會穿插在這個程序的各處赖临,成為程序運行的核心。

2.頁面展示

在這個例子中灾锯,就是login.jsp兢榨。沒有這個頁面,一切的請求顺饮、驗證和錯誤展示也無從談起吵聪。在頁面上,我們需要利用HTML兼雄,把我們需要展現(xiàn)的數(shù)據(jù)都呈現(xiàn)出來吟逝。同時我們也需要完成一定的頁面邏輯,例如赦肋,錯誤展示块攒,分支判斷等等。

3.處理具體業(yè)務的場所

在這里佃乘,不同階段囱井,處理具體業(yè)務的場所就不太一樣。原來用JSP和Servlet趣避,后來用Struts1或者Struts2的Action庞呕。

上面的這些必須出現(xiàn)的元素,在不同的年代程帕,被賦予了不同的表現(xiàn)形式住练,有的受到時代的束縛,其表現(xiàn)形式非常落后愁拭,有的已經(jīng)不再使用讲逛。但是撥開這些外在的表現(xiàn)形式,我們就可以發(fā)現(xiàn)岭埠,這不就是我們已經(jīng)熟門熟路的MVC嘛妆绞?
  
數(shù)據(jù) ———— Model
頁面展示 ———— View
處理具體業(yè)務的場所 ———— Control

所以,框架不重要枫攀,概念是王道括饶。只要能夠深刻理解MVC的概念,框架對你來說来涨,只是一個jar包而已图焰。

MVC的概念其實就那么簡單,這些概念其實早已深入我們的內(nèi)心蹦掐,而我們所缺乏的是將其本質(zhì)挖掘出來技羔。我們來看看下面這幅圖僵闯,這是一副流行了很多年的講述MVC模型的圖:

image.png

在這幅圖中,MVC三個框框各司其職藤滥,結(jié)構(gòu)清晰明朗鳖粟。不過我覺得這幅圖忽略了一個問題,就是數(shù)據(jù)是動的拙绊,數(shù)據(jù)在View和Control層一旦動起來向图,就會產(chǎn)生許多的問題:

  1. 數(shù)據(jù)從View層傳遞到Control層,如何使得一個個扁平的字符串标沪,轉(zhuǎn)化成一個個生龍活虎的Java對象
  2. 數(shù)據(jù)從View層傳遞到Control層榄攀,如何方便的進行數(shù)據(jù)格式和內(nèi)容的校驗?
  3. 數(shù)據(jù)從Control層傳遞到View層金句,一個個生龍活虎的Java對象檩赢,又如何在頁面上以各種各樣的形式展現(xiàn)出來
  4. 如果你試圖將數(shù)據(jù)請求從View層發(fā)送到Control層,你如何才能知道你要調(diào)用的究竟是哪個類违寞,哪個方法贞瞒?一個Http的請求,又如何與Control層的Java代碼建立起關系來趁曼?

除此之外军浆,Control層似乎也沒有想象中的那么簡單,因為它作為一個控制器彰阴,至少還需要處理以下的問題:

  1. 作為調(diào)用邏輯處理程序的facade門面瘾敢,如果邏輯處理程序發(fā)生了異常拍冠,我們該如何處理尿这?
  2. 對于邏輯處理的結(jié)果,我們需要做怎么樣的處理才能滿足豐富的前臺展示需要庆杜?

這一個又一個問題的提出射众,都基于對MVC的基本概念的挖掘。所以晃财,這些問題都需要我們在寫程序的時候去一一解決叨橱。說到這里,這篇文章開頭所提的問題應該可以有答案了:框架是為了解決一個又一個在Web開發(fā)中所遇到的問題而誕生的断盛。不同的框架罗洗,都是為了解決不同的問題,但是對于程序員而言钢猛,他們只是jar包而已伙菜。框架的優(yōu)缺點的評論命迈,也完全取決于其對問題解決程度和解決方式的優(yōu)雅性的評論贩绕。所以火的,千萬不要為了學習框架而學習框架,而是要為了解決問題而學習框架淑倾,這才是一個程序員的正確學習之道馏鹤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市娇哆,隨后出現(xiàn)的幾起案子湃累,更是在濱河造成了極大的恐慌,老刑警劉巖迂尝,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脱茉,死亡現(xiàn)場離奇詭異,居然都是意外死亡垄开,警方通過查閱死者的電腦和手機琴许,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溉躲,“玉大人榜田,你說我怎么就攤上這事《褪幔” “怎么了箭券?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長疑枯。 經(jīng)常有香客問我辩块,道長,這世上最難降的妖魔是什么荆永? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任废亭,我火速辦了婚禮,結(jié)果婚禮上具钥,老公的妹妹穿的比我還像新娘豆村。我一直安慰自己,他們只是感情好骂删,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布掌动。 她就那樣靜靜地躺著,像睡著了一般宁玫。 火紅的嫁衣襯著肌膚如雪粗恢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天欧瘪,我揣著相機與錄音眷射,去河邊找鬼。 笑死,一個胖子當著我的面吹牛凭迹,可吹牛的內(nèi)容都是我干的罚屋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼嗅绸,長吁一口氣:“原來是場噩夢啊……” “哼脾猛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鱼鸠,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤猛拴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蚀狰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愉昆,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年麻蹋,在試婚紗的時候發(fā)現(xiàn)自己被綠了跛溉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡扮授,死狀恐怖芳室,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刹勃,我是刑警寧澤堪侯,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站荔仁,受9級特大地震影響伍宦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乏梁,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一次洼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掌呜,春花似錦滓玖、人聲如沸坪哄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翩肌。三九已至模暗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間念祭,已是汗流浹背兑宇。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粱坤,地道東北人隶糕。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓瓷产,卻偏偏與公主長得像,于是被迫代替她去往敵國和親枚驻。 傳聞我的和親對象是個殘疾皇子濒旦,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法再登,內(nèi)部類的語法尔邓,繼承相關的語法,異常的語法锉矢,線程的語...
    子非魚_t_閱讀 31,644評論 18 399
  • 從三月份找實習到現(xiàn)在梯嗽,面了一些公司,掛了不少沽损,但最終還是拿到小米灯节、百度、阿里绵估、京東显晶、新浪、CVTE壹士、樂視家的研發(fā)崗...
    時芥藍閱讀 42,255評論 11 349
  • 2017.11.12周日磷雇,晴。 今天一早兒子就被送到爺爺家去了躏救。今晚上我和老公都在單位值夜班唯笙,孩子就得跟爺爺住...
    王瀚霆媽媽閱讀 118評論 0 0