1. 程式人生 > 實用技巧 >SpringMVC入門和常用註解

SpringMVC入門和常用註解

SpringMVC的基本概念

關於 三層架構和 和 MVC

三層架構

我們的開發架構一般都是基於兩種形式,一種是 C/S 架構,也就是客戶端/伺服器,另一種是 B/S 架構,也就
是瀏覽器伺服器。在 JavaEE 開發中,幾乎全都是基於 B/S 架構的開發。那麼在 B/S 架構中,系統標準的三層架構
包括:表現層、業務層、持久層。三層架構在我們的實際開發中使用的非常多,所以我們課程中的案例也都是基於
三層架構設計的。
三層架構中,每一層各司其職,接下來我們就說說每層都負責哪些方面:
表現層
也就是我們常說的web層。它負責接收客戶端請求,向客戶端響應結果,通常客戶端使用http協議請求
web 層,web 需要接收 http 請求,完成 http 響應。
表現層包括展示層和控制層:控制層負責接收請求,展示層負責結果的展示。
表現層依賴業務層,接收到客戶端請求一般會呼叫業務層進行業務處理,並將處理結果響應給客戶端。
表現層的設計一般都使用 MVC 模型。(MVC 是表現層的設計模型,和其他層沒有關係)
業務層


也就是我們常說的 service 層。它負責業務邏輯處理,和我們開發專案的需求息息相關。web 層依賴業
務層,但是業務層不依賴 web 層。
業務層在業務處理時可能會依賴持久層,如果要對資料持久化需要保證事務一致性。(也就是我們說的,
事務應該放到業務層來控制)

持久層
也就是我們是常說的 dao 層。負責資料持久化,包括資料層即資料庫和資料訪問層,資料庫是對資料進
行持久化的載體,資料訪問層是業務層和持久層互動的介面,業務層需要通過資料訪問層將資料持久化到資料庫
中。通俗的講,持久層就是和資料庫互動,對資料庫表進行曾刪改查的。

MVC 模型

MVC 全名是 Model View Controller,是模型(model)-檢視(view)-控制器(controller)的縮寫,
是一種用於設計建立 Web 應用程式表現層的模式。MVC 中每個部分各司其職:
Model

(模型):
通常指的就是我們的資料模型。作用一般情況下用於封裝資料。
View(檢視):
通常指的就是我們的 jsp 或者 html。作用一般就是展示資料的。
通常檢視是依據模型資料建立的。
Controller(控制器):
是應用程式中處理使用者互動的部分。作用一般就是處理程式邏輯的。
它相對於前兩個不是很好理解,這裡舉個例子:
例如:
我們要儲存一個使用者的資訊,該使用者資訊中包含了姓名,性別,年齡等等。
這時候表單輸入要求年齡必須是 1~100 之間的整數。姓名和性別不能為空。並且把資料填充
到模型之中。
此時除了 js 的校驗之外,伺服器端也應該有資料準確性的校驗,那麼校驗就是控制器的該做
的。
當校驗失敗後,由控制器負責把錯誤頁面展示給使用者。
如果校驗成功,也是控制器負責把資料填充到模型,並且呼叫業務層實現完整的業務需求。

SpringMVC 概述

 SpringMVC 是一種基於 Java 的實現 MVC 設計模型的請求驅動型別的輕量級 Web 框架,屬於 Spring 

FrameWork 的後續產品,已經融合在 Spring Web Flow 裡面。Spring 框架提供了構建 Web 應用程式的全功
能 MVC 模組。使用 Spring 可插入的 MVC 架構,從而在使用 Spring 進行 WEB 開發時,可以選擇使用 Spring
的 Spring MVC 框架或整合其他 MVC 開發框架,如 Struts1(現在一般不用),Struts2 等。
SpringMVC 已經成為目前最主流的 MVC 框架之一,並且隨著 Spring3.0 的釋出,全面超越 Struts2,成
為最優秀的 MVC 框架。
它通過一套註解,讓一個簡單的 Java 類成為處理請求的控制器,而無須實現任何介面。同時它還支援
RESTful 程式設計風格的請求。

SpringMVC 在三層架構的位置

SpringMVC 的優勢

1、清晰的角色劃分:
前端控制器(DispatcherServlet)
請求到處理器對映(HandlerMapping)
處理器介面卡(HandlerAdapter)
檢視解析器(ViewResolver)
處理器或頁面控制器(Controller)
驗證器( Validator)
命令物件(Command 請求引數繫結到的物件就叫命令物件)
表單物件(Form Object 提供給表單展示和提交到的物件就叫表單物件)。
2、分工明確,而且擴充套件點相當靈活,可以很容易擴充套件,雖然幾乎不需要。 3、由於命令物件就是一個 POJO,無需繼承框架特定 API,可以使用命令物件直接作為業務物件。 4、和 Spring 其他框架無縫整合,是其它 Web 框架所不具備的。 5、可適配,通過 HandlerAdapter 可以支援任意的類作為處理器。 6、可定製性,HandlerMapping、ViewResolver 等能夠非常簡單的定製。 7、功能強大的資料驗證、格式化、繫結機制。 8、利用 Spring 提供的 Mock 物件能夠非常簡單的進行 Web 層單元測試。 9、本地化、主題的解析的支援,使我們更容易進行國際化和主題的切換。
10、強大的 JSP 標籤庫,使 JSP 編寫更容易。
………………還有比如RESTful風格的支援、簡單的檔案上傳、約定大於配置的契約式程式設計支援、基於註解的零配
置支援等等。

SpringMVC 和 Struts2 的優略分析

共同點:
它們都是表現層框架,都是基於 MVC 模型編寫的。
它們的底層都離不開原始 ServletAPI。
它們處理請求的機制都是一個核心控制器。
區別:
Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter
Spring MVC 是基於方法設計的,而 Struts2 是基於類,Struts2 每次執行都會建立一個動作類。所
以 Spring MVC 會稍微比 Struts2 快些。
Spring MVC 使用更加簡潔,同時還支援 JSR303, 處理 ajax 的請求更方便
(JSR303 是一套 JavaBean 引數校驗的標準,它定義了很多常用的校驗註解,我們可以直接將這些注
解加在我們 JavaBean 的屬性上面,就可以在需要校驗的時候進行校驗了。)

Struts2 的 OGNL 表示式使頁面的開發效率相比 Spring MVC 更高些,但執行效率並沒有比 JSTL 提
升,尤其是 struts2 的表單標籤,遠沒有 html 執行效率高。

SpringMVC 的入門

SpringMVC的基本配置

在web.xml中配置核心控制器

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app >
<!--前端控制器的配置-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--前端控制器載入配置檔案-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!-- 啟動伺服器時建立物件 -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

配置springMVC的配置檔案

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

<!-- 開啟註解的支援 -->
    <context:component-scan base-package="com.itheim"/>
    
    <!-- 開啟SpringMVC框架註解的支援 -->
    <mvc:annotation-driven/>
</beans>

編寫控制器並使用註解配置

/**
* spring mvc 的入門案例
* @author
* @Company 
* @Version 1.0
*/
@Controller("helloController")
public class HelloController {
   @RequestMapping("/hello")
   public String sayHello() {
        System.out.println("HelloController 的 sayHello 方法執行了。。。。");
        return "success";
   }
 }

執行過程


1、伺服器啟動,應用被載入。讀取到 web.xml 中的配置建立 spring 容器並且初始化容器中的物件。
從入門案例中可以看到的是:HelloController 和 InternalResourceViewResolver,但是遠不
止這些。
2、瀏覽器傳送請求,被 DispatherServlet 捕獲,該 Servlet 並不處理請求,而是把請求轉發出去。轉發
的路徑是根據請求 URL,匹配@RequestMapping 中的內容。
3、匹配到了後,執行對應方法。該方法有一個返回值。
4、根據方法的返回值,藉助 InternalResourceViewResolver 找到對應的結果檢視。
5、渲染結果檢視,響應瀏覽器。

SpringMVC 的請求響應流程

入門案例中涉及的元件

DispatcherServlet:前端控制器

使用者請求到達前端控制器,它就相當於 mvc 模式中的 c,dispatcherServlet 是整個流程控制的中心,由
它呼叫其它元件處理使用者的請求,dispatcherServlet 的存在降低了元件之間的耦合性。

HandlerMapping:處理器對映器

HandlerMapping 負責根據使用者請求找到 Handler 即處理器,SpringMVC 提供了不同的對映器實現不同的
對映方式,例如:配置檔案方式,實現介面方式,註解方式等

Handler:處理器

它就是我們開發中要編寫的具體業務控制器。由 DispatcherServlet 把使用者請求轉發到 Handler。由
Handler 對具體的使用者請求進行處理。

HandlAdapter:處理器介面卡

通過 HandlerAdapter 對處理器進行執行,這是介面卡模式的應用,通過擴充套件介面卡可以對更多型別的處理
器進行執行。

View Resolver:檢視解析器

View Resolver 負責將處理結果生成 View 檢視,View Resolver 首先根據邏輯檢視名解析成物理檢視名
即具體的頁面地址,再生成 View 檢視物件,最後對 View 進行渲染將處理結果通過頁面展示給使用者

View:檢視

SpringMVC 框架提供了很多的 View 檢視型別的支援,包括:jstlView、freemarkerView、pdfView
等。我們最常用的檢視就是 jsp。
一般情況下需要通過頁面標籤或頁面模版技術將模型資料通過頁面展示給使用者,需要由程式設計師根據業務需求開
發具體的頁面。

mvc:annotation-driven說明

在 SpringMVC 的各個元件中,處理器對映器、處理器介面卡、檢視解析器稱為 SpringMVC 的三大元件。
使 用 mvc:annotation-driven 自動載入 RequestMappingHandlerMapping (處理對映器) 和
RequestMappingHandlerAdapter ( 處 理 適 配 器 ) , 可 用 在 SpringMVC.xml 配 置 文 件 中 使 用
mvc:annotation-driven替代註解處理器和介面卡的配置。
它就相當於在 xml 中配置了:

<!-- 上面的標籤相當於 如下配置-->
<!-- Begin -->
<!-- HandlerMapping --> <bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerM
apping"></bean> <bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- HandlerAdapter --> <bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerA
dapter"></bean> <bean
class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean> <bean
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- HadnlerExceptionResolvers --> <bean
class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExcept
ionResolver"></bean> <bean
class="org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolv
er"></bean> <bean
class="org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver"
></bean>
<!-- End -->

注意:
一般開發中,我們都需要寫上此標籤(雖然從入門案例中看,我們不寫也行,隨著課程的深入,該標籤還
有具體的使用場景)。
明確:
我們只需要編寫處理具體業務的控制器以及檢視。

RequestMapping 註解

使用說明

原始碼:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping { }
作用:
用於建立請求 URL 和處理請求方法之間的對應關係。

出現位置:
類上:
請求 URL 的第一級訪問目錄。此處不寫的話,就相當於應用的根目錄。寫的話需要以/開頭。
它出現的目的是為了使我們的 URL 可以按照模組化管理:
例如:
賬戶模組:

/account/add
/account/update
/account/delete

訂單模組:

/order/add
/order/update
/order/delete

紅色的部分就是把 RequsetMappding 寫在類上,使我們的 URL 更加精細。
方法上:
請求 URL 的第二級訪問目錄。
屬性:
value:用於指定請求的 URL。它和 path 屬性的作用是一樣的。
method:用於指定請求的方式。
params:用於指定限制請求引數的條件。它支援簡單的表示式。要求請求引數的 key 和 value 必須和
配置的一模一樣。
例如:

params = {"accountName"},表示請求引數必須有 accountName
params = {"moeny!100"},表示請求引數中 money 不能是 100。
headers:用於指定限制請求訊息頭的條件。

注意:
以上四個屬性只要出現 2 個或以上時,他們的關係是與的關係。

使用示例

控制器程式碼:
/**
* RequestMapping 註解出現的位置
* @author 
* @Company 
* @Version 1.0
*/
@Controller
@RequestMapping(value = "/user") //新增路徑字首
public class HelloConreoller {
    @RequestMapping(path = "/hello",params = "",headers = "User-Agent")
    public String sayHello(){
        System.out.println("Hello StringMVC");
        return "ok"; //去找檢視解析器
    }
}
JSP程式碼:
     <!-- 第一種訪問方式 --> <a href="${pageContext.request.contextPath}/user/hello">
    查詢賬戶
   </a>

    <a href="user/hello">註解</a>

注意:
當我們使用此種方式配置時,在 jsp 中第二種寫法時,不要在訪問 URL 前面加/,否則無法找到資源。

檢視解析器配置

<!--檢視解析器-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

請求引數的繫結

繫結的機制

我們都知道,表單中請求引數都是基於 key=value 的。
SpringMVC 繫結請求引數的過程是通過把表單提交請求引數,作為控制器中方法引數進行繫結的。
例如:
查詢賬戶
中請求引數是:
accountId=10
/**

  • 查詢賬戶
  • @return
    */
    @RequestMapping("/findAccount")
    public String findAccount(Integer accountId) {
    System.out.println("查詢了賬戶。。。。"+accountId);
    return "success"; }

支援的資料型別:

基本型別引數:
包括基本型別和 String 型別
POJO 型別引數:
包括實體類,以及關聯的實體類
陣列和集合型別引數:
包括 List 結構和 Map 結構的集合(包括陣列)
SpringMVC 繫結請求引數是自動實現的,但是要想使用,必須遵循使用要求。

使用要求:

如果是基本型別或者 String 型別:
要求我們的引數名稱必須和控制器中方法的形參名稱保持一致。(嚴格區分大小寫)
如果是 POJO(javaBean物件) 型別,或者它的關聯物件:
要求表單中引數名稱和 POJO 類的屬性名稱保持一致。並且控制器方法的引數型別是 POJO 型別。
如果是集合型別,有兩種方式:

第一種:
要求集合型別的請求引數必須在 POJO 中。在表單中請求引數名稱要和 POJO 中集合屬性名稱相同。
給 List 集合中的元素賦值,使用下標。
給 Map 集合中的元素賦值,使用鍵值對。
第二種:
接收的請求引數是 json 格式資料。需要藉助一個註解實現。
注意:
它還可以實現一些資料型別自動轉換。內建轉換器全都在:
org.springframework.core.convert.support 包下。有:
java.lang.Boolean -> java.lang.String : ObjectToStringConverter
java.lang.Character -> java.lang.Number : CharacterToNumberFactory
java.lang.Character -> java.lang.String : ObjectToStringConverter
java.lang.Enum -> java.lang.String : EnumToStringConverter
java.lang.Number -> java.lang.Character : NumberToCharacterConverter
java.lang.Number -> java.lang.Number : NumberToNumberConverterFactory
java.lang.Number -> java.lang.String : ObjectToStringConverter
java.lang.String -> java.lang.Boolean : StringToBooleanConverter
java.lang.String -> java.lang.Character : StringToCharacterConverter
java.lang.String -> java.lang.Enum : StringToEnumConverterFactory
java.lang.String -> java.lang.Number : StringToNumberConverterFactory
java.lang.String -> java.util.Locale : StringToLocaleConverter
java.lang.String -> java.util.Properties : StringToPropertiesConverter
java.lang.String -> java.util.UUID : StringToUUIDConverter
java.util.Locale -> java.lang.String : ObjectToStringConverter
java.util.Properties -> java.lang.String : PropertiesToStringConverter
java.util.UUID -> java.lang.String : ObjectToStringConverter
......
如遇特殊型別轉換要求,需要我們自己編寫自定義型別轉換器。

使用示例

基本型別和 String 型別作為引數

jsp 程式碼:
<!-- 基本型別示例 --> <a href="account/findAccount?accountId=10&accountName=zhangsan">查詢賬戶</a>
控制器程式碼:
/**
* 查詢賬戶
* @return
*/
@RequestMapping("/findAccount")
public String findAccount(Integer accountId,String accountName) {
System.out.println("查詢了賬戶。。。。"+accountId+","+accountName);
return "success"; }
執行結果:

POJO 型別作為引數

//控制器程式碼
    //Account封裝
    @RequestMapping(path = "/saveAccount",method = RequestMethod.POST)
    public String saveAccount(Account account){
        System.out.println(account);
        return "ok";
    }
  //list 和 map 集合進行封裝
    @RequestMapping(path = "/saveCollection",method = RequestMethod.POST)
    public String saveCollection(Account account){
        System.out.println(account);
        return "ok";

    }


JSP程式碼:
    <%--javaBeean物件注入--%>
<form action="user/saveAccount" method="post" >
    姓名:<input type="text" name="username">
    密碼:<input type="password" name="password">
    金額:<input type="text" name="money">
    使用者姓名:<input type="text" name="user.uname" > <%-- 在Account中注入User物件的uname和age屬性 --%>
    使用者年齡:<input type="text" name="user.age" >
    <input type="submit" value="提交">

<%-- 集合型別注入 --%>
<form action="user/saveCollection" method="post" >
    姓名:<input type="text" name="username">
    密碼:<input type="password" name="password">
    金額:<input type="text" name="money">
    使用者姓名:<input type="text" name="list[0].uname" >
    使用者年齡:<input type="text" name="list[0].age" >
    使用者名稱:<input type="text" name="map['one'].uname" >
    使用者年齡:<input type="text" name="map['one'].age " >
    <input type="submit" value="提交">

請求引數亂碼問題

配置過濾器 將encoding設定為UTF-8

<filter>
    <filter-name>characterEncodingFilter</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>
//啟動過濾器
   <init-param> 
      <param-name>forceEncoding</param-name> 
      <param-value>true</param-value> 
   </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>


在 springmvc 的配置檔案中可以配置,靜態資源不過濾:
<!-- location 表示路徑,mapping 表示檔案,**表示該目錄下的檔案以及子目錄的檔案 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/scripts/" mapping="/javascript/**"/>

get 請求方式:
tomacat 對 GET 和 POST 請求處理方式是不同的,GET 請求的編碼問題,要改 tomcat 的 server.xml
配置檔案,如下:
<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"/>
改為:
<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"
useBodyEncodingForURI="true"/>
如果遇到 ajax 請求仍然亂碼,請把:
useBodyEncodingForURI="true"改為 URIEncoding="UTF-8"
即可。

自定義型別轉換器

書寫型別轉換類 將String型別轉換為Date型別 必須繼承Converter介面

/**
 * @-author  dell
 * @since 1.1
 * @param
 */
public class StringToDateConverter implements Converter<String, Date> {
    @Override

    public Date convert(String s) {
        DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = dateFormat.parse(s);
        } catch (ParseException e) {
            throw new RuntimeException("轉換異常!!");
        }
        return date;
    }
}

在Spring xml中配置型別轉換器

<!-- 配置MVC的型別轉換器 -->
    <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters" >
            <set>
                <bean class="com.itheim.utils.StringToDateConverter"/>
            </set>
        </property>
    </bean>

在 annotation-driven 標籤中引用配置的型別轉換服務
<mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>

使用 ServletAPI 物件作為方法引數

SpringMVC 還支援使用原始 ServletAPI 物件作為控制器方法的引數。支援原始 ServletAPI 物件有:
HttpServletRequest
HttpServletResponse
HttpSession
java.security.Principal
Locale
InputStream
OutputStream
Reader
Writer
我們可以把上述物件,直接寫在控制的方法引數中使用。
部分示例程式碼:
jsp 程式碼:

測試訪問 ServletAPI

控制器中的程式碼:

/**
* 測試訪問 testServletAPI
* @return
*/
@RequestMapping("/testServletAPI")
public String testServletAPI(HttpServletRequest request,
HttpServletResponse response,
HttpSession session) {
    System.out.println(request);
    System.out.println(response);
    System.out.println(session);
    return "success"; 
}

常用註解

@RequestParam

作用:
把請求中指定名稱的引數給控制器中的形參賦值。
屬性:
value:請求引數中的名稱。
required:請求引數中是否必須提供此引數。預設值:true。表示必須提供,如果不提供將報錯。

@RequestBody

作用:
用於獲取請求體內容。直接使用得到是 key=value&key=value...結構的資料。
get 請求方式不適用。
屬性:
required:是否必須有請求體。預設值是:true。當取值為 true 時,get 請求方式會報錯。如果取值
為 false,get 請求得到是 null。

@PathVaribale

作用:
用於繫結 url 中的佔位符。例如:請求 url 中 /delete/{id},這個{id}就是 url 佔位符。
url 支援佔位符是 spring3.0 之後加入的。是 springmvc 支援 rest 風格 URL 的一個重要標誌。
屬性:
value:用於指定 url 中佔位符名稱。
required:是否必須提供佔位符。

REST 風格 URL

什麼是 rest:
REST(英文:Representational State Transfer,簡稱 REST)描述了一個架構樣式的網路系統,
比如 web 應用程式。它首次出現在 2000 年 Roy Fielding 的博士論文中,他是 HTTP 規範的主要編寫者之
一。在目前主流的三種 Web 服務互動方案中,REST 相比於 SOAP(Simple Object Access protocol,簡單
物件訪問協議)以及 XML-RPC 更加簡單明瞭,無論是對 URL 的處理還是對 Payload 的編碼,REST 都傾向於用更
加簡單輕量的方法設計和實現。值得注意的是 REST 並沒有一個明確的標準,而更像是一種設計的風格。
它本身並沒有什麼實用性,其核心價值在於如何設計出符合 REST 風格的網路介面。
restful 的優點
它結構清晰、符合標準、易於理解、擴充套件方便,所以正得到越來越多網站的採用。
restful 的特性:
資源(Resources):網路上的一個實體,或者說是網路上的一個具體資訊。
它可以是一段文字、一張圖片、一首歌曲、一種服務,總之就是一個具體的存在。可以用一個 URI(統一
資源定位符)指向它,每種資源對應一個特定的 URI 。要
獲取這個資源,訪問它的 URI 就可以,因此 URI 即為每一個資源的獨一無二的識別符。 表現層(Representation):把資源具體呈現出來的形式,叫做它的表現層 (Representation)。
比如,文字可以用 txt 格式表現,也可以用 HTML 格式、XML 格式、JSON 格式表現,甚至可以採用二
進位制格式。
狀態轉化(State Transfer):每 發出一個請求,就代表了客戶端和伺服器的一次互動過程。
HTTP 協議,是一個無狀態協議,即所有的狀態都儲存在伺服器端。因此,如果客戶端想要操作伺服器,
必須通過某種手段,讓伺服器端發生“狀態轉化”(State Transfer)。而這種轉化是建立在表現層之上的,所以
就是 “表現層狀態轉化”。具體說,就是 HTTP 協議裡面,四個表示操作方式的動詞:GET 、POST 、PUT、
DELETE。它們分別對應四種基本操作:GET 用來獲取資源,POST 用來新建資源,PUT 用來更新資源,DELETE 用來
刪除資源。
restful 的示例:
/account/1 HTTP GET : 得到 id = 1 的 account
/account/1 HTTP DELETE: 刪除 id = 1 的 account
/account/1 HTTP PUT: 更新 id = 1 的 account

RequestHeader

作用:
用於獲取請求訊息頭。
屬性:
value:提供訊息頭名稱
required:是否必須有此訊息頭
注:
在實際開發中一般不怎麼用。

CookieValue

作用:
用於把指定 cookie 名稱的值傳入控制器方法引數。
屬性:
value:指定 cookie 的名稱。
required:是否必須有此 cookie。

ModelAttribute

作用:
該註解是 SpringMVC4.3 版本以後新加入的。它可以用於修飾方法和引數。
出現在方法上,表示當前方法會在控制器的方法執行之前,先執行。它可以修飾沒有返回值的方法,也可
以修飾有具體返回值的方法。
出現在引數上,獲取指定的資料給引數賦值。
屬性:
value:用於獲取資料的 key。key 可以是 POJO 的屬性名稱,也可以是 map 結構的 key。
應用場景:
當表單提交資料不是完整的實體類資料時,保證沒有提交資料的欄位使用資料庫物件原來的資料。
例如:
我們在編輯一個使用者時,使用者有一個建立資訊欄位,該欄位的值是不允許被修改的。在提交表單數
據是肯定沒有此欄位的內容,一旦更新會把該欄位內容置為 null,此時就可以使用此註解解決問題。

SessionAttribute

作用:
用於多次執行控制器方法間的引數共享。
屬性:
value:用於指定存入的屬性名稱
type:用於指定存入的資料型別。