Spring MVC 框架(一)—— 註解搭建 spring-mvc 框架、Spring-mvc 的執行過程及其重要組件、Spring-mvc 參數獲取

一、使用註解搭建 spring-mvc 框架

(1)在 spring 包的基礎上導入 spring-webmvc jar包
在這裏插入圖片描述
(2)在 web.xml 中加載核心控制器
springmvc 的核心控制器是一個 Servlet,在 webmvc 組件的 org.springframework.web.servlet 包下名爲 DispatcherServlet,該 Servlet 用於接收所有請求並進行分發不同的業務控制器以及後續的響應工作。

<!-- 核心控制器 -->
<servlet>
	<servlet-name>mvc</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>mvc</servlet-name>
	<url-pattern>*.do</url-pattern>
</servlet-mapping>

(3)配置 spring-mvc 的配置文件:
在沒有特別說明的情況下 spring-mvc 會默認去讀取位於WEB-INF文件夾下,名爲核心控制器 Servlet 的 servlet-name+servlet.xml 的文件作爲它的配置文件,例如根據上面第二步的配置核心控制器 DispatcherServlet 的 servlet-name 爲 springmvc,那麼WEB-INF文件夾下就應該新建一個名爲 springmvc-servlet.xml 的配置文件。

在這裏插入圖片描述
如果想要自定義配置文件名稱,可以在src目錄下新建任意名稱的xml文件,然後通過servlet的初始化參數將配置文件的名稱告知給 springmvc。

<!-- 核心控制器 -->
<servlet>
	<servlet-name>mvc</servlet-name>
   	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   	
   	<!-- 如果是創建在src目錄下的mvc-servlet.xml,則需要在web.xml中配置下面的信息
          告知springmvc這個配置文件的名字,便於初始化過程中加載配置文件mvc-servlet.xml -->
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:mvc-servlet.xml</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>mvc</servlet-name>
	<url-pattern>*.do</url-pattern>
</servlet-mapping>

(4)新建業務控制器處理請求

  • spring-mvc 的業務控制器可以是實現了 Controller 接口的類,也可以是普通類,之所以 springmvc 能夠支持多種不同類型的業務控制器,基於 springmvc 的處理器適配器(HandlerAdapter)。在使用註解搭建 springmvc 框架時,業務控制器用普通類來定義就可以了,不需要實現任何接口或者繼承任何類。
  • 在業務控制器類上,需要添加@Controller註解,添加該註解的目的是爲了使用 spring 的IOC創建控制層的對象。
  • 在業務控制器中新建方法,將方法的返回值定義爲String類型,方法名沒有限制,同時在方法上添加一個註解@RequestMapping(“請求地址”),該註解的目的是將業務控制器中的方法與請求地址進行映射,當服務器收到該請求時,將會交給這個方法來執行。在方法中返回一個網頁的地址,作爲響應的視圖。
@Controller
public class ProductsController {
	@RequestMapping("select")
	public String select() {
		System.out.println("執行到Controller層,處理請求");
		return "success.jsp";
	}
}

(5)在 springmvc 的配置文件中,添加掃包信息和註解驅動器

<!-- 配置Spring掃描包的地址 -->
<context:component-scan base-package="com.springmvc.demo1"></context:component-scan>
<!-- 開啓註解驅動 -->
<mvc:annotation-driven></mvc:annotation-driven>

<mvc:annotation-driven/>
在 spring3.0 以前該標籤的作用是註冊DefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapter兩個 bean,springmvc 默認情況下只支持以配置文件的方式進行配置,是沒有加載專門用於通過掃描註解生成處理器的DefaultAnnotationHandlerMapping(註解處理映射器)和執行註解處理器的AnnotationMethodHandlerAdapter(註解處理適配器),所以必須手動配置這兩個 bean 才能通過註解的方式處理請求。

(6)通過瀏覽器測試
RequestMapping註解也可以放到業務控制器的類上,作爲當前類中所有請求的命名空間來使用,類似於 struts2 中的 namespace。

二、Spring-mvc 的執行過程及其重要組件

1、重要組件:

(1)DispatcherServlet:核心控制器
用戶請求到達核心控制器,它就相當於MVC模式中的C,DispatcherServlet 是整個流程控制的中心,由它調用其它組件處理用戶的請求, DispatcherServlet 的存在降低了組件之間的耦合性。

(2)HandlerMapping:處理器映射器

HandlderMapping.getHandler(request);

HandlerMapping 負責根據用戶請求找到 Handler 即處理器(業務控制器),springmvc 提供了不同的映射器實現不同的映射方式,例如:配置文件方式,實現接口方式,註解方式等。

(3)Handler:處理器
Handler 是繼 DispatcherServlet 核心控制器之後的業務控制器,在 DispatcherServlet 的控制下 Handler 對具體的用戶請求進行處理。

(4)HandlAdapter:處理器適配器
由於 Spring-mvc支持多種類型的處理器,爲了執行不同種類的處理器,Spring-mvc 通過 HandlerAdapter 對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多類型的處理器進行執行。

(5)View Resolver:視圖解析器
View Resolver 負責將處理結果生成 View 視圖,View Resolver 首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成 View 視圖對象,最後對 View 進行渲染將處理結果通過頁面展示給用戶。

2、Spring-mvc 執行流程圖:

在這裏插入圖片描述
(1)用戶發送請求
(2)請求進入核心控制器DispatcherServlet
(3)通過處理器映射器(HandlerMapping)獲取處理器對象(Handler)(包含了業務控制器方法的代理對象)
(4)通過相匹配的處理器適配器調用處理器
(5)處理器執行,並得到返回值(String、ModelAndView、需要轉爲json的數據)
(6)通過視圖解析器對返回值進行解析,返回不同的視圖
(7)核心控制器響應信息

三、Spring-mvc 參數獲取

1、Spring-mvc 參數獲取

處理器適配器在執行 Handler 之前會直接把http請求的 key/value 數據綁定到 Handler 方法形參上。
(1)默認支持的參數類型
處理器形參中添加如下類型的參數處理適配器會默認識別並進行賦值。
HttpServletRequest:通過 request 對象獲取請求信息
HttpServletResponse:通過 response 處理響應信息
HttpSession:通過 session 對象得到 session 中存放的對象

@RequestMapping("test")
public String test(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
	return "success.jsp";
}

(2)基本數據類型
http請求中包含的數據,並自動進行數據類型轉換

@RequestMapping("test")
public String test(int id) {
	return "success.jsp";
}

默認情況下,http 請求中的參數名稱必須和方法形參名稱一致才能進行參數綁定,但是可以使用 @RequestParam 註解進行手動的參數綁定,例如:http 中的參數名稱爲 user_id,形參中的參數名稱爲id,就需要在形參前添加@RequestParam(name="user_id")進行綁定。

@RequestMapping("test")
public String test(@RequestParam(name="user_id")int id) {
	return "success.jsp";
}

(3)實體類型
將http請求中包含的數據封裝爲實體類型
爲了便於後續執行過程中參數的傳遞,通常我們會將多個參數封裝稱爲一個實體類型的對象,在形參列表中定義一個實體類型的形參,在發送http請求時直接使用實體類的屬性名稱作爲參數即可。
① 實體類

public class Users {
    private Integer userId;
    private String userName;
    private String userPassword;
	//省略get、set方法
}

② concontroller 層

@RequestMapping("test")
public String test(Users users) {
	System.out.println(users.getUserName());
	return "success.jsp";
}

頁面傳遞參數時,將參數名稱指定爲 userName 和 userPassword 即可,注意不要和 struts2 混淆寫成 users.userName和 users.userPassword,這樣是接收不到參數的。
假如對象之間有嵌套的關係,例如 User 中定義了一個 UserInfo 對象,那麼如果要給 UserInfo 對象中的id賦值,在傳參時使用 UserInfo對象名稱.屬性名=值的方式將參數保存到 UserInfo 對象中

(4)日期類型
如果參數中有字符串類型需要轉爲日期類型,那麼需要執行日期類型的轉換格式不然會拋出異常。

@RequestMapping("test")
public String test(@DateTimeFormat(pattern="yyyy-MM-dd")Date time) {
	System.out.println(time);
	return "success.jsp";
}

如果日期類型數據需要綁定在在實體類對象中,那麼需要在實體類的日期屬性上添加該註解

public class Users {
    private Integer userId;
    private String userName;
    private String userPassword;
    @DateTimeFormat(pattern="yyyy-MM-dd")
    private Date time;
	//省略get、set方法
}

(5)字符串數組類型
將 http 請求中包含的字符串數組數據封裝爲數組,http 請求中包含了數組數據,例如用多選框傳遞的參數 arr=“張三”,arr=“李四”,那麼在形參中需要定義名爲 arr 的字符串數組來綁定參數。

@RequestMapping("test")
public String test(String[] arr) {
	System.out.println(arr[0]);
	return "success.jsp";
}

2、SpringMVC 亂碼處理

SpringMVC 在處理 post 請求傳遞的參數時,是沒有進行亂碼處理的,我們需要在項目中引入一個過濾器來處理 post 請求中的亂碼。

<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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章