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的支援;