SpringMVC第一天
主要內(nèi)容
1.MVC架構(gòu)模式
2.SpringMVC的概念引入
3.SpringMVC框架搭建
4.SpringMVC框架完善
5.SrpingMVC參數(shù)注入
6.SpringMVC中常見注解
一.MVC結(jié)構(gòu)模式
1.MVC是一種架構(gòu)模式
? ? 1.1.M:Model
? ? ? ? 模型層:負責(zé)跟數(shù)據(jù)庫進行交互的操作.pojo,service,dao(mapper)
? ? 1.2V:View
? ? ? ? 視圖層:進行數(shù)據(jù)的表現(xiàn).負責(zé)跟客戶進行交互.jsp,html,css,js,...
? ? 1.3C:Controller
? ? ? ? 控制器:橋梁,負責(zé)M和V之間的交互
2.MVC發(fā)展階段
2.1jsp模型階段
? ? 在早期JavaWeb的開發(fā)中,統(tǒng)一把顯示層,控制層,數(shù)據(jù)層的操作全部交給JSP或者JavaBean來進行處理,我們稱之為Model1:
2.2Mdel2
jsp+Servlet.jsp負責(zé)頁面顯示,servlet負責(zé)控制.MVC,會出現(xiàn)很多重復(fù)性的工作(Servlet層):參數(shù)接收,作用域傳參,頁面跳轉(zhuǎn)
2.3MVC框架
為解決持久層中一直為處理好的數(shù)據(jù)庫事務(wù)的編程,又為了迎合NoSQL的強勢崛起,SpringMVC給出了方案,更加靈活,更加簡單的完成上述操作.常見的MVC框架:SpringMVC,Struts2,JFinal(中國人寫的)
二.SpringMVC引入
1.遇到的問題
? ? 在學(xué)習(xí)了Spring之后,基于MVC設(shè)計模式的項目,我們可以使用Mybatis將數(shù)據(jù)庫替換,使用Spring將Controller層和Service層,以及Service層和數(shù)據(jù)層之間進行解耦.但是基于MVC的模式中,在Controller層中的Servlet為請求的代碼入口.tomcat服務(wù)器在接受到請求后,會根據(jù)請求地址自定調(diào)用對應(yīng)的servlet的service方法完成請求處理,但是此流程存在如下問題:
? ? a.每個功能都要聲明對應(yīng)的Servlet,麻煩
? ? b.在Servlet中獲取請求數(shù)據(jù)比較麻煩
? ? c.響應(yīng)的方式的代碼其實只想聲明對應(yīng)的響應(yīng)數(shù)據(jù)
2.處理方案
? ? 項目只聲明了Servlet,該Servlet作為項目請求的公共入口.并且在該Servlet必須聲明代碼,此代碼根據(jù)請求地址調(diào)用對應(yīng)的邏輯代碼處理請求.如果將邏輯方法全部聲明在Servlet中造成代碼的體系結(jié)構(gòu)不清晰,將邏輯方法單獨聲明到邏輯類中(Controller類).然后Servlet中根據(jù)請求動態(tài)的調(diào)用對應(yīng)的邏輯類中的邏輯方法處理請求即可
? ? a.如何在Servlet中獲取邏輯類對象呢?
? ? ? ? 使用Spring容器的子容器,在子容器中存儲所有的Controller的實例化對象,然后Servlet一次性從子容器中獲取所有的對象即可.在init方法中實現(xiàn)即可
????b.如何在Servlet中根據(jù)請求動態(tài)調(diào)用對象的邏輯方法呢
? ? 使用反射+注解(BaseServlet)
? ? c.如何處理接受參數(shù),提升效率呢?
3.SpringMVC的概念
? ? SpringMVC是一種基于java實現(xiàn)MVC設(shè)計模型的請求驅(qū)動類型的輕量級W餓b框架,屬于SpringFramework的后續(xù)產(chǎn)品,已經(jīng)融合在SpringWebFlow里面.Spring框架提供了構(gòu)建Web應(yīng)用程序的全功能MVC模塊.使用Spring可插入的MVC架構(gòu),從而在使用Spring進行WEB開發(fā)時,可以選擇使用Spring的SpringMVC框架或集成其他MVC開發(fā)框架,如Struts1(現(xiàn)在一般不用),Struts2等.SpringMVC已經(jīng)成為目前最主流的MVC框架之一,并且隨著Spring3.0的發(fā)布,全面超越Struts2,成為最優(yōu)秀的MVC框架.它通過一套注解,讓一個簡單的java類成為處理請求的控制器,而無需事先任何接口.同時它還支持RESTful編程風(fēng)格的請求
? ? 本質(zhì):SpringMVC就是將Servlet進行了封裝,提供一個公共的Servlet.該Servlet可以根據(jù)請求動態(tài)的調(diào)用對應(yīng)的邏輯方法完成請求處理
4.SpringMVC的優(yōu)點
(1)清晰的角色劃分:
? ? 前端控制器(DispatcherServlet)
? ? 請求到處理器映射(HandlerMapping)
? ? 處理器適配器(HandlerAdapter)
? ? 視圖解析器(ViewResolver)
? ? 處理器或頁面控制器(Controller)
? ? 驗證器(Validator)
? ? 命令對象(Command請求參數(shù)綁定到的對象就叫命令對象)
????表單對象(Form Object提供黑表單展示和提交到的對象就叫表單對象)
? ? 2.分工明確,而且擴展點相當(dāng)靈活,可以很容易擴展,雖然幾乎不需要
? ? 3.由于命令對象就是一個POJO,無需繼承框架特定API,可以使用命令對象直接作為業(yè)務(wù)對象
? ? 4.和Spring其他框架無縫集成,是其他Web框架不具備的
? ? 5.功能強大的數(shù)據(jù)驗證,格式化,綁定機制
? ? 6.利用Spring提供Mock對象能夠非常簡單的進行Web層單元測試
? ? 7.本地化,主題的解析的支持,使我們更容易進行國際化和主題的切換
? ? 8.強大的JSP標(biāo)簽庫,使JSP編寫更容易
????......還有比如RESTful風(fēng)格的支持,簡單的文件上傳,約定大于配置的契約式編程支持,基于注解的零配置支持等等
5.理解示意圖
6.springmvc和struts2區(qū)別
共同點:
1.它們都是表現(xiàn)層框架,都是基于MVC模型編寫的
2.它們的底層都離不開原始Servlet
3.它們處理請求的機制都是一個核心控制器
區(qū)別:
1.springMVC入口是servlet,而Sturts2是Filter;
2.springMVC是基于方法設(shè)計的,而Sturts2是基于類,Struts2每次執(zhí)行都會創(chuàng)建一個動作類.所以springMVC會稍微比Struts2快些
3.springMVC使用更加簡潔,同時還支持JSP303,處理ajax的請求更加方便(JSP303是一套JavaBean參數(shù)校驗的標(biāo)準(zhǔn),它定義了很多常用的校驗注解,我們可以直接將這些注解加在我們JavaBean的屬性上面,就可以在需要校驗的時候進行校驗了)
4.Struts2的OGNL表達式使頁面的開發(fā)效率相比springMVC更高些,但執(zhí)行效率并沒有比JSTL提升,尤其是Struts2的表單標(biāo)簽,遠沒有html執(zhí)行效率高
三.SpringMVC的框架搭建
1.創(chuàng)建web項目并導(dǎo)入SpringMVC的jar
2.在src下創(chuàng)建MVC的包結(jié)構(gòu)
3.在Controller包下創(chuàng)建控制器類并聲明單元方法
4.在src下創(chuàng)建并配置springmvc.xml文件
5.配置web\.xml文件,配置SpringMVC的Servlet
6.瀏覽器效果
7.執(zhí)行流程圖
四.SpringMVC框架的完善及詳解
1.手動指定SpringMVC的位置
<init-param>
? ? <param-name>contextConfigLocation</param-name>
? ? <param-value>classpath:springmvc.xml</param-value>
</init-param>
2.靜態(tài)資源放行
2.1在web.xml中更改攔截路徑
<servlet-mapping>
? ? <servlet-name>mvc</servlet-name>
? ? <url-pattern>*.Action</url-pattern>
</servlet-mapping>
2.2SpringMVC提供的靜態(tài)資源放行標(biāo)簽
<!--靜態(tài)資源放行mapping:指的是網(wǎng)絡(luò)中URL地址location:放行本地的位置的資源-->
<mvc:resource mapping="/imgs/**" location="/imgs/"></mvc:resources>
3.SpringMVC執(zhí)行流程詳解
3.1DispatcherServlet:前端控制器
用戶請求到達前端控制器,它就相當(dāng)于mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它調(diào)用其他組件處理用戶的請求,dispatcherServlet的存在降低了組件之間的耦合性
3.2HandlerMapping:處理器映射器
HandlerMapping:負責(zé)根據(jù)用戶請求找到Handler即處理器,SpringMVC提供了不同的映射器實現(xiàn)不同的映射方式,例如:配置文件方式,注解方式等
3.3Handler:處理器
它就是我們開發(fā)中要編寫的具體業(yè)務(wù)控制器.由DispatcherServlet把用戶請求轉(zhuǎn)發(fā)到Handler.由Handler對具體的用戶請求進行處理
3.4HandlerAdapter;處理器適配器
通過HandlerAdapter對處理器進行執(zhí)行,這是適配器模式的應(yīng)用,通過擴展適配器可以對更多類型的處理器進行執(zhí)行
3.5View Resolver:視圖解析器
View Resolver負責(zé)將處理結(jié)果生成View視圖,View Resolver首先根據(jù)邏輯視圖名解析成物理視圖名,及具體的頁面地址,再生成View視圖對象,最后對View進行渲染將處理結(jié)果通過頁面展示給用戶
3.6View:視圖
SpringMVC框架提供了很多的View視圖類型的支持,包括:jstlView,freemarkerView,pdfView等.我們最常用的視圖就是jsp.一般情況下需要通過頁面標(biāo)簽或頁面模板技術(shù)將模型數(shù)據(jù)通過頁面展示給用戶,需要由程序員根據(jù)業(yè)務(wù)需求開發(fā)具體的頁面
3.7<mvc:annotation-driven>說明
在SpringMVC的各個組件中,處理器映射器,處理器適配器,視圖解析器稱為SpringMVC的三大組件
使用<mvc:annotation-driven>自動加載RequestMappingHandlerMapping(處理映射器)和RequestMappingHandlerAdapter(處理適配器),可用在SpringMVC.xml配置文件中使用<mvc:annotation-driven>替代注解處理器和適配器的配置
3.8流程理解示意圖
五.SpringMVC中參數(shù)注入
1.servlet中如何接受參數(shù)
? ? a.接受方式request.getParameter(name)
? ? b.getParameter方法用于獲取單個值,返回類型是String
? ? c.冗余代碼較多,使用麻煩,類型需要自己轉(zhuǎn)換
2.使用SpringMVC進行參數(shù)接收
? ? a.簡化參數(shù)接收形式(不需要調(diào)用任何方法,需要什么參數(shù),就在控制器方法中提供什么參數(shù))
? ? b.參數(shù)類型不需要自己轉(zhuǎn)換了.日期時間得注意,需要使用@DateTimeFormat注解聲明日期轉(zhuǎn)換時遵循的格式,否則拋出400異常
? ? c.還可以自動將參數(shù)封裝為對象
3.SpringMVC接受參數(shù)實現(xiàn)方式
3.1緊耦方式
DispatcherServlet中的service方法直接將此次請求的request對象傳遞給調(diào)用的單元方法即可.同時在單元方法上聲明形參HttpServletRequest來接收request實參即可
3.2解耦方式
DispatcherServlet在其service方法中將請求數(shù)據(jù)根據(jù)需求從request對象中獲取出來后,將數(shù)據(jù)直接傳遞給對應(yīng)的單元方法使用.同時在單元方法上直接聲明對應(yīng)的形參接受請求數(shù)據(jù)即可
4.緊耦方式(request)在單元方法中獲取請求數(shù)據(jù)
4.1在控制器類中聲明請求處理單元方法
在單元方法上聲明形參,形參類型為HttpServletRequest,接收DispatcherServlet傳遞的封裝了此次請求的請求數(shù)據(jù)的request對象
4.2在單元方法中使用request.getParameter("鍵名")獲取請求數(shù)據(jù)
5.解耦方式獲取請求數(shù)據(jù)
5.1形參屬性名即為請求數(shù)據(jù)的鍵名
問題:
? ? 讓DispatcherServlet將請求數(shù)據(jù)獲取后傳遞給單元方法,但是請求數(shù)據(jù)的獲取需要數(shù)據(jù)的鍵,名,而DispatcherServlet不是我們自己聲明的無法修改其底層代碼,怎么將請求數(shù)據(jù)的鍵名告訴給DispatcherServlet呢?
解決:
? ? 在單元方法上聲明形參來接收請求數(shù)據(jù)時,形參名必須和請求數(shù)據(jù)的鍵名一致,DispatcherServlet會將調(diào)用單元方法的形參名作為請求數(shù)據(jù)的鍵名獲取請求數(shù)據(jù),然后傳遞給單元方法
實現(xiàn):
5.2獲取同鍵不同值的請求數(shù)據(jù)
問題:
? ? 目前我們在單元方法上可以使用形參或者實體類來接收請求數(shù)據(jù),但是有某些請求中,請求數(shù)據(jù)是同鍵不同值的.比如,在頁面中的多項選擇的請求數(shù)據(jù),愛好,fav=1&fav=2&fav=3像這樣的請求數(shù)據(jù),如何獲取呢?
解決:
? ? 我們自己使用Request對象獲取同鍵不同值的數(shù)據(jù),使req.ParameterValues("鍵名"),返回值是String[] 數(shù)組.在單元方法上聲明形參,類型為String[]數(shù)組類型,要求形參名和請求數(shù)據(jù)的鍵名一致即可
實現(xiàn):
解耦合方式獲取同鍵不同值的數(shù)據(jù)
使用Spring類型的數(shù)組來接收,形參名為請求數(shù)據(jù)的鍵名
@RequestMapping("argKeyNotValue")
public String demoArgKeyNotValue(String uname,Integer age,String[] fav){
? ? //處理請求數(shù)據(jù)
? ? System.out.println("MyController.demoArgKeyNotValue:獲取同鍵不同值的請求數(shù)據(jù):"+uname+":"+age+":"+fav[0]);
? ? //響應(yīng)結(jié)果
? ? return "aa";
}
5.3使用實體類對象獲取請求數(shù)據(jù)
問題:
? ? 在學(xué)習(xí)了使用SpringMVC后,我們可以在單元方法上聲明形參直接獲取請求數(shù)據(jù)只要形參名和請求數(shù)據(jù)的鍵名一致即可.但是如果我們的請求數(shù)據(jù)過多,總不能咱們聲明N個形參來接收請求數(shù)據(jù)吧?而且按照我們以往的開發(fā)經(jīng)驗,請求數(shù)據(jù)過多我們會將請求封裝到實體類對象中進行使用,保證數(shù)據(jù)的完整性.那么,在SpringMVC中一旦請求數(shù)據(jù)過多,如何在單元方法上獲取請求數(shù)據(jù)呢?
解決:
? ? 我們希望在單元方法中直接獲取一個封裝好請求數(shù)據(jù)的實體類對象使用.也就說我們希望DispatcherServlet可以將請求數(shù)據(jù)封裝到實體類對象中,然后將實體類對象作為實參傳遞給單元方法使用.在單元方法上聲明對應(yīng)的實體類的形參類型,來接收DispatcherServlet傳遞的封裝了請求數(shù)據(jù)的實體類對象,以及告訴DispatcherServlet使用哪個實體類來封裝請求數(shù)據(jù).而且,要求實體類的屬性名必須和請求數(shù)據(jù)的鍵名一致,DispatcherServlet會按照該方式將請求數(shù)據(jù)賦值黑實體類的屬性
實現(xiàn):
//解耦方式使用實體類對象接受請求
要求
實體類的屬性和請求數(shù)據(jù)的鍵名一致,必須提供get/set方法
注意:
實體類的屬性類型使用包裝類,避免請求中沒有對應(yīng)的數(shù)據(jù)時出現(xiàn)類型轉(zhuǎn)換異常
@RequestMapping("argObject")
public String demoArgObject(User user){
? ? //處理請求
? ? System.out.println("MyController.demoArgObject:請求數(shù)據(jù)使用實體類型對象接收:"+user);
? ? //響應(yīng)結(jié)果
? ? return "aa";
}
5.4POJ類型作為參數(shù)
問題:
如果我們接收過來的數(shù)據(jù)需要保存到實體中的另外一個依賴POJO類中,我們需要如何處理呢
解決:
? ? 我們可以通過更改提交表單中的name屬性來操作,name的屬性是pojo.屬性名的方式接收,這樣接收的數(shù)據(jù)就會保存到對應(yīng)的屬性中
實現(xiàn):
jsp代碼:
<form action="account/saveAccount" method="post">
? ? 賬戶名稱:<input type="text" name="name"><br/>
? ? 賬戶金額:<input type="text" name="money"><br/>
? ? 賬戶省份:<input type="text" name="address.proviceName"><br/>
? ? 賬戶城市:<input type="text" name="address.cityName"><br/>
? ? <input type="submit" value="保存">
</form>
控制器代碼:
@RequestMapping("/saveAccount")
public String saveAcccount(Account account){
? ? System.out.println("金額:"+account);
? ? return "sxt";
}
5.5POJO類中包含集合類型的參數(shù)
問題:
? ? 如果我們接收過來的數(shù)據(jù)需要保存到實體中包含的集合(比如List,Map集合),這種情況下我們需要如何處理呢?
解決:
? ? 我們可以改變表單中提交的name屬性方式來進行操作,指定表單合適的name屬性,后臺的對象通過name屬性來進行值的接受即可,如果是保存到List集合,書寫方式accounts[下標(biāo)].name,如果是Map集合,接受方式如下:accountMap['one'].money
實現(xiàn):
jsp代碼:
<form action="" method="post">
? ? 用戶名稱:<input type="text" name="username"><br/>
? ? 用戶密碼:<input type="password" name="password"><br/>
? ? 用戶年齡:<input type="text" name="age"><br/>
? ? 賬戶1名稱:<input type="text" name="accounts[0].name"><br/>
? ? 賬戶2金額:<input type="text" name="accounts[1].money"><br/>
? ? 賬戶3名稱:<input type="text" name="accountMap['one'].name"><br/>
? ? 賬戶4金額:<input type="text" name="accountMap['two'].money"><br/>
? ? <input type="submit" value="保存">
</form>
控制器代碼:
@RequestMapping("/updateAccount")
? ? public String updateAccount(User user){
? ? ? ? System.out.println("用戶數(shù)據(jù).."+users);
? ? ? ? return "success";
????}
5.6特殊日期類型數(shù)據(jù)接受
問題:
我們之前接受數(shù)據(jù)格式都是基本的數(shù)據(jù)類型,如果我們進行Date類型數(shù)據(jù)的接受處理,應(yīng)該如何進行呢?如果我們接收的日期的格式類型沒有進行統(tǒng)一的指定,又該如何處理
解決:
我們對于日期格式的處理有兩種方法:
第一種就是使用SpringMVC提供的對日期進行格式化的注解標(biāo)簽@DateTimeFormat比較簡單
第二種即使自定義類型轉(zhuǎn)換器,比較的麻煩但是不僅僅對Date類型可以處理,對于其他類型的數(shù)據(jù)可以處理
實現(xiàn):
方式一:注解方式
@RequestMapping("demo4")
public String demo4(@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")Date birth){
? ? System.out.println(birth+"--"+hobby[0]);
? ? return "/success.jsp";
}
方式二:自定義類型轉(zhuǎn)換器
第一步:定義一個類,實現(xiàn)Converter接口,該接口有兩個泛型
public class StringToDateC implements Converter<String,Date>{
? ? @Override
? ? public Date convert(String source){
? ? ? ? DateFormat format = null;
? ? ? ? try{
? ? ? ? ? ? if(StringUtils.isEmpty(source)){
? ? ? ? ? ? ? ? throw new NullPointerException("日期輸入錯誤");
????????????}
????????????????format=newSimpleDateFormat("yyyy-MM-dd");
? ? ? ? ? ? ? ? Date date = format.parse(source);
? ? ? ? ? ? ? ? return date;
????????}catch(Exception e){
? ? ? ? ? ? throw new RuntimeException("輸入日期有誤");
????????}
????}
}
第二步:在spring配置文件中配置類型轉(zhuǎn)換器
<!--配置類型轉(zhuǎn)換工廠-->
<bean id="converterService" class="org.springframework.context.ConversionServiceFactoryBean">
? ? <!--給工廠注入一個新的類型轉(zhuǎn)換器-->
? ? <property name="converters">
? ? ? ? <array>
? ? ? ? ? ? <!--配置自定義類型轉(zhuǎn)換器-->
? ? ? ? ? ? <bean class="com.sxt.controller.converter.StringToDateConverter"></bean>
????????</array>
????</property>
</bean>
第三步:在annotation-driven標(biāo)簽中引用配置的類型轉(zhuǎn)換服務(wù)
<!--引用自定義類型轉(zhuǎn)換器-->
<mvc:annotation-driven conversion-service="converterService"></mvc:annotation-driven>
6.字符編碼過濾器
問題:
我們使用SpringMVC對于參數(shù)進行接收的時候,非常的方便,但是,現(xiàn)在對于接受數(shù)據(jù)的中文亂碼我們應(yīng)該如何的處理呢?
解決:
a.Get方式
在server.xml中指定對應(yīng)的服務(wù)器編碼
URIEncoding="utf-8"
b.POST方式
在過濾器中增加request.setCharacterEncoding("utf-8");
實現(xiàn):
a.GET方式:
b.POST方式
<!--Spring中提供的字符串編碼過濾器-->
<filter>
? ? <filter-name>encFilter</filter-name>
? ? <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
? ? <init-param>
? ? ? ? <param-name>encoding</param-name>
? ? ? ? <param-value>utf-8</param-value>
????</init-param>
</filter>
<filter-mapping>
? ? <filter-name>encFilter</filter-name>
? ? <url-pattern>/*</url-parrent>
</filter-mapping>
六.SpringMVC中常見注解
1.@RequestMapping
作用:
用于建立請求URL和處理請求方法之間的對應(yīng)關(guān)系
出現(xiàn)位置:
類上:請求URL的第一級訪問目錄.此處不寫的話,就相當(dāng)于應(yīng)用的根目錄.寫的話需要以/開頭,它出現(xiàn)的目的是為了使我們的URL可以按照模塊化管理
方法上:請求URL的第二級訪問目錄
屬性:
value:用于指定請求的URL.它和path屬性的作用是一樣的
method:用于指定請求的方式
params:用于指定限制請求參數(shù)的條件.它支持簡單的表達式.要求請求參數(shù)的key和value必須和配置的一模一樣
例如:params={"accountName"},表示請求參數(shù)必須有accountName
Headers:用于指定限制請求消息頭的條件
實現(xiàn):
@RequestMapping("/account")
public class AccountController{
? ? @RequestMapping(value="/saveAccount",method=RequestMethod.POST)
? ? public String sveAccount(){
? ? ? ? System.out.println("保存了賬戶");
? ? ? ? return "success";
????}
}
2.@RequestParam
作用:
把請求中指定名稱的參數(shù)給控制器中的形參賦值
屬性:
value:請求參數(shù)中的名稱
required:請求參數(shù)中是否必須提供此參數(shù).默認值:true.表示必須提供,如果不提供將報錯
實現(xiàn):
@RequestMapping("/RequestParam")
public String useRequestParam(@RequestParam("name")String uname,
@RequestParam(value="age",required=false)Integer age){
? ? System.out.println(username+","+age);
? ? return "sxt";
}
3.@RequestBody
作用:
用于獲取請求體內(nèi)容.直接使用的是key=value&key=value..結(jié)構(gòu)的數(shù)據(jù),get請求方式不適用
屬性:
required:是否必須有請求體.默認值是:true.當(dāng)取值為true時,get請求方式會報錯.如果取值為false,get請求得到是null
實現(xiàn):
@RequestMapping("/useRequestBody")
public String useRequestBody(@RequestBody(required=false)String body){
? ? System.out.println(body);
? ? return "sxt";
}
4.@PathVariable
Restful的簡介:
? ? REST(Representation State Transfer,簡稱REST)restful是一種軟件架構(gòu)風(fēng)格,設(shè)計風(fēng)格,而不是標(biāo)準(zhǔn).只是提供了一組設(shè)計原則和約束條件.它主要用于客戶端和服務(wù)器交互類的軟件.基于這個風(fēng)格設(shè)計的軟件可以更簡潔,更有層次,更易于實現(xiàn)緩存等機制
?restful的優(yōu)點
它結(jié)構(gòu)清晰,符合標(biāo)準(zhǔn),易于理解,擴展方便,所以正得到越來越多網(wǎng)站的采用
作用:
用于綁定url中的占位符.例如:請求url中/delete/{id},這個{id}就是url占位符.url支持占位符是spring3.0之后加入的/是springmvc支持rest風(fēng)格URL的一個重要標(biāo)志
屬性:
value:用于指定url中占位符名稱
required:是否必須提供占位符
實現(xiàn):
/**
SpringMVC處理restful格式請求
1.
在@RequestMapping注解中可以使用{字母}來聲明單元方法的攔截范圍
比如:
@RequestMapping("aa/{uname}/{age}")
表示請求地址要請求的單元方法以aa開頭,后面為兩位任意
2.
我們可以在單元方法的形參聲明上使用注解@PathVariable來告訴DispatcherServlet將請求地址中的數(shù)據(jù)截取后作為實參傳遞給單元方法使用,默認按照地址占位中的參數(shù)名和形參名一致的規(guī)則賦值.如果不一致可以在@PathVariable中指明賦值@PathVariable("un")
3.
注意:
說白了SpringMVC的restful格式的支持就是單元方法模糊攔截+注解聲明來實現(xiàn)
*/
@RequestMapping("aa/{un}/{age}")
public String demoRestful(@PathVariable("uu") String uname,@PathVariable Integer age){
? ? //處理請求
? ? System.out.println("MyController.demoRestful:SpringMVC處理restful格式請求:"+uname+":"+age);
? ? //響應(yīng)結(jié)果
? ? return "aa";
}
5.@RequestHeader
作用:
用于獲取請求消息頭
屬性:
value:提供消息頭名稱
required:是否必須有此消息頭
實現(xiàn)
@RequestMapping("/useRequestHeader")
public String useRequestHeader(@RequestHeader(value="Accept",required=false)String requestHeader){
? ? System.out.println(requestHeader);
? ? return "sxt";
}
6.@CookieValue
作用:
用于把指定cookie名稱的值傳入控制器方法參數(shù)
屬性:
value:指定cookie的名稱
required:是否必須有此cookie
實現(xiàn)
@RequestMapping("/CookieValue")
punlic String CookieValue(@CookieValue(value="JSESSIONID",required=false)String cookieValue){
? ? System.out.println(cookieValue);
? ? return "sxt";
}