如何理解 ssh 三大框架?

馬上要進入企業面試了,有些方面還不太了解


要理解SSH三大框架,那麼最好是用SSH三大框架做一個項目啦

這是一個模仿天貓的練手項目

1. 項目演示地址

前台: http://how2j.cn/tmall
後台: http://how2j.cn/tmall/admin

2. 在本地跑起來看看效果

2.1 本地演示

上一步的演示地址是在別人的網站上的,最好呢,能在自己機器上也把這個項目跑起來,在本機看到效果。

為了方便同學在本機觀看演示效果,特意準備了一個無需安裝JDK,無需配置TOMCAT,無需安裝配置資料庫的可運行演示。

下載tomcat_with_jdk_hsqldb_tmall_ssh.rar

解壓後運行 bin目錄里的 startup.bat,就可以馬上在本機看到和上述演示地址一樣的效果:

2.2 使用Eclipse的Dynamic Web Project風格演示

上述的做法是為了方便同學們在本地看到效果,而特意把很多細節都封裝起來了。 而這一步呢,會按照真正做一個SSH項目那樣,創建一個Dynamic Web Project風格的項目,自己動手導入SQL語句,導入項目,在Eclipse中啟動Tomcat,然後再訪問地址,用這種風格在本地演示出項目的效果來。

由於演示數據較多:

tmall_ssh.sql 包含17個分類,每種分類下5個產品,總計85件產品。 每個產品下有20餘張圖片,總計1777張圖片,以及屬性和屬性值等信息。

如果使用某些mysql工具導入,當數據量大的時候,會容易出錯,所以提供了一個命令行格式以及指導,確保成功地導入數據:

相關下載里的 tmall_ssh_altogether.rar里包含了這個tmall_ssh項目。同樣的,對於某些不太熟練的同學,也提供了一個說明,用於引導如何成功地導入這個項目到eclipse中,以便順利地按照開發一個真實項目的方式,在本地演示起來。

如此這般,便可以自己也搭建一個模仿天貓的SSH項目,在自己的機器上看到效果,確認項目本身是可用的。

3. 學習風格

3.1 視頻講解

在關鍵功能部分,都是有視頻講解的,但是視頻講解有幾個缺陷

  • 看著老師敲代碼很拖沓,速度慢,效率低,有時候自己都睡著了
  • 有的視頻較長,很難堅持一直全神貫注地聽課。 有些關鍵部分,一走神沒有聽到,自己可能恰恰就卡在這裡了
  • 哪裡有疑問,得回頭再翻視頻,得一點點再從頭聽,才能找到自己要的答案,花費時間較長,效率頗低
  • 沒有代碼,或者只給出了最後的代碼,中間步驟代碼沒有,自己即便照著視做,也常常卡殼

考慮到視頻講解確實存在這些問題,這個SSH項目的學習風格,不太一樣:

3.2 學習建立在細節度很高的步驟截圖和代碼上

每一個步驟都進行了截圖和文字講解

每個步驟都給出了完整的代碼,易於複製粘貼,便於使用

對關鍵方法都有非常細緻的講解

在大部分時候,甚至僅僅通過這個圖文講解,照著做,就可以把項目功能做出來了,甚至都不需要觀看視頻

3.3 先動手自己做,做的過程碰到問題了,再回頭看視頻,這樣就是帶著問題看視頻了,有目標性,針對性強,學習效率高

3.4 每個項目的功能學習,都採用「先運行,看到效果,再學習的風格」

為了便於理解和消化,這個SSH項目,拆成了132個知識點和535個開發步驟。每個功能相關的知識點,右上角都有當前進度的可運行項目

這樣做有什麼好處呢?

  • 第一,確保按照這些步驟學習,是可以跑出來的,建立對教程的信心,鞏固自己學習下去的信心。
  • 第二,這種反向學習的方式,在看到效果之後,再來學習做了哪些步驟,這樣更容易理解每個步驟的含義
  • 第三,自己按照步驟,動手做。 即便是做錯了,心裡也有底,因為手裡有個「正確答案」,對比與「正確答案」的區別,可以非常快速的定位問題代碼所在,糾正錯誤。 其實學習編程啊,就是要犯很多錯,不犯錯,自己是不會有深刻印象的。 而採用這種方式,即便是犯錯,也會以較快的方式定位到錯在哪裡,加快學習的效率。
  • 第四,提供了一個在線代碼比較器,方便定位問題所在

第五,自己做了一遍,犯了錯誤,再去比較「正確答案」,自己通過思考和探索找到問題所在,還有比這樣更有效的學習嗎?

4. 項目學習思路

這個用SSH框架做的模仿天貓內容還是比較豐富的,要想吸收和消化這個教程的內容也不容易,為了協助同學們步步為營,穩紮穩打地把這個項目吃掉,設計了如下的學習思路

4.1 由淺入深,從零開始

要說各種J2EE,SSH,SSM項目那是一抓一大把,git, 度娘, csdn上隨便一搜,都是各種各樣的。 可是拿到手的,都是別人現成的,做好了的項目了,即不便於閱讀,也很難消化和理解。 這個教程呢,就從零開始,從無到有,一步一步地演示一個典型的項目是怎麼做出來的。

  • 從需求分析開始,明確要做哪些功能。
  • 然後分析表結構,確定什麼樣的表結構,表關係,可以支撐需求中的業務功能。
  • 接著準備界面原型,明確視圖部分要做成什麼樣子
  • 最後才開始進行前後台功能的具體開發
  • 隨著功能的開發,會逐漸察覺到SSH的不足之處,接著又實用重構的思路來解決和優化這些問題

4.2 分析要做什麼(項目目標)

開始做項目之前,首先要確定要做成什麼樣子。

4.3 表結構設計

表結構設計是非常重要的,如果這一步沒有做正確,將無法支持業務功能的需求,所以放在第一步來做。
在這部分列出了表與表之間的關係,建表的SQL語句等等。
值得一提的是,因為表比較多,為了便於理解每張表的作用,特意把表和前台頁面截圖做了對應,從感性上理解這些表都是幹什麼用的。

比如這個產品表與產品頁面的截圖,這樣表的每個欄位在界面上分別對應什麼樣的顯示數據,對於這個表有什麼用,心裡就會有底很多。

4.4 後台第一個功能開發

在功能開發環節,比如後台功能,通常來說,大部分後台功能是比較接近的,主要是業務數據的CRUD操作。 而做第一個的時候,不僅需要規範化,對於不熟悉的同學,也會略感吃力。 所以在講解如何做後台第一個分類管理功能的時候,把其拆的特別細,碾碎到很小的顆粒,這樣消化起來就容易多了。

4.5 項目重構

隨著使用SSH框架把分類管理的完成,不僅感受到SSH框架的便利性,同樣對其存在的弊端也有所察覺了。 這個時候,就需要一個有多年工作經驗,並且對這類問題有豐富解決手段的同志:我(臉紅一秒) 來提出一個如何看待這些問題的角度,以及解決辦法了。

而重構本身確實需要建立在相當的功力基礎之上的,為了讓同學們在重構這個環節儘可能多的收穫更多,把重構行為的學習作成了一下幾個部分以便消化。

  • 首先提出當前存在的問題

  • 接著需要重構的行為,拆成容易理解的知識點

  • 並且每個重構知識點裡,都採用由終至始的方式,先看重構的效果,然後再說怎麼重構,最後再次通過比較,觀察因為重構帶來的好處。

  • 持續重構

重構不是一蹴而就的,伴隨這項目的進行,後續還會進行多次重構, 這些都是寶貴的項目經驗積累,很寶貴的哦

4.6 其他後台

在完成了第一個後台管理之後,其他的後台管理也就比較容易掌握了

4.7 前台第一個功能

與後台一樣,前台的第一個功能:首頁,也會拿出來精講

4.8 前台其他功能

首頁做好了之後,就可以開始做前台的其他功能了:

5. SSH某些用法不熟悉怎麼辦?

既然學習SSH項目,自然是對SSH各種基本用法有一定了解的。 不過SSH內容確實較為豐富,難免有些地方即便是學習了,到用的時候,也記不起來了。 那怎麼辦呢?

當然是缺什麼,學什麼啦~ 這個時候,自己是處於飢餓狀態,其實是對知識很好的吸收和消化的。 所以也提供了Hiberante,Spring,Struts ,SSH整合思路的免費教程:

做項目期間,哪裡二麻二麻了,就回頭看看相關教程,即鞏固了SSH的基礎,也讓項目的學習流暢度更好

6. 可期待的收穫

看上去這個項目也不短嘛,那麼真正學完這個項目後,能夠得到什麼呢?

6.1 典型業務場景的掌握

所謂的典型業務場景就是各種商業項目里,都會有類似或者接近的功能。 在這個項目里你掌握了這些業務場景的開發,去工作之後,做類似的就能駕輕就熟。 那麼都有哪些業務場景呢?

6.2 設計模式的掌握

設計模式的書和文章有很多,從我自己學習和工作的經驗來看,如果一種設計模式,我只是在書上看過,卻沒有在實際工作中運用的話,那麼猶如無根之樹,打一把dota就忘記了,即無法深入理解其中的原理,也不能在真正工作的時候,靈活地運用到他們。

7. 教程地址:how2j.cn/t/59

教程由個人完成,局限於個人的經驗和視野,有諸多不足之處,請各位多多指點,謝謝。

收藏的同學,請記得點個贊~


SSH框架一般指的是Struts、Spring、Hibernate,後來Struts2代替了Struts。最近5年,Struts2已經被Spring MVC代替,而Hibernate基本也被iBatis/MyBatis代替。

所以你真正需要了解的是Spring,Spring你需要了解兩個概念AOP和IOC,更進一步就是Spring的核心技術「動態代理」。

持久層框架看看Hibernate/iBatis/MyBatis,研究一下Spring的資料庫事務管理,各個持久層框架式如何實現ORM的,了解至少一種緩存框架,知道什麼是資料庫連接池。和資料庫的交互最核心的不是ORM,而是掌握和資料庫相關的能力,比如資料庫編程、SQL優化、對範式的理解。

MVC框架Struts2和Spring MVC,你需要知道他們在web.xml文件里配置了一些什麼,Struts2/Spring MVC接到前台請求之後經過哪些步驟之後轉到Action/Controller,return之後Struts2/Spring MVC又作了些什麼。還有就是Filter、Listener和Struts2/Spring MVC的攔截器各有什麼特點,適合處理什麼樣的問題。


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

然而,如果在面試的時候問這些程序員,你們為什麼要學習這些框架?這些框架的本質到底是什麼?似乎很少很少有人能夠給我非常滿意的答覆。因為他們都在為了學習而學習,為了工作而學習,而不是在真正去深入了解一個框架。其實所有的人都應該思考這樣的問題:為什麼要學習框架?框架到底給我帶來了什麼?接下來,我們以登錄作為一個最簡單的例子,來看看不同的年代,我們是怎麼寫Web程序的。

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

後來,程序寫得越來越多,我們發現,這種在HTML代碼中編寫Java代碼來完成邏輯的方式存在著不少問題

  1. Java代碼由於混雜在一個HTML環境中而顯得混亂不堪,可讀性非常差。JSP文件有時候會變成幾十K,甚至上百K。要找一段邏輯,經常無法位

2. 編寫代碼時非常困惑,不知道代碼到底應該寫在哪裡,也不知道別人是不是已經曾經實現過類似的功能,到哪裡去引用。

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

4. 邏輯處理程序需要自己來維護生命周期,對於類似資料庫事務、日誌等眾多模塊無法統一支持。

在這個時候,如果有一個產品,它能夠將頁面上的那些Java代碼抽取出來,讓頁面上盡量少出現Java代碼,該有多好。於是許多人開始使用servlet來處理那些業務邏輯。

1.public class LoginServlet extends HttpServlet {

2./* (non-Javadoc)

3.* @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)

4.*/

5.@Override

6.protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

7.String message = null;

8.RequestDispatcher dispatcher = req.getRequestDispatcher("/result.jsp");

9.String name = req.getParameter("name");

10.String password = req.getParameter("password");

11.UserHandler userHandler = new UserHandler();

12.if(userHandler.authenticate(name, password)) {

13.message = "恭喜你,登錄成功";

14.} else {

15.message = "對不起,登錄失敗";

16.}

17.req.setAttribute("message", message);

18.dispatcher.forward(req, resp);

19.}

20.}

在這裡,我們需要在web.xml中為這個servlet配置url的請求關係。

1.&

2.&Login&

3.&

4.com.demo2do.servlet.LoginServlet

5.&

6.&

7.&

8.&Login&

9.&

10./Login

11.&

12.&

代碼重構到這裡,我們發現,其實我們的工作量本身並沒有減少,只是代碼從JSP移動到了Servlet,使得整個流程看上去稍微清楚了一些。然而,為了這麼點乾淨,我們付出的代價是什麼?為每個servlet都在web.xml裡面去做一個url的請求配置!

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

很多年前,那是一個貧苦的年代,如果我們要使用Java在網頁上做一些動態的交互功能。很多人會告訴你一個技術,叫做JSP。在我還對Java非常困惑的時候,就有人告訴我,JSP是個好東西,它可以在HTML代碼裡面寫Java代碼來完成邏輯。

1.&<%

2.String name = request.getParameter("name");

3.String password = request.getParameter("password");

4.UserHandler userHandler = new UserHandler();

5.if(userHandler.authenticate(name, password)) {

6.%&>

7.&

恭喜你,登錄成功&

8.&<%

9.} else {

10.%&>

11.&

對不起,登錄失敗&

12.&<%

13.}

14.%&>

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

再後來,出現框架。

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

truts的代碼示例我就不貼了,網上隨便搜搜你可以發現一堆一堆的。在一定程度上,struts能夠解決web開發中的職責分配問題,使得顯示與邏輯分開。不過在很長一段時間內,使用struts的程序員往往無法分別我們到底需要web框架幫我們做什麼,我們到底需要它完成點什麼功能?

我們到底要什麼?

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

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

1. 數據

在這個例子中,就是name和password。他們共同構成了程序的核心載體。事實上,我們往往會有一個User類來封裝name和password,這樣會使得我們的程序更加OO。無論怎麼說,數據會穿插在這個程序的各處,成為程序運行的核心。

2.頁面展示

在這個例子中,就是login.jsp。沒有這個頁面,一切的請求、驗證和錯誤展示也無從談起。在頁面上,我們需要利用HTML,把我們需要展現的數據都呈現出來。同時我們也需要完成一定的頁面邏輯,例如,錯誤展示,分支判斷等等。

3.處理具體業務的場所

在這裡,不同階段,處理具體業務的場所就不太一樣。原來用JSP和Servlet,後來用Struts1或者Struts2的Action。

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

數據 —— Model

頁面展示 —— View

處理具體業務的場所 —— Control

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

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

在這幅圖中,MVC三個框框各司其職,結構清晰明朗。不過我覺得這幅圖忽略了一個問題,就是數據是動的,數據在View和Control層一旦動起來,就會產生許多的問題:

1. 數據從View層傳遞到Control層,如何使得一個個扁平的字元串,轉化成一個個生龍活虎的Java對象。

2. 數據從View層傳遞到Control層,如何方便的進行數據格式和內容的校驗?

3. 數據從Control層傳遞到View層,一個個生龍活虎的Java對象,又如何在頁面上以各種各樣的形式展現出來。

4.如果你試圖將數據請求從View層發送到Control層,你如何才能知道你要調用的究竟是哪個類,哪個方法?一個Http的請求,又如何與Control層的Java代碼建立起關係來?

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

1. 作為調用邏輯處理程序的facade門面,如果邏輯處理程序發生了異常,我們該如何處理?

2. 對於邏輯處理的結果,我們需要做怎麼樣的處理才能滿足豐富的前台展示需要?

這一個又一個問題的提出,都基於對MVC的基本概念的挖掘。所以,這些問題都需要我們在寫程序的時候去一一解決。說到這裡,這篇文章開頭所提的問題應該可以有答案了:框架是為了解決一個又一個在Web開發中所遇到的問題而誕生的。不同的框架,都是為了解決不同的問題,但是對於程序員而言,他們只是jar包而已。框架的優缺點的評論,也完全取決於其對問題解決程度和解決方式的優雅性的評論。所以,千萬不要為了學習框架而學習框架,而是要為了解決問題而學習框架,這才是一個程序員的正確學習之道。

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

推薦一本書,寫得非常好《Struts2+技術內幕——深入解析Struts2架構設計與實現原理》——孔夫子網有賣的


你從更廣更高的視角去理解,延展到整個Web應用的技術發展和架構變遷來看,你會理解得更加深刻。你能對這些內容侃侃而談,相信對於面試有很大加分。

參考我這個回答 Web 建站技術中,HTML、HTML5、XHTML、CSS、SQL、JavaScript、PHP、ASP.NET、Web Services 是什麼? - David 的回答

下面是跟SSH相關的一部分內容:

5、框架橫飛的年代:MVC,ORM

.net和J2EE兩大平台誕生之後,組件化編程技術盛極一時,Web技術的發展開始了一段框架橫飛的年代,各種輔助Web開發的技術框架層出不窮。雖然腳本語言大大提高了應用開發效率,但是試想一個複雜的大型Web應用,訪問各種功能的URL地址紛繁複雜,涉及到的Web頁面多種多樣,同時還管理著大量的後台數據,因此我們需要在架構層面上解決維護性和擴展性等問題。這個時候,MVC的概念被引入到Web開發中來了。2004年出現的Struts就是當時非常流行的Java Web開發的MVC框架。MVC早在1978年就作為Smalltalk的一種設計模式被提出來了,應用到Web應用上,模型Model用於封裝與業務邏輯相關的數據和數據處理方法,視圖View是數據的HTML展現,控制器Controller負責響應請求,協調Model和View。Model,View和Controller的分開,是一種典型的關注點分離的思想,不僅使得代碼復用性和組織性更好,使得Web應用的配置性和靈活性更好。這是Spring MVC的示意圖,典型的MVC架構。

此外,數據訪問也逐漸通過面向對象的方式來替代直接的SQL訪問,出現了ORM(Object Relation Mapping)的概念,2001年出現的Hibernate就是其中的佼佼者,已經成為Java持久層的規範JPA的主要參考和實現。更多的全棧框架開始出現,比如2003年出現的Java開發框架Spring,同時更多的動態語言也被加入到Web編程語言的陣營中,2004年出現的Ruby開發框架Rails,2005出現的Python開發框架Django,都提供了全棧開發框架,或者自身提供Web開發的各種組件,或者可以方便的集成各種組件。比如Spring基於IoC和AOP思想可以方便得整合出全套Web開發組件,SSH(Struts+Spring+Hibernate)一度成為Java Web開發的標配。值得一提的時Rails這個MVC框架,26歲的丹麥大神David Heinemeier Hansson在開發著名項目管理軟體BaseCamp的過程中形成,Ruby語言本身在快速開發上的優勢,加上Rails諸如崇尚DRY(Don"t)Repeat Yourself)原則, 約定優於配置,擁抱REST等特性,使其迅速成為一個極其流行的Web開發框架。

可以看這篇文章:Web開發技術發展歷史


自從離開北大青鳥我就沒見有人談過Java的SSH,說的都是*nix的SSH工具。


還ssh,多少年前啊!知識要更新啊

現在沒有strut了,用spring誰會用stuct呢?

好好理解spring的ioc,aop的原理,思想,實現方式,bean的作用域的使用實現,spring的各種擴展點,這些才是重要的。


我覺得現在框架就spring,其他都是工具


我們知道,傳統的Java Web應用程序是採用JSP+Servlet+Javabean來實現的,這種模式實現了最基本的MVC分層,使的程序結構分為幾層,有負責前台展示的 JSP、負責流程邏輯控制的Servlet以及負責數據封裝的Javabean。但是這種結構仍然存在問題:如JSP頁面中需要使用符號嵌入很多的 Java代碼,造成頁面結構混亂,Servlet和Javabean負責了大量的跳轉和運算工作,耦合緊密,程序復用度低等等。

Struts

為了解決這些問題,出現了Struts框架,它是一個完美的MVC實現,它有一個中央控制類(一個 Servlet),針對不同的業務,我們需要一個Action類負責頁面跳轉和後台邏輯運算,一個或幾個JSP頁面負責數據的輸入和輸出顯示,還有一個 Form類負責傳遞Action和JSP中間的數據。JSP中可以使用Struts框架提供的一組標籤,就像使用HTML標籤一樣簡單,但是可以完成非常複雜的邏輯。從此JSP頁面中不需要出現一行包圍的Java代碼了。

可是所有的運算邏輯都放在Struts的Action里將使得 Action類復用度低和邏輯混亂,所以通常人們會把整個Web應用程序分為三層,Struts負責顯示層,它調用業務層完成運算邏輯,業務層再調用持久層完成資料庫的讀寫。

使用JDBC連接來讀寫資料庫,我們最常見的就是打開資料庫連接、使用複雜的SQL語句進行讀寫、關閉連接,獲得的數據又需要轉換或封裝後往外傳,這是一個非常煩瑣的過程。

Hibernate

這時出現了 Hibernate框架,它需要你創建一系列的持久化類,每個類的屬性都可以簡單的看做和一張資料庫表的屬性一一對應,當然也可以實現關係資料庫的各種表件關聯的對應。當我們需要相關操作是,不用再關注資料庫表。我們不用再去一行行的查詢資料庫,只需要持久化類就可以完成增刪改查的功能。使我們的軟體開發真正面向對象,而不是面向混亂的代碼。

現在我們有三個層了,可是每層之間的調用是怎樣的呢?比如顯示層的Struts需要調用一個業務類,就需要new一個業務類出來,然後使用;業務層需要調用持久層的類,也需要new一個持久層類出來用。通過這種new的方式互相調用就是軟體開發中最糟糕設計的體現。簡單的說,就是調用者依賴被調用者,它們之間形成了強耦合,如果我想在其他地方復用某個類,則這個類依賴的其他類也需要包含。程序就變得很混亂,每個類互相依賴互相調用,復用度極低。如果一個類做了修改,則依賴它的很多類都會受到牽連。為此,出現Spring框架。

Spring

Spring的作用就是完全解耦類之間的依賴關係,一個類如果要依賴什麼,那就是一個介面。至於如何實現這個介面,這都不重要了。只要拿到一個實現了這個介面的類,就可以輕鬆的通過xml配置文件把實現類注射到調用介面的那個類里。所有類之間的這種依賴關係就完全通過配置文件的方式替代了。所以 Spring框架最核心的就是所謂的依賴注射和控制反轉。

現在的結構是,Struts負責顯示層,Hibernate負責持久層,Spring負責中間的業務層,另外,由於Spring使用的依賴注射以及AOP(面向方面編程),所以它的這種內部模式非常優秀,以至於Spring自己也實現了一個使用依賴注射的MVC框架,叫做Spring MVC,同時為了很好的處理事物,Spring集成了Hibernate,使事物管理從Hibernate的持久層提升到了業務層,使用更加方便和強大。


java框架的學習有一個最基本的原則,必須是先遇到問題,然後再去學相應的框架去解決這個問題,你都沒遇到過這個問題,然後去學框架,你都不知道他是幹啥的,學會是不可能的,反而會覺得框架特別繁瑣,沒效率.


要理解三大框架,先要理解JavaEE三層架構。

web層之前的事情是由servlet來處理,之後出現了Struts2,它把servlet這部分的事情取代了。

而dao層,負責的是數據的操作。你之前可能用過自己配置的連接池或者c3p0、DBUtils這樣的工具,但那些還不夠面向對象。於是出現了hibernate這樣的ORM(object relational mapping)框架,對底層的資料庫操作進行封裝,持久化數據。

service層的業務由JavaBean負責。而spring的IoC、AOP這些高級特性可以幫你更好地管理對象。


初學Java沒有用過SSH框架,用的最多的是SSM框架,即spring,springMVC,mybatis,現在用的較多的還是這三大框架,用起來比較的簡單,也很方便,我感覺用框架就是知道怎麼用就行了,

最主要的是要理解使用框架的核心思想,就是要將業務邏輯和數據進行分離,提高程序的可讀性和維護性,就是因為以前的方法沒法保證程序的健壯性,所以框架的出現就是為了解決這一問題的,其他的我不覺得他比傳統的編程好到了哪兒,要說好倒是有點兒就是以前我們做的一些覺得很繁瑣的事,現在不需要我們自己來做了,全都由框架來做了,其他的我就不知道了,如果有人有更好的見解還望分享一下


去某個餐廳吃飯,服務員回給你一個菜單,然後你在菜單上勾選要吃的飯菜,填好之後把單子給服務員,然後服務員把單子給後廚,後廚裡面有摘菜的,有廚師,還有很多買來的菜,廚師把摘菜阿姨阿姨的菜做成一道完整的菜,然後服務員把菜端給你,你就開吃了


SSH是mvc的經典詮釋,用這個鍛煉mvc的思維模式,但現在公司用很少了 基本都是spring mvc 不過先掌握SSH再接觸spring mvc和mybatis那些會相對容易些


我到現在都是比較的迷茫!框架到底該如何學習才能理解更加深入!每出現一個新的框架,都是一堆的配置,然後開始與spring進行整合!


我是先學的ssm,後來學了ssh後感覺各有各的優缺點,也不是你所說的Struts2被springMVC取代,而且hibernate的功能很強大的,Mybatis相對來說能夠更加簡化開發,並沒有得到取代的作用


運用唯物主義辯證法思想,這個世界的每個物體都是獨立統一而又互相聯繫的,我們的JAVAWEB開發也一樣。

大型項目,如果不分層編寫代碼,很容易導致邏輯混亂,也不適合團隊開發與維護。於是就出現了MVC的分層思想。

為了讓MVC的思想更加徹底,以及編程自動化(我發明的詞),於是發明了SSH。

具體來說,Hibernate解決了SQL語句與面向對象編程的衝突,Struts解決了頁面跳轉問題採用過濾器實現,Spring通過面向介面實現了action層、service層與DAO層的解耦,SSH框架通過XML文檔(註解)來實現各個模塊的聯繫。


我們知道,傳統的Java Web應用程序是採用JSP+Servlet+Javabean來實現的,這種模式實現了最基本的MVC分層,使的程序結構分為幾層,有負責前台展示的 JSP、負責流程邏輯控制的Servlet以及負責數據封裝的Javabean。但是這種結構仍然存在問題:如JSP頁面中需要使用符號嵌入很多的 Java代碼,造成頁面結構混亂,Servlet和Javabean負責了大量的跳轉和運算工作,耦合緊密,程序復用度低等等。

Struts

為了解決這些問題,出現了Struts框架,它是一個完美的MVC實現,它有一個中央控制類(一個 Servlet),針對不同的業務,我們需要一個Action類負責頁面跳轉和後台邏輯運算,一個或幾個JSP頁面負責數據的輸入和輸出顯示,還有一個 Form類負責傳遞Action和JSP中間的數據。JSP中可以使用Struts框架提供的一組標籤,就像使用HTML標籤一樣簡單,但是可以完成非常複雜的邏輯。從此JSP頁面中不需要出現一行包圍的Java代碼了。

可是所有的運算邏輯都放在Struts的Action里將使得 Action類復用度低和邏輯混亂,所以通常人們會把整個Web應用程序分為三層,Struts負責顯示層,它調用業務層完成運算邏輯,業務層再調用持久層完成資料庫的讀寫。

使用JDBC連接來讀寫資料庫,我們最常見的就是打開資料庫連接、使用複雜的SQL語句進行讀寫、關閉連接,獲得的數據又需要轉換或封裝後往外傳,這是一個非常煩瑣的過程。

Hibernate

這時出現了 Hibernate框架,它需要你創建一系列的持久化類,每個類的屬性都可以簡單的看做和一張資料庫表的屬性一一對應,當然也可以實現關係資料庫的各種表件關聯的對應。當我們需要相關操作是,不用再關注資料庫表。我們不用再去一行行的查詢資料庫,只需要持久化類就可以完成增刪改查的功能。使我們的軟體開發真正面向對象,而不是面向混亂的代碼。

現在我們有三個層了,可是每層之間的調用是怎樣的呢?比如顯示層的Struts需要調用一個業務類,就需要new一個業務類出來,然後使用;業務層需要調用持久層的類,也需要new一個持久層類出來用。通過這種new的方式互相調用就是軟體開發中最糟糕設計的體現。簡單的說,就是調用者依賴被調用者,它們之間形成了強耦合,如果我想在其他地方復用某個類,則這個類依賴的其他類也需要包含。程序就變得很混亂,每個類互相依賴互相調用,復用度極低。如果一個類做了修改,則依賴它的很多類都會受到牽連。為此,出現Spring框架。

Spring

Spring的作用就是完全解耦類之間的依賴關係,一個類如果要依賴什麼,那就是一個介面。至於如何實現這個介面,這都不重要了。只要拿到一個實現了這個介面的類,就可以輕鬆的通過xml配置文件把實現類注射到調用介面的那個類里。所有類之間的這種依賴關係就完全通過配置文件的方式替代了。所以 Spring框架最核心的就是所謂的依賴注射和控制反轉。

現在的結構是,Struts負責顯示層,Hibernate負責持久層,Spring負責中間的業務層,另外,由於Spring使用的依賴注射以及AOP(面向方面編程),所以它的這種內部模式非常優秀,以至於Spring自己也實現了一個使用依賴注射的MVC框架,叫做Spring

MVC,同時為了很好的處理事物,Spring集成了Hibernate,使事物管理從Hibernate的持久層提升到了業務層,使用更加方便和強大。


現在的多的還是:Spring MVC、SSM,Spring Boot。


用純java代碼配置對初學者還是比較有幫助的。


趕緊改行

如果你還不具備通過閱讀官方文檔/教程學習一個開發框架使用的能力的話

說明你還不適合加入這一行


個人淺見:

1.不跳出ssh的框框,就無法理解ssh框架。剛入手web開發工作/學習,就試圖去理解SSH,個人觀點,這是被培訓機構帶偏了。

2.SSH本身的意義不是為了程序員,而是為了老闆,雖然這種嘗試不一定成功。其根本目的是為了「web開發傻瓜化」——降低人力成本。

3.就我所知,似乎並沒有招聘的技術考官會在意對方對SSH的掌控程度。

順便附一條鏈接,這是我很早以前寫的一個系列,目的是為了「懟」我team裡面的「唯框架至上」思想,非廣告推廣:) 希望對你有用。

WEB開發那些事兒


現在在學框架呢,怎麼說呢。Struts2MVC其實理解起來比較簡單吧 。

就是jsp(前台) 然後是通過action———sturts2.xml————Action(java servlet處理表單數據)————jsp。感覺有瑕疵寫的有點問題。struts2方面之處就是講各種複雜的表單顯示什麼的(radio,checkbox)變成了一個個&標籤。

spring的話現在在學源碼。


spring spring spring


推薦閱讀:

Github上有沒有關於springmvc框架的項目?
如何用最簡單的方式解釋依賴注入?依賴注入是如何實現解耦的?

TAG:框架 | Java | Struts2 | Spring | Hibernate |