spring-web:spring與web集成
spring-web的作用:包含web應用開發時,用到spring框架時所需的核心類,包括自動載入webapplicationcontext特性的類、struts與jsf集成類、文件上傳的支持類、filter類和大量工具輔助類。
通過spring獲取應用上下文對象
-
在僅僅使用spring的時候,應用上下文的獲取如下圖:
弊端:每次從容器中獲取bean都要編寫new ClassPathXmlApplicationContext
,每次獲取都要加載一次核心配置文件,應用上下文創建多次。
-
自己寫工具類實現(模擬spring獲取app原理)
在web項目中,可以使用ServletContextListener監聽web應用的啟動,在tomcat啟動的時候加載一次spring配置文件並創建應用上下文對象,並將其存儲在最大的域servletContext域中,這樣就可以在任意位置從域中獲取上下文對象了。
-
spring-web提供獲取應用上下文的工具
本功能使用依賴:<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.2.7.RELEASE</version> </dependency>
spring-web提供了一個監聽器ContextLoaderListener,該監聽器內部加載spring配置文件,創建應用上下文對象,並存儲在ServletContext域中,提供一個客戶端工具WebApplicationContextUtils供使用者獲取應用上下文對象。
spring-webmvc
本功能使用依賴:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.13.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.13.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.1</version>
</dependency>
spring-webmvc所依賴的包:(包含spring-context,spring-web)
在使用springmvc之前,我們都需要寫servlet接口的實現類。現在使用springmvc,通過一套注解,可以讓一個簡單的java類成為處理請求的控制器,無需實現任何接口。
springmvc快速入門
開發步驟:
1. 導入springmvc坐標
2. 配置springmvc核心前端控制器DispathcerServlet,讓servlet去加載springmvc配置文件
3. 使用注解配置Controller類中業務方法的映射地址
4. 配置springmvc核心配置文件spring-mvc.xml(可任意命名)
5. 客戶端發起請求
概念理解:Spring父容器與子容器
父子容器的主要作用應該是划分框架邊界。有點單一職責的味道。查看文章:spring和springmvc父子容器的理解 父子容器概念
springmvc執行流程
springmvc框架是使用servlet充當前端控制器。
- 流程圖示
- 完整執行流程
springmvc響應返回
- 重點是springmvc自動將對象轉化為json字符串返回數據
- 需要引入jackson包
- @ResponseBody聲明告知mvc,不進行視圖跳轉,而是直接進行數據響應
- 配置mvc的注解驅動:
<mvc:annotation-driven/>
在springmvc的各個組件中,處理器映射器,處理器適配器,視圖解析器稱為springmvc的三大組件。 使用<mvc:annotation-driven/>自動加載RequestMappingHandlerMapping(處理器映射器)和RequestMappingHandlerAdpter(處理器適配器)。 可以在spring-mvc.xml配置文件中配置<mvc:annotation-driven/>代替注解處理器和適配器的配置, 同時使用<mvc:annotation-driven/>默認底層就會集成jsckson進行對象或集合的json字符串轉換。
springmvc獲得請求數據
-
獲得基本類型參數
- Controller中的業務方法的參數名稱要與請求參數的name一致,參數值會自動映射匹配
- Controller中的業務方法的參數名稱要與請求參數的name一致,參數值會自動映射匹配
-
獲得POJO類型參數
- Controller中的業務方法的POJO參數的屬性名要與請求參數的name一致,參數值會自動映射匹配
- Controller中的業務方法的POJO參數的屬性名要與請求參數的name一致,參數值會自動映射匹配
-
獲得數組類型參數
- Controller中的業務方法的數組名稱要與請求參數的name一致,參數值會自動映射匹配
- Controller中的業務方法的數組名稱要與請求參數的name一致,參數值會自動映射匹配
-
獲得集合類型參數
- 前端發起ajax請求時,可以指定contentType為json形式,那么在方法參數位置使用
@RequestBody
可以直接接收集合數據,二無需使用POJO包裝
- 前端發起ajax請求時,可以指定contentType為json形式,那么在方法參數位置使用
-
參數綁定:@RequestParam
- 當請求參名稱與Controller的業務方法參數名稱不一致時,就需要通過@RequestParam注解顯示綁定
- 當請求參名稱與Controller的業務方法參數名稱不一致時,就需要通過@RequestParam注解顯示綁定
-
占位符參數獲取:@PathVariable
-
獲取請求頭信息
-
解決請求中文亂碼