1. 程式人生 > >SpringMVC框架筆記整理(二): 註解式控制器-URL路徑對映

SpringMVC框架筆記整理(二): 註解式控制器-URL路徑對映

註解式控制器

通過@Controller@RequestMapping註解定義我們的處理器類

spring2.5需要通過處理器對映DefaultAnnotationHandlerMapping和處理器介面卡
AnnotationMethodHandlerAdapter
來開啟支援@Controller 和@RequestMapping註解的處理器。

<!-- Spring3.1之前的註解 HandlerMapping --> 
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"
/>
<!-- Spring3.1之前的註解 HandlerAdapter --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

Spring3.1使用新的@Contoller和@RequestMapping註解支援類:
處理器對映RequestMappingHandlerMapping
和處理器介面卡RequestMappingHandlerAdapter

<!-- Spring3.1開始的註解HandlerMapping -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> <!-- Spring3.1開始的註解 HandlerAdapter --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

Spring2.5+ 通過註解式處理器支援,通過@Controller@RequestMapping

註解定義處理器類。

  • @Controller
    負責註冊一個bean 到spring 上下文中, 用於標識是處理器類;

  • @RequestMapping
    註解為控制器指定可以處理哪些 URL 請求

  • @RequestParam
    在處理方法入參處使用 @RequestParam 可以把請求參 數傳遞給請求方法

  • @ModelAttribute
    Spring MVC 在呼叫目標處理方法前,會先逐個呼叫在方法級上標註了- @ModelAttribute 的方法,可以從隱含物件中獲取隱含的模型資料中獲取物件,再將請求引數 –繫結到物件中,再傳入入參將方法入參物件新增到模型中

  • @InitBinder
    自定義資料繫結註冊支援,用於將請求引數轉換到命令物件屬性的對應型別

RestFul架構風格註解

  • @RequestBody
    該註解用於讀取Request請求的body部分資料,使用系統預設配置的
    HttpMessageConverter進行解析,
    然後把相應的資料繫結到要返回的物件上 ,再把HttpMessageConverter返回的物件資料繫結到 controller中方法的引數上

  • @ResponseBody
    該註解用於將Controller的方法返回的物件,通過適當的HttpMessageConverter轉換為指定格式後,寫入到Response物件的body資料區

  • @PathVariable
    繫結 URL 佔位符到入參, 請求URI中的模板變數部分到處理器功能處理方法的方法引數上的繫結

  • @ExceptionHandler
    註解到方法上,出現異常時會執行該方法

  • @ControllerAdvice
    使一個Contoller成為全域性的異常處理類,類中用@ExceptionHandler方法註解的方法可以處理所有Controller發生的異常

<!-- 自動註冊基於註解風格的處理器需要的DefaultAnnotationHandlerMapping ,AnnotationMethodHandlerAdapter -->
<mvc:annotation-driven>

<!-- 註冊自定義的處理器攔截器;SpringMVC沒有總的攔截器,不能對所有的請求進行前後攔截 -->
<mvc:interceptors>

<mvc:interceptors>
<!-- <!-- 會為每一個HandlerMapping,注入一個攔截器 --> 
    <bean class="com.cpsh.inteceptor.mvc.MyInteceptor01" />
    <!-- 自定義匹配url的攔截器 -->
    <mvc:interceptor>
        <mvc:mapping path="/hello/*" />
        <bean class="com.cpsh.inteceptor.mvc.MyInteceptor02"/>
    </mvc:interceptor>
</mvc:interceptors>


<!-- 邏輯靜態資源路徑到物理靜態資源路徑的支;-->
<mvc:resources>

<mvc:resources mapping="/res/images/**" location="/common/images/" cache-period="31556926" />

DispatcherServlet的預設配置在DispatcherServlet.properties(和DispatcherServlet類在一個包下)中,而且是當Spring配置檔案中沒有指定配置時使用的預設策略

這裡寫圖片描述

一個POJO類上放置@Controller或@RequestMapping,即可把一個POJO類變身為處理器; @RequestMapping(value = “/hello”) 請求URL(/hello) 到 處理器的功能處理方法的對映;

/**
    url = "${contextPath}/user/hello2"
*/
package cn.javass.chapter6.web.controller;
@Controller
@RequestMapping(value="/user") //①處理器的通用對映字首
public class HelloWorldController2 {
    @RequestMapping(value = "/hello2") //②相對於①處的對映進行窄化
    public ModelAndView helloWorld() {
    //省略實現
    }
}

請求對映可以認為是方法級別的@RequestMapping繼承類級別的@RequestMapping。

URL路徑對映

普通URL路徑對映

@RequestMapping(value={“/test1”, “/user/create”}):多個URL路徑可以對映到同一個處理器的功能處理方法,組合使用是或的關係,即“/test1”或“/user/create”請求URL路徑都可以對映到@RequestMapping指定的功能處理方法。

URI模板模式對映

@RequestMapping(value=”/users/{userId}”):{×××}佔位符, 請求的URL可以是 “/users/123456”, 通過@PathVariable可以提取URI模板模式中的{×××}中的×××變數。

@RequestMapping(value=”/users/{userId}/topics/{topicId}”)

@RequestMapping(value=”/products/{categoryCode:\d+}-{pageNumber:\d+}”):可以匹配“/products/123-1, 通過@PathVariable提取模式中的{×××:正則表示式匹配的值}中的×××變數

正則表示式風格的URL路徑對映是一種特殊的URI模板模式對映:

URI模板模式對映是{userId},不能指定模板變數的資料型別,如是數字還是字串;

正則表示式風格的URL路徑對映,可以指定模板變數的資料型別,可以將規則寫的相當複雜

請求方法對映限定

@RequestMapping(value=”/methodOr”, method = {RequestMethod.POST, RequestMethod.GET}):即請求方法可以是 GET POST。

DispatcherServlet預設開啟對 GET、POST、PUT、DELETE、HEAD的支援;