【整理】Spring MVC專題

1? Spring MVC概述

1.1? 概述

????Spring MVC是Spring提供的一個(gè)強(qiáng)大而靈活的web框架。借助于注解鲸阔,Spring MVC提供了幾乎是POJO的開(kāi)發(fā)模式,使得控制器的開(kāi)發(fā)和測(cè)試更加簡(jiǎn)單。這些控制器一般不直接處理請(qǐng)求,而是將其委托給Spring上下文中的其他bean蜘渣,通過(guò)Spring的依賴注入功能,這些bean被注入到控制器中肺然。

????Spring MVC主要由DispatcherServlet蔫缸、處理器映射、處理器(控制器)狰挡、視圖解析器捂龄、視圖組成释涛。他的兩個(gè)核心是兩個(gè)核心:

????處理器映射:選擇使用哪個(gè)控制器來(lái)處理請(qǐng)求

????視圖解析器:選擇結(jié)果應(yīng)該如何渲染

????通過(guò)以上兩點(diǎn),Spring MVC保證了如何選擇控制處理請(qǐng)求和如何選擇視圖展現(xiàn)輸出之間的松耦合倦沧。

1.2? SpringMVC運(yùn)行原理

(1) Http請(qǐng)求:客戶端請(qǐng)求提交到DispatcherServlet唇撬。

(2)尋找處理器:由DispatcherServlet控制器查詢一個(gè)或多個(gè)HandlerMapping,找到處理請(qǐng)求的Controller展融。

(3)調(diào)用處理器:DispatcherServlet將請(qǐng)求提交到Controller窖认。

(4)(5)調(diào)用業(yè)務(wù)處理和返回結(jié)果:Controller調(diào)用業(yè)務(wù)邏輯處理后,返回ModelAndView告希。

(6)(7)處理視圖映射并返回模型:DispatcherServlet查詢一個(gè)或多個(gè)ViewResoler視圖解析器扑浸,找到ModelAndView指定的視圖。

(8) Http響應(yīng):視圖負(fù)責(zé)將結(jié)果顯示到客戶端燕偶。

1.3? SpringMVC接口解釋

(1)DispatcherServlet接口:

????Spring提供的前端控制器喝噪,所有的請(qǐng)求都有經(jīng)過(guò)它來(lái)統(tǒng)一分發(fā)。在DispatcherServlet將請(qǐng)求分發(fā)給SpringController之前指么,需要借助于Spring提供的HandlerMapping定位到具體的Controller酝惧。

(2)HandlerMapping接口:

????能夠完成客戶請(qǐng)求到Controller映射。

(3)Controller接口:

????需要為并發(fā)用戶處理上述請(qǐng)求伯诬,因此實(shí)現(xiàn)Controller接口時(shí)晚唇,必須保證線程安全并且可重用。Controller將處理用戶請(qǐng)求盗似,這和Struts Action扮演的角色是一致的哩陕。一旦Controller處理完用戶請(qǐng)求,則返回ModelAndView對(duì)象給DispatcherServlet前端控制器赫舒,ModelAndView中包含了模型(Model)和視圖(View)悍及。

????從宏觀角度考慮,DispatcherServlet是整個(gè)Web應(yīng)用的控制器号阿;從微觀考慮并鸵,Controller是單個(gè)Http請(qǐng)求處理過(guò)程中的控制器,而ModelAndView是Http請(qǐng)求過(guò)程中返回的模型(Model)和視圖(View)扔涧。

(4)ViewResolver接口:

????Spring提供的視圖解析器(ViewResolver)在Web應(yīng)用中查找View對(duì)象,從而將相應(yīng)結(jié)果渲染給客戶届谈。

1.4? DispatcherServlet:

????是整個(gè)Spring MVC的核心枯夜。它負(fù)責(zé)接收HTTP請(qǐng)求組織協(xié)調(diào)Spring MVC的各個(gè)組成部分。其主要工作有以下三項(xiàng):

(1)截獲符合特定格式的URL請(qǐng)求艰山。

(2)初始化DispatcherServlet上下文對(duì)應(yīng)WebApplicationContext湖雹,并將其與業(yè)務(wù)層、持久化層的WebApplicationContext建立關(guān)聯(lián)曙搬。

(3)初始化Spring MVC的各個(gè)組成組件摔吏,并裝配到DispatcherServlet中鸽嫂。

1.5? SpringMVC配置

1.5.1 項(xiàng)目整體結(jié)構(gòu)

1.5.2 web.xml

(1)在web.xml文件中進(jìn)行配置,在配置中設(shè)置springmvc-context.xml的路徑征讲,代碼如下:

1.5.3 springmvc-context.xml配置bean對(duì)象

(2)配置springmvc-context.xml文件据某,這一部分主要是開(kāi)啟注解功能、配置試圖解析器诗箍,代碼如下:

1.5.4 jsp頁(yè)面

(3)配置文件完成了癣籽,下面開(kāi)始寫(xiě)代碼,

兩個(gè)jsp界面:

create.jsp


detail.jsp

1.5.5 Controller層

UserController.Java

packagecom.zjn.controller;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.ModelAttribute;

import org.springframework.web.bind.annotation.RequestMapping;

import com.zjn.entity.User;

/**

?*用戶管理

?* @authorzjn

?*/

@Controller

public class UserController{

??? @RequestMapping("")

??? publicString Create(Model model) {

??????? return "create";

??? }

??? @RequestMapping("/save")

??? public String Save(@ModelAttribute("form") User user,Model model) {

?????????// user:視圖層傳給控制層的表單對(duì)象滤祖;model:控制層返回給視圖層的對(duì)象

??????? model.addAttribute("user", user);

??????? return "detail";

??? }

}

1.5.6 數(shù)據(jù)實(shí)體層

User.java

packagecom.zjn.entity;

import java.io.Serializable;

import java.util.Date;

public class User implements Serializable{

??? /**

???? * @authorzjn

???? */

??? private static final long serialVersionUID = 1L;

??? private Integer id; // id

??? private String name; // name

??? private String pwd; // pwd

??? private Integer age; // age

??? private Date creatTime; // creatTime


??? publicInteger getId() {

??????? returnid;

??? }

??? public voidsetId(Integer id) {

??????? this.id = id;

??? }

??? publicString getName() {

??????? returnname;

??? }

??? public voidsetName(String name) {

??????? this.name = name;

??? }

??? publicString getPwd() {

??????? returnpwd;

??? }

??? public voidsetPwd(String pwd) {

??????? this.pwd = pwd;

??? }

??? publicInteger getAge() {

??????? returnage;

??? }

??? public voidsetAge(Integer age) {

??????? this.age = age;

??? }

??? publicDate getCreatTime() {

??????? returncreatTime;

??? }

??? public voidsetCreatTime(Date creatTime) {

??????? this.creatTime = creatTime;

??? }

}

1.5.7 運(yùn)行結(jié)果

初始頁(yè)面:

輸入?yún)?shù):

點(diǎn)擊創(chuàng)建:

源碼下載地址: SpringMVC項(xiàng)目源碼下載

2? 配置說(shuō)明

2.1? spring-mvc.xml配置說(shuō)明

2.1.1 節(jié)點(diǎn)說(shuō)明

1.自動(dòng)掃描

2.注解驅(qū)動(dòng)

3.靜態(tài)資源處理

4.避免IE執(zhí)行AJAX時(shí)筷狼,返回JSON出現(xiàn)下載文件

5.啟動(dòng)SpringMVC的注解功能,完成請(qǐng)求和注解POJO的映射

6.配置文件上傳

7.配置viewResolver

8.定義跳轉(zhuǎn)的文件的前后綴 匠童,視圖模式配置

9.destroy-method="close"的作用是當(dāng)數(shù)據(jù)庫(kù)連接不使用的時(shí)候,就把該連接重新放到數(shù)據(jù)池中,方便下次使用調(diào)用.

2.1.2 context:component-scan

??? 在xml配置了這個(gè)標(biāo)簽后埂材,spring可以自動(dòng)去掃描base-pack下面或者子包下面的Java文件,如果掃描到有@Component @Controller@Service等這些注解的類汤求,則把這些類注冊(cè)為bean俏险。

??? 注意:如果配置了<context:component-scan>那么<context:annotation-config/>標(biāo)簽就可以不用再xml中配置了,因?yàn)榍罢甙撕笳摺?/p>

??? 范例:

  <context:component-scan>提供兩個(gè)子標(biāo)簽:<context:include-filter>和<context:exclude-filter>各代表引入和排除的過(guò)濾首昔。而上例把use-default-filters屬性設(shè)為false寡喝,意即在base-package所有被宣告為@Component和@Configuration等target Class不予注冊(cè)為bean,由filter子標(biāo)簽代替勒奇。

  filter標(biāo)籤在Spring3有五個(gè)type预鬓,如下:

  所以上例用的regex就有個(gè)語(yǔ)病,com.foo.config.*可以找到com.foo.config.WebLogger赊颠,但也可以找到com1fool2config3abcde格二,因?yàn)樾?shù)點(diǎn)在Regex是任意字元,是故要用\.把小數(shù)點(diǎn)跳脫為佳竣蹦。(2010/3/15補(bǔ)充:但要使用\.方式顶猜,其use-default-filters不能為false,否則抓不到痘括,感覺(jué)是Bug)

  Spring3提供豐富的Filter支援长窄,有益配置策略,不需面臨ConfigurationHell纲菌,比如Regex的com\.foo\.*\.action\.*Config挠日,這樣就可以找到com.foo package下所有action子package的*Config的targetclass。

2.1.3 mvc:interceptors

????這個(gè)標(biāo)簽用于注冊(cè)一個(gè)自定義攔截器或者是WebRequestInterceptors翰舌∠保可以通過(guò)定義URL來(lái)進(jìn)行路徑請(qǐng)求攔截,可以做到較為細(xì)粒度的攔截控制椅贱。

例如在配置文件加入


2.1.4 mvc:annotation-driven

????<mvc:annotation-driven /> 是一種簡(jiǎn)寫(xiě)形式懂算,完全可以手動(dòng)配置替代這種簡(jiǎn)寫(xiě)形式只冻,簡(jiǎn)寫(xiě)形式可以讓初學(xué)都快速應(yīng)用默認(rèn)配置方案。 <mvc:annotation-driven />會(huì)自動(dòng)注冊(cè)DefaultAnnotationHandlerMapping 與 AnnotationMethodHandlerAdapter 兩個(gè)bean,是spring MVC為@Controllers分發(fā)請(qǐng)求所必須的计技。

????并提供數(shù)據(jù)綁定支持喜德,@NumberFormatannotation支持,@DateTimeFormat支持酸役,@Valid支持住诸,讀寫(xiě)XML的支持(JAXB),讀寫(xiě)JSON的支持(Jackson)涣澡。

??? DefaultAnnotationHandlerMapping是HandlerMapping的實(shí)現(xiàn)類贱呐,它會(huì)處理@RequestMapping 注解,并將其注冊(cè)到請(qǐng)求映射表中入桂。(下片文章我們會(huì)詳細(xì)介紹的)

?????AnnotationMethodHandlerAdapter是HandlerAdapter的實(shí)現(xiàn)類奄薇,它是處理請(qǐng)求的適配器,說(shuō)白了抗愁,就是確定調(diào)用哪個(gè)類的哪個(gè)方法馁蒂,并且構(gòu)造方法參數(shù),返回值蜘腌。

? ?當(dāng)我們需要controller返回一個(gè)map的json對(duì)象時(shí)沫屡,可以設(shè)定<mvc:annotation-driven />,同時(shí)設(shè)定標(biāo)簽撮珠,設(shè)定字符集和json處理類沮脖,例如:

3? 參考鏈接

Spring MVC入門指南(二):@RequestMapping用法詳解

https://my.oschina.net/kolbe/blog/509810

Spring MVC之@RequestMapping詳解

http://blog.csdn.net/kobejayandy/article/details/12690041

SpringMVC與Struts2的對(duì)比

http://blog.csdn.net/gstormspire/article/details/8239182/

【Spring】SpringMVC原理及配置詳解

(Good)深入理解Spring MVC 思想

spring-mvc.xml配置

http://www.cnblogs.com/zhangxingBlob/p/6364728.html

spring MVC配置詳解

http://www.cnblogs.com/superjt/p/3309255.html

Spring3中的mvc:interceptors標(biāo)簽配置攔截器

<mvc:annotation-driven />注解詳解

http://www.cnblogs.com/shuo1208/p/5552134.html

(Good)SpringMVC解讀——<mvc:annotation-driven/>

https://my.oschina.net/HeliosFly/blog/205343

Spring MVC解讀——<context:component-scan/>

https://my.oschina.net/HeliosFly/blog/203149

spring組件掃描使用詳解

http://blog.sina.com.cn/s/blog_57769b7b0100tt5x.html

<context:component-scan>使用說(shuō)明

http://blog.csdn.net/chunqiuwei/article/details/16115135

Dubbo與Zookeeper、SpringMVC整合和使用(負(fù)載均衡芯急、容錯(cuò))

SpringMVC中使用Interceptor攔截器

過(guò)濾器(Filter)和攔截器(Interceptor)的區(qū)別

http://www.cnblogs.com/luoyun/archive/2013/01/04/2844274.html

最新Spring 4.2.2集成Quartz Scheduler 2.2.2任務(wù)調(diào)度示例

Spring+Quartz實(shí)現(xiàn)定時(shí)任務(wù)的配置方法

https://www.oschina.net/question/8676_9032

Quartz學(xué)習(xí)——Spring和Quartz集成詳解(三)

Spring MVC通過(guò)@Value注解讀取.properties配置

https://my.oschina.net/xianan/blog/308198

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末勺届,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子娶耍,更是在濱河造成了極大的恐慌免姿,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榕酒,死亡現(xiàn)場(chǎng)離奇詭異胚膊,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)想鹰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門澜掩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人杖挣,你說(shuō)我怎么就攤上這事「斩福” “怎么了惩妇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵株汉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我歌殃,道長(zhǎng)乔妈,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任氓皱,我火速辦了婚禮路召,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘波材。我一直安慰自己股淡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布廷区。 她就那樣靜靜地躺著唯灵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪隙轻。 梳的紋絲不亂的頭發(fā)上埠帕,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音玖绿,去河邊找鬼敛瓷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛斑匪,可吹牛的內(nèi)容都是我干的呐籽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼秤标,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼绝淡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起苍姜,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤牢酵,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后衙猪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體馍乙,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年垫释,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丝格。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡棵譬,死狀恐怖显蝌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情订咸,我是刑警寧澤曼尊,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布酬诀,位于F島的核電站,受9級(jí)特大地震影響骆撇,放射性物質(zhì)發(fā)生泄漏瞒御。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一神郊、第九天 我趴在偏房一處隱蔽的房頂上張望肴裙。 院中可真熱鬧,春花似錦涌乳、人聲如沸蜻懦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)阻肩。三九已至,卻和暖如春运授,著一層夾襖步出監(jiān)牢的瞬間烤惊,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工吁朦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柒室,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓逗宜,卻偏偏與公主長(zhǎng)得像雄右,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纺讲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理擂仍,服務(wù)發(fā)現(xiàn),斷路器熬甚,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,810評(píng)論 6 342
  • Spring MVC一逢渔、什么是 Spring MVCSpring MVC 屬于 SpringFrameWork 的...
    任任任任師艷閱讀 3,381評(píng)論 0 32
  • 1.Spring web mvc介紹 Spring web mvc和Struts2都屬于表現(xiàn)層的框架,它是Spri...
    七弦桐語(yǔ)閱讀 11,516評(píng)論 2 38
  • 1、Spring MVC請(qǐng)求流程 (1)初始化:(對(duì)DispatcherServlet和ContextLoderL...
    拾壹北閱讀 1,948評(píng)論 0 12