Spring系列文章
Spring框架-1(基礎)
Spring框架-2(IOC上)
Spring框架-3(IOC下)
Spring框架-4(AOP)
Spring框架-5(JDBC模板&Spring事務管理)
Spring框架-6(SpringMvc)
Spring框架-7(搭建SSM)
Spring框架-8(SpringMVC2)
在不懂javaWeb前,一直聽到做javaWeb的朋友們說什么ssm,ssh。今天這篇文章就主要講解ssm中的一個s-->SpringMvc。
先看下這篇文章的結構:
SpringMvc介紹
SpringMvc是什么?
介紹
總所周知Mvc是我們再開發中常用的架構,無論是再web開發還是其他開發都非常常見,springMvc是依賴與Sping對webMvc封裝的一個框架。使用springMvc開發十分的簡潔的快速。
-
Spring web mvc和Struts2都屬于表現層的框架,它是Spring框架的一部分,我們可以從Spring的整體結構中看得出來:
Spring結構.pngspringMvc:是一個表現層框架
作用:就是從請求中接收傳入的參數,將處理后的結果數據返回給頁面展示
SpringMvc處理流程
入門程序
使用IDEA創建一個Spring+SpingMvc+web工程
創建好了以后,打開project
structure你會發現有兩個問題,這個地方應該是IDEA創建問題,你運行起來,這里還有兩個jar包沒有加入到tomcat中。所以運行就會報錯。我們需要解決這兩個問題就好了
創建測試controller
創建一個controller然后指定hello的請求。返回一段字符串。
@Controller
public class TestController {
@RequestMapping("/hello")//注解為控制器指定可以處理哪些 URL 請求
@ResponseBody//
public String firstTest() {
return "hello world";
}
}
配置前端控制器和SpringMvc配置文件
web.xml是項目創建后自動生成的文件,配置Springmvc的核心控制器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- 如果沒有指定springMvc核心配置文件那么默認會去找/WEB-INF/+<servlet-name>中的內容 + -servlet.xml配置文件 -->
<!-- 指定springMvc核心配置文件位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- spirngMvc前端控制器 -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- tomcat啟動的時候就加載這個servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- spirngMvc攔截.action結尾的請求 -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
配置springmvc我們需要配置兩個核心類 注解的處理器映射器 和 注解的處理器適配器,你可以手動配置,但是一般都是直接配一個注解驅動。注解驅動等于自動配置好了注解處理器映射器,注解處理器適配器
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--Spring注解掃描-->
<context:component-scan base-package="com.zhong.demo1"/>
<!-- 配置springmvc我們需要配置兩個核心類 注解的處理器映射器 和 注解的處理器適配器-->
<!-- 注解的處理器映射器 -->
<!--<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean> -->
<!-- 注解的處理器適配器 -->
<!--<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean> -->
<!-- 配置springmvc我們需要配置兩個核心類 注解的處理器映射器-->
<!-- 注解驅動:作用:替我們自動配置最新版的注解的處理器映射器和處理器適配器-->
<mvc:annotation-driven/>
</beans>
運行測試
到這里我們就配置好Tomcat直接運行起來。然后訪問http://localhost:8080/hello.action
結果瀏覽器頁面顯示出:hello world
注意:由于我們再前面配置了spirngMvc攔截.action。所以我們的請求必須在后面加上.action
到這里我們的入門程序就完成了。
分析
以上出現的注解
@Controller 負責注冊一個bean 到spring 上下文中
@RequestMapping 注解為控制器指定可以處理哪些 URL 請求
SpringMvc常用注解
- @Controller
負責注冊一個bean 到spring 上下文中
- @RequestMapping
注解為控制器指定可以處理哪些 URL 請求,
該注解支持URI模板變量中使用正則表達式。語法是{varName:regex},其中第一部分定義了變量名,第二 部分就是你所要應用的正則表達式。比如下面的代碼樣例
@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{extension:\\.[a-z]+}")
public void handle(@PathVariable String version, @PathVariable String extension) {
// 代碼部分省略...
}
當一個URL同時匹配多個模板(pattern)時
URI模板變量的數目和通配符數量的總和最少的那個路徑模板更準確.
如果兩個模板的URI模板數量和通配符數量總和一致,則路徑更長的那個模板更準確。
如果兩個模板的數量和長度均一致,則那個具有更少通配符的模板是更加準確的
- @RequestBody
該注解用于讀取Request請求的body部分數據,使用系統默認配置的HttpMessageConverter進行解析,然后把相應的數據綁定到要返回的對象上 ,再把HttpMessageConverter返回的對象數據綁定到 controller中方法的參數上.
- @ResponseBody
該注解用于將Controller的方法返回的對象,通過適當的HttpMessageConverter轉換為指定格式后,寫入到Response對象的body數據區, 會根據HTTP請求頭的contentType或者appect的內容自動轉換返回類型,例如xml或者json.
用此注解或者ResponseEntity等類似類, 會導致response header含有accept-charset這個字段,而這個字段對于響應頭是沒有用的,以下方法可以關掉
<mvc:annotation-driven>
<mvc:async-support default-timeout="3000"/>
<!-- utf-8編碼 -->
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
<property name="writeAcceptCharset" value="false"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
- @ModelAttribute
在方法定義上使用 @ModelAttribute 注解:Spring MVC 在調用目標處理方法前,會先逐個調用在方法級上標注了@ModelAttribute 的方法。在方法的入參前使用 @ModelAttribute 注解:可以從隱含對象中獲取隱含的模型數據中獲取對象,再將請求參數 –綁定到對象中,再傳入入參將方法入參對象添加到模型中
- @RequestParam
在處理方法入參處使用 @RequestParam 可以把請求參 數傳遞給請求方法
- @CookieValue
關于Coookie的注解, 類似,肯定還有關于session的注解.
- @PathVariable
綁定 URL 占位符到入參, 例如
@RequestMapping(value = "/person/profile/{id}")
public String porfile(@PathVariable("id") int uid) { ... }
- @ExceptionHandler
注解到方法上,出現異常時會執行該方法
- @ControllerAdvice
使一個Contoller成為全局的異常處理類,類中用@ExceptionHandler方法注解的方法可以處理所有Controller發生的異常
SpringMvc架構
架構結構圖
架構流程
- 用戶發送請求至前端控制器DispatcherServlet
- DispatcherServlet收到請求調用HandlerMapping處理器映射器。
- 處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一并返回給DispatcherServlet。
- DispatcherServlet通過HandlerAdapter處理器適配器調用處理器
- 執行處理器(Controller,也叫后端控制器)。
- Controller執行完成返回ModelAndView
- HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet
- DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
- ViewReslover解析后返回具體View
- DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)。
- DispatcherServlet響應用戶
組件說明
1. DispatcherServlet:前端控制器
用戶請求到達前端控制器,它就相當于mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它調用其它組件處理用戶的請求,dispatcherServlet的存在降低了組件之間的耦合性。
2. HandlerMapping:處理器映射器
HandlerMapping負責根據用戶請求找到Handler即處理器,springmvc提供了不同的映射器實現不同的映射方式,例如:配置文件方式,實現接口方式,注解方式等。
3. Handler:處理器
Handler 是繼DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler對具體的用戶請求進行處理。
由于Handler涉及到具體的用戶業務請求,所以一般情況需要程序員根據業務需求開發Handler。
4. HandlAdapter:處理器適配器
通過HandlerAdapter對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多類型的處理器進行執行。
5. View Resolver:視圖解析器
View Resolver負責將處理結果生成View視圖,View Resolver首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成View視圖對象,最后對View進行渲染將處理結果通過頁面展示給用戶。
6. View:視圖
springmvc框架提供了很多的View視圖類型的支持,包括:jstlView、freemarkerView、pdfView等。我們最常用的視圖就是jsp。
一般情況下需要通過頁面標簽或頁面模版技術將模型數據通過頁面展示給用戶,需要由程序員根據業務需求開發具體的頁面。
注解映射器和適配器
組件掃描器
使用組件掃描器省去在spring容器配置每個controller類的繁瑣。使用<context:component-scan>自動掃描標記@controller的控制器類,配置如下:
<!-- 掃描controller注解,多個包中間使用半角逗號分隔 -->
<context:component-scanbase-package="com.zhong.demo1"/>
RequestMappingHandlerMapping 注解式處理器映射器
注解式處理器映射器,對類中標記@ResquestMapping的方法進行映射,根據ResquestMapping定義的url匹配ResquestMapping標記的方法,匹配成功返回HandlerMethod對象給前端控制器,HandlerMethod對象中封裝url對應的方法Method。
從spring3.1版本開始,廢除了DefaultAnnotationHandlerMapping的使用,推薦使用RequestMappingHandlerMapping完成注解式處理器映射。
配置如下:
<!--注解映射器 -->
<beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
注解描述:
@RequestMapping:定義請求url到處理器功能方法的映射
RequestMappingHandlerAdapter處理器適配器
注解式處理器適配器,對標記@ResquestMapping的方法進行適配。
從spring3.1版本開始,廢除了AnnotationMethodHandlerAdapter的使用,推薦使用RequestMappingHandlerAdapter完成注解式處理器適配。
配置如下:
<!--注解適配器 -->
<beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<mvc:annotation-driven> 自動配置最新版的注解的處理器映射器和處理器適配器
springmvc使用<mvc:annotation-driven>自動加載RequestMappingHandlerMapping和RequestMappingHandlerAdapter,可用在springmvc.xml配置文件中使用<mvc:annotation-driven>替代注解處理器和適配器的配置。
視圖解析器
在springmvc.xml文件配置如下:
<beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver">
<propertyname="viewClass"
value="org.springframework.web.servlet.view.JstlView"/>
<propertyname="prefix"value="/WEB-INF/jsp/"/>
<propertyname="suffix"value=".jsp"/>
</bean>
InternalResourceViewResolver:支持JSP視圖解析
viewClass:JstlView表示JSP模板頁面需要使用JSTL標簽庫,所以classpath中必須包含jstl的相關jar 包。此屬性可以不設置,默認為JstlView。
prefix 和suffix:查找視圖頁面的前綴和后綴,最終視圖的址為:
前綴+邏輯視圖名+后綴,邏輯視圖名需要在controller中返回ModelAndView指定,比如邏輯視圖名為hello,則最終返回的jsp視圖地址 “WEB-INF/jsp/hello.jsp”