Spring MVC - tutorialspoint

1. Spring MVC簡(jiǎn)介

Spring MVC提供model-view-controller架構(gòu)和已有組件,可以開發(fā)靈活宵蛀、松散耦合的web應(yīng)用西乖。MVC模式把應(yīng)用分成不同的概念(輸入邏輯敷燎、業(yè)務(wù)邏輯和UI邏輯)谣殊,組件之間松散耦合。

  • Model封裝應(yīng)用數(shù)據(jù)紊馏,一般上由POJO組成茵宪。
  • View負(fù)責(zé)渲染模型數(shù)據(jù),一般上它會(huì)生成HTML瘦棋,然后由客戶端瀏覽器解析稀火。
  • Controller負(fù)責(zé)處理用戶請(qǐng)求和響應(yīng),構(gòu)建合適的模型赌朋,傳給view進(jìn)行渲染凰狞。

1.1 DispatcherServlet

Spring MVC框架通過DispatcherServlet處理所有的HTTP請(qǐng)求和響應(yīng)。Spring MVC中DispatcherServlet的請(qǐng)求流程如下圖:

請(qǐng)求流程

DispatcherServlet對(duì)傳入的HTTP請(qǐng)求的事件響應(yīng)順序如下:

  1. 接收到HTTP請(qǐng)求后沛慢,DispatcherServlet通過HandleMapping調(diào)用合適的Controller赡若。
  2. Controller收到請(qǐng)求,根據(jù)GET或者POST的不同調(diào)用合適的service方法团甲。service方法根據(jù)業(yè)務(wù)邏輯設(shè)置模型數(shù)據(jù)逾冬,把view名稱返回給DispatcherServlet。
  3. DispatcherServlet通過ViewResolver選取定義的view對(duì)請(qǐng)求進(jìn)行響應(yīng)。
  4. 一旦view初始化身腻,DispatcherServlet把模型數(shù)據(jù)傳給view产还,最后在瀏覽器渲染。

上面提到的組件嘀趟,如HandlerMapping脐区、Controller和ViewResolver是WebApplicationContext的一部分,WebApplicationContext是ApplicationContext的擴(kuò)展她按,為web應(yīng)用添加了一些必要的特性牛隅。

1.2 必需配置

需要在web.xml文件中使用URL映射手動(dòng)配置DispatcherServlet處理的映射請(qǐng)求。下面代碼展示了HelloWeb DispatcherServlet的定義和映射酌泰。

<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 
    <display-name>Spring MVC Application</display-name>

   <servlet>
      <servlet-name>HelloWeb</servlet-name>
      <servlet-class>
         org.springframework.web.servlet.DispatcherServlet
      </servlet-class>
      <load-on-startup>1</load-on-startup>
   </servlet>

   <servlet-mapping>
      <servlet-name>HelloWeb</servlet-name>
      <url-pattern>*.jsp</url-pattern>
   </servlet-mapping>

</web-app>

web.xml文件放在web應(yīng)用的WebContent/WEB-INF目錄下媒佣。首先,在HelloWeb DispatcherServlet初始化時(shí)陵刹,框架會(huì)試圖從名為[servlet-name]-servlet.xml的文件加載應(yīng)用上下文默伍,這個(gè)文件位于WebContent/WEB-INF目錄下。本例中文件名為HelloWeb-servlet.xml授霸。其次,<servlet-mapping>標(biāo)簽指明由那個(gè)DispatcherServlet處理什么URL际插。這里所有以.jsp結(jié)尾的HTTP請(qǐng)求都由HelloWeb DispatcherServlet處理碘耳。

如果不想使用像[servlet-name]-servlet.xml的默認(rèn)名稱和WebContent/WEB-INF的默認(rèn)位置,可以在web.xml中添加ContextLoaderListener的servlet監(jiān)聽器框弛,自定義文件名稱和位置辛辨,如下:

<web-app...>

<!-------- DispatcherServlet definition goes here----->
....
<context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>/WEB-INF/HelloWeb-servlet.xml</param-value>
</context-param>

<listener>
   <listener-class>
      org.springframework.web.context.ContextLoaderListener
   </listener-class>
</listener>
</web-app>

<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

現(xiàn)在來看下HelloWeb-servlet.xml這個(gè)配置文件,它位于WebContent/WEB-INF目錄下:

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
   http://www.springframework.org/schema/beans     
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context 
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">

   <context:component-scan base-package="com.tutorialspoint" />

   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/WEB-INF/jsp/" />
      <property name="suffix" value=".jsp" />
   </bean>

</beans>

以下是HelloWeb-servlet.xml文件的重要知識(shí)點(diǎn):

  • [servlet-name]-servlet.xml文件用來創(chuàng)建定義的bean瑟枫,重寫全局范圍定義的相同名稱的bean斗搞。
  • <context:component-scan...>標(biāo)簽用來激活Spring MVC注解掃描功能,它使用了像@Controller和@RequestMapping等注解慷妙。
  • InternalResourceViewResolver有定義的規(guī)則處理視圖名稱僻焚。像上面定義的規(guī)則,名為hello的邏輯視圖是/WEB-INF/jsp/hello.jsp的代理膝擂。
    下一節(jié)介紹怎樣創(chuàng)建實(shí)際的組件虑啤,如Controller、Model和View等架馋。

1.3 定義Controller

DispatcherServlet把請(qǐng)求委托給controller以執(zhí)行特定的功能狞山。@Controller注解表明指定的類作為controller。@RequestMapping注解用來把URL映射到某個(gè)類或特定的處理方法叉寂。

@Controller
@RequestMapping("/hello")
public class HelloController{
 
   @RequestMapping(method = RequestMethod.GET)
   public String printHello(ModelMap model) {
      model.addAttribute("message", "Hello Spring MVC Framework!");
      return "hello";
   }

}

@Controller注解定義類作為Spring MVC控制器萍启。第一個(gè)@RequestMapping表明這個(gè)控制器中所有的處理方法都是相對(duì)/hello路徑的。注解@RequestMapping(method = RequestMethod.GET)用來聲明pringHello()方法作為控制器默認(rèn)的方法處理HTTP GET請(qǐng)求】贝浚可以定義另一個(gè)方法處理相同URL的POST請(qǐng)求局服。
可以在上面controller的@RequestMapping中添加額外的屬性,如下:

@Controller
public class HelloController{
 
   @RequestMapping(value = "/hello", method = RequestMethod.GET)
   public String printHello(ModelMap model) {
      model.addAttribute("message", "Hello Spring MVC Framework!");
      return "hello";
   }

}

value屬性表明URL和哪個(gè)處理方法映射屡律,method屬性表明方法處理HTTP GET請(qǐng)求腌逢。以下是controller中重要的知識(shí)點(diǎn):

  • 在方法中可以定義需要的業(yè)務(wù)邏輯。也可以按要求在方法中調(diào)用另一個(gè)方法超埋。
  • 基于定義的業(yè)務(wù)邏輯搏讶,可以在方法中創(chuàng)建model』襞梗可以設(shè)定不同的model屬性媒惕,這些屬性可以被view訪問以呈現(xiàn)最終結(jié)果。例子中創(chuàng)建了一個(gè)包含“message”屬性的model来庭。
  • 定義的方法可以返回一個(gè)包含view名稱的字符串妒蔚,用來渲染model。例子中返回“hello”作為邏輯視圖名稱月弛。

1.4 創(chuàng)建JSP視圖

Spring MVC支持多種類型的視圖肴盏,包括JSP,HTML帽衙,PDF菜皂,Excel,XML厉萝,Velocity模板恍飘,XSLT,JSON谴垫,Atom章母,RSS和JasperReport等。但是通常我們使用JSTL來實(shí)現(xiàn)JSP模板翩剪。hello視圖(/WEB-INF/hello/hello.jsp)如下:

<html>
   <head>
   <title>Hello Spring MVC</title>
   </head>
   <body>
   <h2>${message}</h2>
   </body>
</html>

${message}是在Controller中設(shè)置的屬性乳怎。在視圖中可以有多個(gè)屬性顯示。

EL表達(dá)式無法獲取值的解決辦法:
修改web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app id="mvc" version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

1.5 Spring Web MVC實(shí)例

1.5.1 簡(jiǎn)單實(shí)例

通過URLhttp://localhost:8080/HelloWeb/hello訪問
代碼下載

1.5.2 表單提交實(shí)例

通過URLhttp://localhost:8080/HelloWeb1/student訪問
return new ModelAndView("student", "command", new Student());如果在JSP文件中使用<form:form>標(biāo)簽前弯,spring要求一個(gè)包含"command"的對(duì)象舞肆。
@ModelAttribute注解參考文章Using @ModelAttribute on a method argument
代碼下載

1.5.3 重定向?qū)嵗?/h3>

通過URLhttp://localhost:8080/HelloWeb2/index訪問
代碼下載

1.5.4 靜態(tài)頁面實(shí)例

通過URLhttp://localhost:8080/HelloWeb3/index訪問
<mvc:resources.../>標(biāo)簽用來映射靜態(tài)頁面。mapping屬性必須是Ant模式來指定http請(qǐng)求的URL博杖。location屬性必須指定一個(gè)或多個(gè)有靜態(tài)頁面的可用資源目錄位置椿胯,靜態(tài)頁面可以是images、 stylesheets剃根、JavaScript和其他靜態(tài)內(nèi)容哩盲。多個(gè)資源位置可以使用逗號(hào)分隔的值列表。
代碼下載

1.5.5 異常處理實(shí)例

通過URLhttp://localhost:8080/HelloWeb4/student訪問
代碼下載

原文:http://www.tutorialspoint.com/spring/spring_web_mvc_framework.htm

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市廉油,隨后出現(xiàn)的幾起案子惠险,更是在濱河造成了極大的恐慌,老刑警劉巖抒线,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件班巩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嘶炭,警方通過查閱死者的電腦和手機(jī)抱慌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來眨猎,“玉大人抑进,你說我怎么就攤上這事∷悖” “怎么了寺渗?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)兰迫。 經(jīng)常有香客問我信殊,道長(zhǎng),這世上最難降的妖魔是什么汁果? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任涡拘,我火速辦了婚禮,結(jié)果婚禮上须鼎,老公的妹妹穿的比我還像新娘鲸伴。我一直安慰自己府蔗,他們只是感情好晋控,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著姓赤,像睡著了一般赡译。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上不铆,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天蝌焚,我揣著相機(jī)與錄音,去河邊找鬼誓斥。 笑死只洒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的劳坑。 我是一名探鬼主播毕谴,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了涝开?” 一聲冷哼從身側(cè)響起循帐,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舀武,沒想到半個(gè)月后拄养,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡银舱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年瘪匿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纵朋。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柿顶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出操软,到底是詐尸還是另有隱情嘁锯,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布聂薪,位于F島的核電站家乘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏藏澳。R本人自食惡果不足惜仁锯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翔悠。 院中可真熱鬧业崖,春花似錦、人聲如沸蓄愁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撮抓。三九已至妇斤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丹拯,已是汗流浹背站超。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乖酬,地道東北人死相。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像咬像,于是被迫代替她去往敵國(guó)和親算撮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子双肤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,815評(píng)論 6 342
  • Spring的模型-視圖-控制器(MVC)框架是圍繞一個(gè)DispatcherServlet來設(shè)計(jì)的,這個(gè)Servl...
    4ea0af17fd67閱讀 1,052評(píng)論 0 5
  • Spring MVC一钮惠、什么是 Spring MVCSpring MVC 屬于 SpringFrameWork 的...
    任任任任師艷閱讀 3,381評(píng)論 0 32
  • 學(xué)習(xí)資料源:慕課網(wǎng) - Spring MVC起步 內(nèi)容概要 一茅糜、前端控制器(Front Controller) 二...
    拾壹北閱讀 1,966評(píng)論 0 22
  • 前言 對(duì)于Spring MVC項(xiàng)目搭建相信大家按照網(wǎng)上教程來做基本都會(huì),但更多時(shí)候我們應(yīng)該多問幾個(gè)為什么素挽,多思考實(shí)...
    九風(fēng)萍舟閱讀 2,750評(píng)論 0 12