Spring框架-6(SpringMvc)

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。

先看下這篇文章的結構:


導航.png

入門程序.png

SpringMvc架構.png

先附上Demo地址

SpringMvc介紹

SpringMvc是什么?

介紹

  1. 總所周知Mvc是我們再開發中常用的架構,無論是再web開發還是其他開發都非常常見,springMvc是依賴與Sping對webMvc封裝的一個框架。使用springMvc開發十分的簡潔的快速。

  2. Spring web mvc和Struts2都屬于表現層的框架,它是Spring框架的一部分,我們可以從Spring的整體結構中看得出來:


    Spring結構.png

    springMvc:是一個表現層框架
    作用:就是從請求中接收傳入的參數,將處理后的結果數據返回給頁面展示

SpringMvc處理流程

處理流程.png

入門程序

使用IDEA創建一個Spring+SpingMvc+web工程

創建.png

創建好了以后,打開project
structure你會發現有兩個問題,這個地方應該是IDEA創建問題,你運行起來,這里還有兩個jar包沒有加入到tomcat中。所以運行就會報錯。我們需要解決這兩個問題就好了

創建后的問題.png

創建測試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架構

架構結構圖

SpringMvc詳細框架結構.png

架構流程

  1. 用戶發送請求至前端控制器DispatcherServlet
  2. DispatcherServlet收到請求調用HandlerMapping處理器映射器。
  3. 處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一并返回給DispatcherServlet。
  4. DispatcherServlet通過HandlerAdapter處理器適配器調用處理器
  5. 執行處理器(Controller,也叫后端控制器)。
  6. Controller執行完成返回ModelAndView
  7. HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet
  8. DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
  9. ViewReslover解析后返回具體View
  10. DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)。
  11. 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”

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,431評論 2 378

推薦閱讀更多精彩內容