1 Spring與Web環境集成
1.1 ApplicationContext應用上下文獲取方式
應用上下文對象是通過new ClasspathXmlApplicationContext(spring配置文件)
方式獲取的,但是每次從容器中獲取Bean
時都需要編寫new ClasspathXmlApplicationContext(spring配置文件)
,這樣的弊端就是配置文件加載多次,應用上下文對象被創建多次。
在Web項目中,可以使用ServletContextListener
監聽Web應用的啓動,我們可以在Web應用啓動時,就加載Spring配置文件,創建應用上下文對象ApplicatiionContext
,再將其存儲到最大的域ServletContex
域中,這樣就可以在任意位置從域中獲取得到應用上下文ApplicatiionContext
對象了。
1.2 Spring提供獲取應用上下文的工具
上面的分析不用手動實現,spring提供了一個監聽器ContextLoaderListener
就是對上述的功能的封裝,該監聽器內部加載Spring配置文件,創建應用上下文對象,並存儲到ServletContext
域中,提供了一個客戶端工具WebApplicationContextUtils
供使用者獲得應用上下文對象。
所以我們只需要做兩件事:
① 在web.xml文件中配置ContextLoaderListener
監聽器(需要導入spring-web座標)
② 使用WebApplicationContextUtils
獲取應用上下文對象ApplicationContext
1.3 導入Spring集成web的座標
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
1.4 配置ContextLoaderListener監聽器
<!--全局參數-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--Spring的監聽器-->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
1.5 通過工具獲得應用上下文對象
ApplicationContext applicationContext =
WebApplicationContextUtils.getWebApplicationContext(servletContext);
Object obj = applicationContext.getBean("id");
知識要點:
spring集成web環境的步驟
① 配置ContextLoaderListener監聽器
② 使用WebApplicationContextUtils獲得應用上下文
2 SpringMVC簡介
2.1 SpringMVC概述
SpringMVC是一種基於Java實現的MVC設計模型的請求驅動類型的輕量級Web框架,屬於SpringFrameWork的後續產品,已經融合在Spring web Flow中。
SpringMVC已經成爲目前最流行的MVC框架之一,並且伴隨着Spring3.0的發佈,全面超越Struts2,成爲最優秀的MVC框架。它通過一套註解,讓一個簡單的Java類成爲處理請求的控制器,而無需事先任何接口,同時他還支持RESTFUL編程風格的請求。
2.2 SpringMVC快速入門
需求:客戶端發起請求,服務端接收請求,執行邏輯並進行視圖跳轉
開發步驟:
① 導入springMVC的座標
② 配置SpringMVC核心控制器DispatcherServlet
③ 創建Controller類和視圖頁面
④ 使用註解配置Controller類中業務方法的映射地址
⑤ 配置SpringMVC核心配置文件spring-mvc.xml
⑥ 客戶端發起請求測試
代碼實現
① 導入Spring和SpringMVC的座標、導入Servlet和Jsp的座標
<!--Spring座標-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--SpringMVC座標-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--Servlet座標-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!--Jsp座標-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
</dependency>
② 配置SpringMVC核心控制器DispatcherServlet
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
③ 創建Controller類和業務方法
public class QuickController {
public String quickMethod(){
System.out.println("quickMethod running.....");
return "index";
}
}
③創建視圖頁面index.jsp
<html>
<body>
<h2>Hello SpringMVC!</h2>
</body>
</html>
④ 使用註解配置Controller類中業務方法的映射地址
@Controller
public class QuickController {
@RequestMapping("/quick")
public String quickMethod(){
System.out.println("quickMethod running.....");
return "index";
}
}
⑤ 配置SpringMVC核心配置文件spring-mvc.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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">
<!--配置註解掃描-->
<context:component-scan base-package="com.ldy"/>
</beans>
⑥ 客戶端發起請求測試
http://localhost:8080/ldy_springmvc1/quick
2.3 SpringMVC流程圖示
3 SpringMVC的組件解析
3.1 SpringMVC的執行流程
① 用戶發送請求至前端控制器DispatcherServlet。
② DispatcherServlet收到請求後,調用HandlerMapping處理器映射器。
③ 處理器映射器找到具體的處理器(可以根據xml配置、註解進行查找),生成處理器對象以及處理攔截器(如果有則生成),一併返回給DispatcherServlet。
④ DispatcherServlet調用HandlerAdapter處理器適配器。
⑤ HandlerAdapter經過適配調用具體的處理器(Controller,也叫後端控制器)。
⑥ Controller執行完返回ModelAndView。
⑦ HandlerAdapter將Controller執行結果ModelAndView返回給DispatcherServlet。
⑧ DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器。
⑨ ViewReslover解析後返回具體View。
⑩ DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中),DispatcherServlet響應用戶。
3.2 SpringMVC組件解析
前端控制器: DispatcherServlet
用戶請求到達前端控制器,它就相當於MVC模式中的C,DispatcherServlet是整個流程控制的中心,由它調用其他組件處理用戶的請求,DispatcherServlet的存在降低了組件之間的耦合性。處理器映射器:HandlerMapping
HandlerMapping 負責根據用戶請求找到Handler即處理器,SpringMVC提供了不同的映射器實現不同的映射方式,列如:配置文件方式、實現接口方式、註解方式等。處理器適配器:HandlerAdapter
通過HandlerAdapter對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多類型的處理器進行執行。處理器:Handler
它就是我們開發中要編寫的具體業務控制器,由DispatcherServlet把用戶請求轉發到Handler,由Handler對具體的用戶請求進行處理。視圖解析器:ViewResolver
ViewResolver負責將處理結果生成View視圖,ViewResolver首先根據邏輯視圖名解析成物理視圖名,即具體的頁面地址,再生成view視圖對象,最後對view進行渲染將處理結果通過頁面展示給用戶。視圖:View
SpringMVC 框架提供了很多的 View 視圖類型的支持,包括:jstlView、freemarkerView、pdfView等。最常用的視圖就是 jsp。一般情況下需要通過頁面標籤或頁面模版技術將模型數據通過頁面展示給用戶,需要由程序員根據業務需求開發具體的頁面。
3.3 SpringMVC註解解析
@RequestMapping
作用:用於建立請求URL和處理請求方法之間的對應關係
位置:
- 類上:請求URL的一級訪問目錄。此處不寫的話,就相當於應用的跟目錄。
- 方法上:請求URL的第二級目錄。與類上使用@ReqquestMapping標註的一級目錄一起組成訪問虛擬路徑。
屬性:
- value:用於指定請求的URL。它和path屬性的作用是一樣的
- method:用於指定請求的方式,常見的有get和post兩種
- params:用於指定限制請求參數的條件。它支持簡單的表達式。要求請求參數的key和value必須和配置的一模一樣
例如:
params = {“accountName”},表示請求參數必須有accountName
params = {“moeny!100”},表示請求參數中money不能是100
3.4 SpringMVC的XML配置解析
SpringMVC有默認組件配置,默認組件都是DispatcherServlet.properties配置文件中配置的,該配置文件地址org/springframework/web/servlet/DispatcherServlet.properties,該文件中配置了默認的視圖解析器,如下:
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
翻看該解析器源碼,可以看到該解析器的默認設置,如下:
REDIRECT_URL_PREFIX = "redirect:" --重定向前綴
FORWARD_URL_PREFIX = "forward:" --轉發前綴(默認值)
prefix = ""; --視圖名稱前綴
suffix = ""; --視圖名稱後綴
我們可以通過屬性注入的方式修改視圖的的前後綴
<!--配置內部資源視圖解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>