自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深入淺出Java三大框架SSH與MVC的設(shè)計(jì)模式

開發(fā) 后端
現(xiàn)在許許多多的初學(xué)者和程序員,都在趨之若鶩地學(xué)習(xí)Web開發(fā)的寶典級(jí)框架:Struts2,Spring,Hibernate。似乎這些框架成為了一個(gè)人是否精通Java,是否會(huì)寫J2EE程序的唯一事實(shí)標(biāo)準(zhǔn)和找工作的必備基礎(chǔ)。

現(xiàn)在許許多多的初學(xué)者和程序員,都在趨之若鶩地學(xué)習(xí)Web開發(fā)的寶典級(jí)框架:Struts2,
Spring,Hibernate。似乎這些框架成為了一個(gè)人是否精通Java,是否會(huì)寫J2EE程序的***事實(shí)標(biāo)準(zhǔn)和找工作的必備基礎(chǔ)。

然而,如果在面試的時(shí)候問這些程序員,你們?yōu)槭裁匆獙W(xué)習(xí)這些框架?這些框架的本質(zhì)到底是什么?似乎很少很少有人能夠給我非常滿意的答復(fù)。因?yàn)樗麄兌荚跒榱藢W(xué)習(xí)而學(xué)習(xí),為了工作而學(xué)習(xí),而不是在真正去深入了解一個(gè)框架。其實(shí)所有的人都應(yīng)該思考這樣的問題:為什么要學(xué)習(xí)框架?框架到底給我?guī)砹耸裁??接下來,我們以登錄作為一個(gè)最簡(jiǎn)單的例子,來看看不同的年代,我們是怎么寫Web程序的。

后來,我們放棄了在頁(yè)面上寫邏輯。

后來,程序?qū)懙迷絹碓蕉?,我們發(fā)現(xiàn),這種在HTML代碼中編寫Java代碼來完成邏輯的方式存在著不少問題:

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

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

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

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

在這個(gè)時(shí)候,如果有一個(gè)產(chǎn)品,它能夠?qū)㈨?yè)面上的那些Java代碼抽取出來,讓頁(yè)面上盡量少出現(xiàn)Java代碼,該有多好。于是許多人開始使用servlet來處理那些業(yè)務(wù)邏輯。

  1. public class LoginServlet extends HttpServlet {    
  2.     
  3.     /* (non-Javadoc)   
  4.      * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)   
  5.      */    
  6.     @Override    
  7.     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {    
  8.         String message = null;    
  9.         RequestDispatcher dispatcher = req.getRequestDispatcher("/result.jsp");    
  10.         String name = req.getParameter("name");    
  11.         String password = req.getParameter("password");    
  12.             
  13.         UserHandler userHandler = new UserHandler();    
  14.         if(userHandler.authenticate(name, password)) {    
  15.             message = "恭喜你,登錄成功";    
  16.         } else {    
  17.             message = "對(duì)不起,登錄失敗";    
  18.         }    
  19.             
  20.         req.setAttribute("message", message);    
  21.         dispatcher.forward(req, resp);    
  22.     }    
  23. }    

在這里,我們需要在web.xml中為這個(gè)servlet配置url的請(qǐng)求關(guān)系。

  1. <servlet>    
  2.   <servlet-name>Login</servlet-name>    
  3.     <servlet-class>    
  4.       com.demo2do.servlet.LoginServlet    
  5.   </servlet-class>    
  6. </servlet>    
  7. <servlet-mapping>    
  8.   <servlet-name>Login</servlet-name>    
  9.   <url-pattern>    
  10.     /Login    
  11.   </url-pattern>    
  12. </servlet-mapping>    

代碼重構(gòu)到這里,我們發(fā)現(xiàn),其實(shí)我們的工作量本身并沒有減少,只是代碼從JSP移動(dòng)到了Servlet,使得整個(gè)流程看上去稍微清楚了一些。然而,為了這么點(diǎn)干凈,我們付出的代價(jià)是什么?為每個(gè)servlet都在web.xml里面去做一個(gè)url的請(qǐng)求配置!     

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

很多年前,那是一個(gè)貧苦的年代,如果我們要使用Java在網(wǎng)頁(yè)上做一些動(dòng)態(tài)的交互功能。很多人會(huì)告訴你一個(gè)技術(shù),叫做JSP。在我還對(duì)Java非常困惑的時(shí)候,就有人告訴我,JSP是個(gè)好東西,它可以在HTML代碼里面寫Java代碼來完成邏輯。

  1. <%    
  2.      String name = request.getParameter("name");    
  3.      String password = request.getParameter("password");    
  4.     
  5.      UserHandler userHandler = new UserHandler();    
  6.      if(userHandler.authenticate(name, password)) {    
  7. %>    
  8. <p>恭喜你,登錄成功</p>    
  9. <%    
  10.       } else {    
  11. %>    
  12. <p>對(duì)不起,登錄失敗</p>    
  13. <%    
  14.       }    
  15. %>  

作為一張JSP,它可以接收從別的JSP發(fā)送過來的登錄請(qǐng)求,并進(jìn)行處理。這樣,我們不需要任何額外的配置文件,也不需要任何框架的幫忙,就能完成邏輯。

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

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

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

我們到底要什么?

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

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

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

在這個(gè)例子中,就是name和password。他們共同構(gòu)成了程序的核心載體。事實(shí)上,我們往往會(huì)有一個(gè)User類來封裝name和password,這樣會(huì)使得我們的程序更加OO。無論怎么說,數(shù)據(jù)會(huì)穿插在這個(gè)程序的各處,成為程序運(yùn)行的核心。

2.頁(yè)面展示

在這個(gè)例子中,就是login.jsp。沒有這個(gè)頁(yè)面,一切的請(qǐng)求、驗(yàn)證和錯(cuò)誤展示也無從談起。在頁(yè)面上,我們需要利用HTML,把我們需要展現(xiàn)的數(shù)據(jù)都呈現(xiàn)出來。同時(shí)我們也需要完成一定的頁(yè)面邏輯,例如,錯(cuò)誤展示,分支判斷等等。

3.處理具體業(yè)務(wù)的場(chǎng)所

在這里,不同階段,處理具體業(yè)務(wù)的場(chǎng)所就不太一樣。原來用JSP和Servlet,后來用Struts1或者Struts2的Action。

上面的這些必須出現(xiàn)的元素,在不同的年代,被賦予了不同的表現(xiàn)形式,有的受到時(shí)代的束縛,其表現(xiàn)形式非常落后,有的已經(jīng)不再使用。但是撥開這些外在的表現(xiàn)形式,我們就可以發(fā)現(xiàn),這不就是我們已經(jīng)熟門熟路的MVC嘛?

數(shù)據(jù) —— Model

頁(yè)面展示 —— View

處理具體業(yè)務(wù)的場(chǎng)所 —— Control

所以,框架不重要,概念是王道。只要能夠深刻理解MVC的概念,框架對(duì)你來說,只是一個(gè)jar包而已。

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

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

1. 數(shù)據(jù)從View層傳遞到Control層,如何使得一個(gè)個(gè)扁平的字符串,轉(zhuǎn)化成一個(gè)個(gè)生龍活虎的Java對(duì)象。

2. 數(shù)據(jù)從View層傳遞到Control層,如何方便的進(jìn)行數(shù)據(jù)格式和內(nèi)容的校驗(yàn)?

3. 數(shù)據(jù)從Control層傳遞到View層,一個(gè)個(gè)生龍活虎的Java對(duì)象,又如何在頁(yè)面上以各種各樣的形式展現(xiàn)出來。

4. 如果你試圖將數(shù)據(jù)請(qǐng)求從View層發(fā)送到Control層,你如何才能知道你要調(diào)用的究竟是哪個(gè)類,哪個(gè)方法?一個(gè)Http的請(qǐng)求,又如何與Control層的Java代碼建立起關(guān)系來?

除此之外,Control層似乎也沒有想象中的那么簡(jiǎn)單,因?yàn)樗鳛橐粋€(gè)控制器,至少還需要處理以下的問題:

1. 作為調(diào)用邏輯處理程序的facade門面,如果邏輯處理程序發(fā)生了異常,我們?cè)撊绾翁幚恚?/p>

2. 對(duì)于邏輯處理的結(jié)果,我們需要做怎么樣的處理才能滿足豐富的前臺(tái)展示需要?

這一個(gè)又一個(gè)問題的提出,都基于對(duì)MVC的基本概念的挖掘。所以,這些問題都需要我們?cè)趯懗绦虻臅r(shí)候去一一解決。說到這里,這篇文章開頭所提的問題應(yīng)該可以有答案了:框架是為了解決一個(gè)又一個(gè)在Web開發(fā)中所遇到的問題而誕生的。不同的框架,都是為了解決不同的問題,但是對(duì)于程序員而言,他們只是jar包而已。框架的優(yōu)缺點(diǎn)的評(píng)論,也完全取決于其對(duì)問題解決程度和解決方式的優(yōu)雅性的評(píng)論。所以,千萬不要為了學(xué)習(xí)框架而學(xué)習(xí)框架,而是要為了解決問題而學(xué)習(xí)框架,這才是一個(gè)程序員的正確學(xué)習(xí)之道。

原文鏈接:http://www.cnblogs.com/itao/archive/2011/08/22/2148844.html

【編輯推薦】

  1. 商業(yè)計(jì)算中Java高精度計(jì)算BigDecimal類
  2. Spring MVC攔截器實(shí)現(xiàn)分析
  3. 不需要Web應(yīng)用服務(wù)器Java實(shí)現(xiàn)WebServices
  4. JAVA設(shè)計(jì)模式:工廠模式之簡(jiǎn)單工廠
  5. 調(diào)用Java NIO提高文件讀寫速度
責(zé)任編輯:林師授 來源: itao_o的博客
相關(guān)推薦

2024-01-09 12:05:24

SSH協(xié)議端口

2022-12-02 09:13:28

SeataAT模式

2012-02-21 13:55:45

JavaScript

2009-03-16 15:55:21

Java責(zé)任鏈模式

2009-06-22 15:34:00

Javascript

2011-07-04 10:39:57

Web

2021-03-16 08:54:35

AQSAbstractQueJava

2022-01-12 08:54:52

Spring編程架構(gòu)設(shè)計(jì)

2009-06-18 10:23:03

Javascript 基本框架

2012-05-21 09:51:25

對(duì)象Cocoa

2009-06-29 15:25:00

Java多線程

2022-09-26 09:01:15

語言數(shù)據(jù)JavaScript

2019-11-11 14:51:19

Java數(shù)據(jù)結(jié)構(gòu)Properties

2009-11-30 16:46:29

學(xué)習(xí)Linux

2017-07-02 18:04:53

塊加密算法AES算法

2019-01-07 15:29:07

HadoopYarn架構(gòu)調(diào)度器

2021-07-20 15:20:02

FlatBuffers阿里云Java

2012-05-21 10:06:26

FrameworkCocoa

2011-11-11 10:32:52

Java

2022-01-13 09:38:25

Android架構(gòu)設(shè)計(jì)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)