高級第四天:SpringMVC第1天

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";

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市秒赤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膀懈,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谨垃,死亡現(xiàn)場離奇詭異启搂,居然都是意外死亡,警方通過查閱死者的電腦和手機刘陶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門胳赌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匙隔,你說我怎么就攤上這事疑苫。” “怎么了牡直?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纳决。 經(jīng)常有香客問我碰逸,道長,這世上最難降的妖魔是什么阔加? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任饵史,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胳喷。我一直安慰自己湃番,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布吭露。 她就那樣靜靜地躺著吠撮,像睡著了一般漏益。 火紅的嫁衣襯著肌膚如雪驻谆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天量承,我揣著相機與錄音题禀,去河邊找鬼鞋诗。 笑死,一個胖子當(dāng)著我的面吹牛迈嘹,可吹牛的內(nèi)容都是我干的削彬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼秀仲,長吁一口氣:“原來是場噩夢啊……” “哼融痛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起啄育,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤酌心,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后挑豌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體安券,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年氓英,在試婚紗的時候發(fā)現(xiàn)自己被綠了侯勉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡铝阐,死狀恐怖址貌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情徘键,我是刑警寧澤练对,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站吹害,受9級特大地震影響螟凭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜它呀,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一螺男、第九天 我趴在偏房一處隱蔽的房頂上張望棒厘。 院中可真熱鬧,春花似錦下隧、人聲如沸奢人。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽何乎。三九已至,卻和暖如春迫筑,著一層夾襖步出監(jiān)牢的瞬間宪赶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工脯燃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留搂妻,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓辕棚,卻偏偏與公主長得像欲主,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子逝嚎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355