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/
(Good)深入理解Spring MVC 思想
http://www.cnblogs.com/zhangxingBlob/p/6364728.html
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ò))
過(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配置