Spring從2.5開始引入注解,可以在Spring MVC中使用@Controller、@RequestMapping、@RequestParam、@ModelAttribute等類似的注解
@Controller注解
org.springframework.stereotype.Controller
注解用于訓示Spring類的執行個體是一個控制器,使用@Controller 注解的類不需要繼承特定的父類或者實作特定的接口,相對之前的版本實作Controller 接口變得更加簡單。而且 Controller 接口的實作類隻能處理一個單一請求動作,而@Controller注解的控制器可以支援同時處理多個請求動作,更加靈活。
@Controller用于标記一個類,使用它标記的類就是一個Spring MVC Controller對象,即一個控制器類。Spring使用掃描機制查找應用程式中所有基于注解的控制器類。分發處理器會掃描使用了該注解的類的方法,并檢測該方法是否使用了@RequestMapping 注解,而使用@RequestMapping注解的方法才是真正處理請求的處理器。為了保證Spring能找到控制器,需要完成兩件事情:
首先在Spring MVC的配置檔案的頭檔案中引入spring-context,然後使用<context:component-scan/>元素,該元素的功能為:啟動包 掃描功能,以便注冊帶有@Controller、@Service、@repository、@Component等注解的類成為Spring的Bean。base-package屬性指定了需要掃描的類包,類包及其遞歸子包中所有的類都會被處理
<context:component-scan base-package="org.davieyang.controller">
代碼示例
package org.davieyang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* HelloWorldController是一個基于@Controller注解的控制器
* @RequestMapping注解用來映射一個請求,value="/helloWorld"表示請求由helloWorld方法進行處理
* helloWorld方法接收一個 org.springframework.ui.Model類型的參數,本例在model中添加了一個名為message的字元串對象,該對象可以在傳回的視圖當中通過request對象擷取。最後,方法傳回一個字元串helloWorld作為視圖名稱
* 可以同時處理多個請求動作,并且無須實作任何接口。
* org.springframework.stereotype.Controller注解用于訓示該類是一個控制器
*/
@Controller
public class HelloWorldController{
@RequestMapping("/helloWorld")
public String helloWorld(Model model) {
model.addAttribute("message", "Hello World!");
return "helloWorld";
}
}
配置springmvc-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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">
<!-- spring可以自動去掃描base-pack下面的包或者子包下面的java檔案,
如果掃描到有Spring的相關注解的類,則把這些類注冊為Spring的bean -->
<context:component-scan base-package="org.fkit.controller"/>
<!-- 預設裝配方案 -->
<mvc:annotation-driven/>
<!-- 靜态資源處理 -->
<mvc:default-servlet-handler/>
<!-- 視圖解析器 p:prefix屬性表示字首 p:suffix 表示字尾 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/content/" p:suffix=".jsp"/>
</beans>
- 由于使用了@Controller注解,是以不需要再在配置檔案中使用XML描述 Bean。
指定需要Spring掃描org.davieyang.controller包及其子包下 面的所有java檔案<context:component-scan base-package="org.davieyang.controller"/>
-
是一種簡寫形式,可以讓初學者快速應用預設配置方案,<mvc:annotation-driven>
會自動注冊<mvc:annotation-driven>
與RequestMappingHandlerMapping
兩個Bean,這是Spring MVC為@Controllers分發請求所必需的,并提供了資料綁定支援、@NumberFormatannotation支援、@DateTimeFormat支援、@Valid支援、讀寫XML的支援(JAXB)和讀寫 JSON 的支援(預設為Jackson)等功能。本例處理 Ajax請求時,就使用到了對JSON的支援功能Request MappingHandlerAdapter
-
是Spring MVC的靜态資源處理器,在web.xml中,如果将DispatcherServlet請求映射配置為“/”,則 Spring MVC将捕獲Web容器所有的請求,包括靜态資源的請求,而引入類似<mvc:default-servlet-handler/>
這種靜态資源檔案的時候,DispatcherServlet會将“/”看成請求路徑,找不到它的時候會導緻提示404錯誤。當在springmvc-config.xml中配置<script type="text/javascript"src="js/jquery-1.11.0.min.js"/>
後,會在Spring MVC上下文中定義一個< mvc:default-servlet-handler/>
, 它就像一個檢查員,對進入DispatcherServlet的URL進行篩查,如果發現是靜态資源的請求,就将該請求轉由Web應用伺服器預設的Servlet處理;如果不是靜态資源的請求,才由DispatcherServlet繼續處理org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler
- 最後配置了視圖解析器InternalResourceViewResolver來解析視 圖,将View呈現給使用者。視圖解析器中配置的prefix屬性表示視圖的字首,suffix表示視圖的字尾,傳回的視圖字元串是“helloWorld”,經過視圖解析器解析之後,視圖的完整路徑為:
需要注意的是,此處沒有配置處理器映射器和處理器擴充卡,當使用者沒有配置這兩項時,Spring會使用預設的處理 器映射器和處理器擴充卡處理請求/WEB- INF/content/helloWorld.jsp
配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<!-- 定義Spring MVC的前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 讓Spring MVC的前端控制器攔截所有請求 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 編碼過濾器 -->
<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>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
- 處理請求參數和内容部分的注解:@RequestMapping、@RequestParam、@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping、@RequestBody、@ResponseBody、@RequestPart、@RestController
- 處理請求URL部分的注解:@PathVariable、@MatrixVariable、@CrossOrigin
- 處理請求頭部分的注解:@RequestHeader、@CookieValue
- 處理屬性類型的注解:@RequestAttribute、@SessionAttribute、@SessionAttributes、@ModelAttribute
- 處理異常類型的注解: @ExceptionHandler、@ControllerAdvice、@RestControllerAdvice、@ResponseStatus
- 綁定表單資料的注解:@InitBinder