2013-05-08 90 views
21

我需要清除一些事情。我一直在尋找這個答案,但我似乎無法找到對我的具體問題的一個很好的答案(例如,這個問題在謎題:Difference between servlet and web service)。何時使用Servlet或@Controller

據我瞭解,有不同的方法可以實現「請求處理」,又名「控制器」,在「MVC爲本」的Web應用程序,其中兩個是:

  1. 一個Java特定Servlet(即,您通過點擊新建 - > Servlet,例如在eclipse中創建的一個),用作「控制器」。這一個 延伸HttpServlet和使用方法,如doGetdoPost
  2. 一個Spring MVC的註解@Controller類(是的,使用DispatcherServlet)。有了這個一個使用@RequestMethodGET/POST

現在我的問題......

  • 當你使用一個或其他?
  • 是否有任何一般優勢使用一種方法而不是其他?(像,是一般建議在另外一個方法是什麼?)

[編輯]:強調關鍵詞

回答

15

如果你是一個對學習語言感興趣的學生,那麼我現在就堅持使用servlets。可以使用servlet編寫Web應用程序,但實際上您也可能想要查看JSP。

JSP是一種編寫servlet的簡便方法,它允許您將html與腳本元素混合使用(儘管建議您避免在jsp中使用Java代碼來支持標記和el表達式)。在封面下它將被編譯爲一個servlet,但它避免了你必須使用大量凌亂的打印語句。

對servlet和JSP至少有一個基本的瞭解是很重要的。 Spring MVC是構建在servlet之上的許多框架之一,旨在使編寫Web應用程序的任務變得更簡單。基本上所有的請求都映射到DispatcherServlet,它的作用是front controller

然後,DispatcherServlet將調用其註釋與傳入請求相匹配的控制器。這比在web.xml中自己編寫這些映射更簡單(儘管使用servlet 3.0,現在可以註釋servlet)。但是,您還可以獲得許多其他好處,例如將表單字段映射到對象,使用jsr303註釋驗證該對象,將輸入和輸出映射到xml或json等等。此外,它與核心彈簧緊密集成,因此您可以輕鬆地將電纜您的服務供控制器調用。

值得注意的是,有很多構建在servlet之上的競爭框架。 Spring MVC是最流行的之一,所以它不是一個不錯的選擇。

+0

好的解釋!我基本瞭解事情是如何獨立運作的,只是我無法確定何時使用任何一種方法。您解釋了兩者之間的差異,但未詳細說明其實際使用領域。你能舉出任何一種情況下我會用另一種方法的例子嗎? – Roger 2013-05-08 12:36:04

+0

它們都用於相同的事情(創建Web應用程序)。不同之處在於Spring MVC增加了許多便利。大多數編寫Java Web應用程序的人將使用在servlet之上編寫的某種框架來簡化開發。例如。如果你突然有一個請求返回json的用例,那麼spring mvc已經支持它,而使用servlet你必須自己弄明白。瞭解servlet,因爲它是基礎技術。 – 2013-05-08 13:35:37

+0

我明白了。所以基本上兩個方法創建一個servlet,做同樣的事情 - 只有在#2你使用Spring MVC作爲框架來幫助你的方式嗎?也就是說,在Spring MVC的@Controller,DispatcherServlet和一些JSP(「java in html」)的幫助下,您可以創建一個相同的東西,就像創建一個Servlet一樣(「.java in java」(即.New - > Servlet)。 ..))和一些JSP/html,只有在Spring MVC的情況下,Spring纔會「免費」處理servlet業務的「討厭部分」?這是否是對這一切的正確理解? (對不起,有點慢:) – Roger 2013-05-08 14:14:37

4

JSF和JSP作爲藏漢在Servlet的Spring MVC的竣工圖。問題在於,servlet並不是非常「好」,因爲你必須編寫直接的html。

如果你能夠使用現代Web技術,我只需要在需要直接HTTP輸出的位置使用servlet,比如將數據庫中的圖像寫入http。

使用與Dipatcherservlet或FacesServlet一起使用的SpringMVC或JSF更快更有趣。他們解析你的文件並通過一個servlet發送它。

+0

JPA與servlet無關。而且,servlet通常與JSP一起使用,就像Spring MVC控制器一樣。 – 2013-05-08 11:57:33

+0

我的意思是JSP當我指JSP時,我總是寫JPA。抱歉。 – 2013-05-08 12:01:05

+0

@Templar感謝您的回答!儘管如此,我仍然有點困惑。你將使用什麼類型的應用程序來使用'@ Controller'(Spring MVC),以及你使用「常規servlet」的應用程序是什麼類型? – Roger 2013-05-08 12:47:40

6

一個Servlet和Spring MVC的控制器可以用來做同樣的事情,但他們的行爲在不同程度上Java應用程序

的servlet是J2EE架構和每一個Java應用程序服務器的一部分(Tomcat的,碼頭等)是爲運行servlet而構建的。 Servlet是J2EE堆棧中的「低級」層。您不需要servlet.jar來運行您的應用程序,因爲它已與應用程序服務器預先打包在一起。Spring MVC控制器是一個基於servlet構建的庫,用於簡化操作。 Spring MVC提供了更多的內置功能,例如控制器方法參數映射的表單參數,更容易處理二進制表單提交(即當表單可以上傳文件時)。您需要將所需的jar打包到您的應用程序以運行Spring MVC控制器

當您需要轉到「低級別」時應該使用servlet,並且示例可能是出於性能原因。 Spring MVC表現良好,但如果它有一些開銷,如果你需要從應用程序服務器中擠出所有的東西(並且已經調整了其他層,比如db),請使用servlet。如果您想了解J2EE Web規範的基礎(即用於教育目的),則可以選擇一個Servlet。

在所有其他情況下,您可以/應該選擇一個Web框架。 Spring MVC就是其中之一;使用Spring MVC,您不需要重新發明輪子(即二進制形式管理,形參到bean轉換,參數驗證等等)。 Spring MVC的另一個優點是,在一個類中你可以很容易地管理來自不同URL和方法的輸入,在servlet中做同樣的事情是可能的,但代碼更復雜,可讀性更差。我的意見是,Spring MVC適用於構建休息服務和管理簡單應用程序(即使用簡單表單的Web應用程序)。如果您需要使用Ajax管理非常複雜的表單,嵌套表單以及具有會話和頁面狀態的應用程序,我的建議是切換到基於組件的框架(例如apache wicket)。

相關問題