Spring學(xué)習(xí)之Spring MVC 初探

Spring學(xué)習(xí)之Spring MVC 初探

前言

MVC模式,是現(xiàn)代開發(fā)中一種比較常見的模式,主要的作用在于將視圖與控制邏輯藏斩、數(shù)據(jù)等進(jìn)行分離,分離的主要目的自然是為了解耦却盘,試想一下狰域,如果在一個JSP頁面中夾雜了JDBC代碼,事務(wù)處理代碼黄橘,邏輯控制代碼兆览,這樣的頁面是何等的混亂維護(hù)起來的難度也是非常之大。MVC模式正是將者三者進(jìn)行解耦塞关,將整體分為控制層Controller(通常由Servlet來負(fù)責(zé))抬探,視圖層View(通常由JSP或者FreeMaker等模板技術(shù)負(fù)責(zé)),數(shù)據(jù)層Model(通常有Java對象及其相應(yīng)的操作負(fù)責(zé))帆赢,這樣小压,這三者之間各司其職砰左,控制層負(fù)責(zé)控制整體的邏輯,數(shù)據(jù)模型層負(fù)責(zé)對數(shù)據(jù)進(jìn)行處理场航,視圖層在控制層的控制下對數(shù)據(jù)模型層的產(chǎn)生的數(shù)據(jù)進(jìn)行渲染,形成對應(yīng)的視圖廉羔。

Spring MVC簡介

在Web開發(fā)過程中憋他,Web的MVC模式與一般的MVC模式有點(diǎn)差別,主要是由于Web一般是采用HTTP協(xié)議進(jìn)行交互镀娶,而HTTP協(xié)議的一個最大特點(diǎn)就是基于請求-響應(yīng)模式梯码,也就是說好啰,只有當(dāng)有請求的時候框往,才能對其進(jìn)行相應(yīng),換句話說许溅,如果用戶沒有請求數(shù)據(jù)贤重,則服務(wù)器是沒有辦法將數(shù)據(jù)傳輸過去的沐飘。所以在Web中耐朴,MVC模式中的各個層次之間的交互一般都是由控制層進(jìn)行處理,控制層響應(yīng)客戶端的請求铐刘,分析請求的內(nèi)容影晓,控制模型層產(chǎn)生數(shù)據(jù),控制視圖層渲染數(shù)據(jù)疤祭,并且將渲染后的結(jié)果返回給客戶端。

在Spring MVC出現(xiàn)之前戏售,出現(xiàn)了Struts等一系列優(yōu)秀的MVC框架灌灾,不過悲柱,由于Spring MVC與Spring的無縫整合,加上Spring社區(qū)的推動嘿般,現(xiàn)在Spring MVC在Web開發(fā)中的地位越來越高博个,甚至于超越了Struts功偿,而且,從Spring MVC 3.0之后共耍,Spring MVC 提供了基于注解的處理方式痹兜,使得開發(fā)效率更加高了颤诀。

Spring MVC 小案例

動手永遠(yuǎn)都是學(xué)習(xí)編程的最佳方式,接下來通過一個小案例來學(xué)習(xí)Spring MVC遗淳。

Spring MVC的配置方式是比較簡單的屈暗,主要包括在容器中注冊Spring MVC养叛,也就是在web.xml文件中配置Spring MVC的前端控制器,主要用于在Web容器啟動時啟動Spring MVC容器弃甥,具體的配置方式如下所示

web.xml


<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
    
    <!--配置前端控制器DispatcherServlet-->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!--加載類路徑下的Spring MVC配置文件-->
            <param-value>classpath*:/spring-mvc.xml</param-value>
        </init-param>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <!--攔截對應(yīng)的請求肮之,/表示所有的請求-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <!--加載Spring的配置文件,當(dāng)容器啟動之后眶明,根據(jù)配置文件的內(nèi)容,完成Bean的創(chuàng)建等一系列的操作-->
        <param-value>classpath*:/spring-config/*.xml</param-value>
    </context-param>
    
    <listener>
        <!--監(jiān)聽Web容器的啟動丑瞧,用于在MVC容器中獲得父容器绊汹,也就是Spring容器的信息-->
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

</web-app>

spring-mvc.xml


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--掃描對應(yīng)的控制器-->
    <context:component-scan base-package="cn.xuhuanfeng.springweb.controller"/>
    <!--開啟注解驅(qū)動,簡化配置-->
    <mvc:annotation-driven/>
    <!--啟動默認(rèn)的Servlet映射器坛增,用于處理靜態(tài)資源-->
    <mvc:default-servlet-handler/>
    <!--配置視圖解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp"/>
    </bean>
    <!--文件上傳解析器,需要添加Apache common fileUpload依賴-->
    <bean name="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="4096000"/>
        <property name="maxInMemorySize" value="20000"/>
    </bean>

</beans>

如上所示届案,簡單的Spring整合Spring MVC配置文件就完成了楣颠,由于Spring MVC的默認(rèn)配置基本上滿足我們的需求童漩,所以在一般情況下不需要對其做過多的修改仓蛆。

接下來就可以開始動手編寫對應(yīng)的控制器了


// 將CommonController聲明為控制器
// 用于處理對應(yīng)的請求
@Controller
public class CommonController {

    // 配置對應(yīng)的訪問路徑
    // 當(dāng)訪問 部署路徑/hello就會到該方法中
    @RequestMapping("/hello")
    public String hello(){

        // 返回對應(yīng)的視圖名稱
        // 根據(jù)前面配置的視圖解析器可以知道,此時
        // 對應(yīng)的視圖的全路徑為 /WEB-INF/views/index.jsp
        return "index";
    }
}

創(chuàng)建對應(yīng)的視圖index.jsp如下所示


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Hello World</title>
</head>
<body>
    <h2>Hello World</h2>
</body>
</html>

當(dāng)所需要的依賴導(dǎo)入完成豆拨,將項(xiàng)目進(jìn)行部署之后施禾,返回部署路徑/hello就可以看到如下內(nèi)容了


hello訪問情況

這樣一個最簡單的Spring MVC就配置完成了。

Spring MVC常用配置

Spring MVC提供了非常豐富的注解配置邮绿,但是常用的注解并不是很多船逮,具體如下

  • @Controller主要用于將一個普通的Java類聲明為控制器挖胃,負(fù)責(zé)處理用戶的請求
  • @RequestMapping主要用于標(biāo)注對應(yīng)的請求路徑
    • 該注解可以用于標(biāo)注類和方法梆惯,如果標(biāo)注類垛吗,則該類下的所有方法的訪問均在類的路徑之下怯屉,比如上面,如果在類上面標(biāo)注@RequestMapping("/index")則Hello的訪問路徑應(yīng)該為index/hello而不再是/hello
    • RequestMapping如其名所示蝗敢,是將請求與對應(yīng)的控制方法進(jìn)行映射寿谴,那么失受,在一個Http請求中,所有內(nèi)容痪署,如請求方法狼犯,請求頭等信息悯森,也是可以進(jìn)行配置的,比如@RequestMapping( value = "/hello", method = RequestMethod.GET),具體的可以根據(jù)需要進(jìn)行配置
  • @ResponseBody,用于將方法的返回內(nèi)容標(biāo)注為數(shù)據(jù)(默認(rèn)返回的內(nèi)容會經(jīng)由視圖解析器進(jìn)行解析)祝蝠,也就是說绎狭,方法返回的內(nèi)容不會被當(dāng)成視圖進(jìn)行解析褥傍,而是當(dāng)成純粹的數(shù)據(jù)進(jìn)行處理恍风,比如在上面的方法中加上該注解,則運(yùn)行結(jié)果如下所示
    返回index
    可以看到邻耕,index直接被當(dāng)成數(shù)據(jù)返回而不是視圖名稱,這種方式可以用于返回純數(shù)據(jù)燕鸽,也就是可以將該方法直接標(biāo)注為接口啊研,返回的數(shù)據(jù)可以是JSON(只需要將對象轉(zhuǎn)為JSON格式即可)

總結(jié)

本小節(jié)主要學(xué)習(xí)了Spring MVC的基本配置以及一些常用的注解配置御滩,關(guān)于Spring MVC還有一些內(nèi)容沒有學(xué)習(xí)到,將在后面繼續(xù)學(xué)習(xí)党远。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末削解,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子沟娱,更是在濱河造成了極大的恐慌氛驮,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件济似,死亡現(xiàn)場離奇詭異矫废,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)砰蠢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門蓖扑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事灰嫉。” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我击奶,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任叫潦,我火速辦了婚禮,結(jié)果婚禮上忿危,老公的妹妹穿的比我還像新娘。我一直安慰自己赃磨,他們只是感情好腮鞍,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布迹缀。 她就那樣靜靜地躺著,像睡著了一般矢门。 火紅的嫁衣襯著肌膚如雪傅事。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天买置,我揣著相機(jī)與錄音城舞,去河邊找鬼伐弹。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的合住。 我是一名探鬼主播卿樱,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼萨蚕,長吁一口氣:“原來是場噩夢啊……” “哼岳遥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起庆猫,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后牙丽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兔魂,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡析校,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年吊奢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖魏滚,靈堂內(nèi)的尸體忽然破棺而出腥寇,到底是詐尸還是另有隱情成翩,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布赦役,位于F島的核電站麻敌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏掂摔。R本人自食惡果不足惜术羔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棒呛。 院中可真熱鬧聂示,春花似錦、人聲如沸簇秒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趋观。三九已至扛禽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間皱坛,已是汗流浹背编曼。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剩辟,地道東北人掐场。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像贩猎,于是被迫代替她去往敵國和親熊户。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理吭服,服務(wù)發(fā)現(xiàn)嚷堡,斷路器,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評論 6 342
  • spring官方文檔:http://docs.spring.io/spring/docs/current/spri...
    牛馬風(fēng)情閱讀 1,650評論 0 3
  • 這又是一個默默被誤解的詞匯艇棕。相由心生蝌戒,并不是說你的相貌由內(nèi)心決定串塑,否則韓國那幫名醫(yī)的飯碗就沒了”惫叮“相由心生”還有后...
    木作金剛閱讀 735評論 0 6
  • 我玩王者榮耀已經(jīng)有一年多桩匪,在之前主要玩的是魔獸、dota友鼻、英雄聯(lián)盟吸祟,后來發(fā)現(xiàn)王者榮耀玩起來十分的方便,才轉(zhuǎn)的過來桃移。...
    點(diǎn)點(diǎn)娛樂分享閱讀 2,022評論 0 1