從 Spring Boot到 Spring MVC(注解方式)

Profile

概述

在前文《從SpringBoot到SpringMVC(非注解方式)》之中,我們遠離了 Spring Boot的開箱即用與自動配置的便利性后蚁吝,回歸到了淳樸的 Spring MVC開發(fā)時代,但是以非注解的方式來給出的偏灿,而本文則以注解方式再度講述一遍宵蛀。

注: 本文首發(fā)于 My Personal Blog:CodeSheep·程序羊,歡迎光臨 小站


Spring MVC架構模式

SpringMVC請求處理流程

一個典型的Spring MVC請求流程如圖所示省容,詳細分為12個步驟:

    1. 用戶發(fā)起請求,由前端控制器DispatcherServlet處理
    1. 前端控制器通過處理器映射器查找hander燎字,可以根據(jù)XML或者注解去找
    1. 處理器映射器返回執(zhí)行鏈
    1. 前端控制器請求處理器適配器來執(zhí)行hander
    1. 處理器適配器來執(zhí)行handler
    1. 處理業(yè)務完成后腥椒,會給處理器適配器返回ModeAndView對象,其中有視圖名稱候衍,模型數(shù)據(jù)
    1. 處理器適配器將視圖名稱和模型數(shù)據(jù)返回到前端控制器
    1. 前端控制器通過視圖解析器來對視圖進行解析
    1. 視圖解析器返回真正的視圖給前端控制器
    1. 前端控制器通過返回的視圖和數(shù)據(jù)進行渲染
    1. 返回渲染完成的視圖
    1. 將最終的視圖返回給用戶笼蛛,產(chǎn)生響應

整個過程清晰明了,下面我們將結合實際實驗來理解這整個過程蛉鹿。


Spring MVC項目搭建

實驗環(huán)境如下:

  • IntelliJ IDEA 2018.1 (Ultimate Edition)
  • SpringMVC 4.3.9.RELEASE
  • Maven 3.3.9

這里我是用IDEA來搭建的基于Maven的SpringMVC項目滨砍,搭建過程不再贅述,各種點擊并且下一步,最終創(chuàng)建好的項目架構如下:

基于Maven的SpringMVC項目

添加前端控制器配置

使用了SpringMVC惋戏,則所有的請求都應該交由SpingMVC來管理领追,即要將所有符合條件的請求攔截到SpringMVC的專有Servlet上。

為此我們需要在 web.xml 中添加SpringMVC的前端控制器DispatcherServlet:

    <!--springmvc前端控制器-->
    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:mvc-dispatcher.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>

該配置說明所有符合.action的url响逢,都交由mvc-dispatcher這個Servlet來進行處理


編寫Spring MVC核心XML配置文件

從上一步的配置可以看到绒窑,我們定義的mvc-dispatcher Servlet依賴于配置文件 mvc-dispatcher.xml,在本步驟中我們需要在其中添加如下的配置

  • 添加注解的處理器適配器和處理器映射器

方式一:

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />

方式二:

<mvc:annotation-driven></mvc:annotation-driven>

編寫控制器

由于使用了注解的處理器映射器和處理器適配器舔亭,所以不需要在XML中配置任何信息些膨,也不需要實現(xiàn)任何接口,只需要添加相應注解即可钦铺。

@Controller
public class TestController {

    private StudentService studentService = new StudentService();

    @RequestMapping("/queryStudentsList")
    public ModelAndView handleRequest( ) throws Exception {
        List<Student> studentList = studentService.queryStudents();
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("studentList",studentList);
        modelAndView.setViewName("/WEB-INF/views/studentList.jsp");
        return modelAndView;
    }
}

class StudentService {
    public List<Student> queryStudents() {
        List<Student> studentList = new ArrayList<Student>();

        Student hansonwang = new Student();
        hansonwang.setName("hansonwang99");
        hansonwang.setID("123456");

        Student codesheep = new Student();
        codesheep.setName("codesheep");
        codesheep.setID("654321");

        studentList.add(hansonwang);
        studentList.add(codesheep);

        return studentList;
    }
}

為了讓注解的處理器映射器和處理器適配器找到注解的Controllor订雾,有兩種配置方式:

方式一:在xml中聲明Controllor對應的bean

<bean class="cn.codesheep.controller.TestController" />

方式二:使用掃描配置,對某一個包下的所有類進行掃描职抡,找出所有使用@Controllor注解的Handler控制器類

<context:component-scan base-package="cn.codesheep.controller"></context:component-scan>

編寫視圖文件

這里的視圖文件是一個jsp文件葬燎,路徑為:/WEB-INF/views/studentList.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<html>
<head>
    <title>學生名單</title>
</head>
<body>
    <h3>學生列表</h3>
    <table width="300px;" border=1>
        <tr>
            <td>姓名</td>
            <td>學號</td>
        </tr>
        <c:forEach items="${studentList}" var="student" >
            <tr>
                <td>${student.name}</td>
                <td>${student.ID}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

實驗測試

啟動Tomcat服務器误甚,然后瀏覽器輸入:

http://localhost:8080/queryStudentsList.action
實驗結果

數(shù)據(jù)渲染OK缚甩。


后 記

由于能力有限薇搁,若有錯誤或者不當之處浩聋,還請大家批評指正,一起學習交流飘诗!



最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末冈钦,一起剝皮案震驚了整個濱河市郊丛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瞧筛,老刑警劉巖厉熟,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異较幌,居然都是意外死亡揍瑟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門乍炉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绢片,“玉大人,你說我怎么就攤上這事岛琼〉籽” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵槐瑞,是天一觀的道長熙涤。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么祠挫? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任猬错,我火速辦了婚禮,結果婚禮上茸歧,老公的妹妹穿的比我還像新娘倦炒。我一直安慰自己,他們只是感情好软瞎,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布逢唤。 她就那樣靜靜地躺著,像睡著了一般涤浇。 火紅的嫁衣襯著肌膚如雪鳖藕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天只锭,我揣著相機與錄音著恩,去河邊找鬼。 笑死蜻展,一個胖子當著我的面吹牛喉誊,可吹牛的內容都是我干的。 我是一名探鬼主播纵顾,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼伍茄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了施逾?” 一聲冷哼從身側響起敷矫,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汉额,沒想到半個月后曹仗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蠕搜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年怎茫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讥脐。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡遭居,死狀恐怖,靈堂內的尸體忽然破棺而出旬渠,到底是詐尸還是另有隱情俱萍,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布告丢,位于F島的核電站枪蘑,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜岳颇,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一照捡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧话侧,春花似錦栗精、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至新博,卻和暖如春薪夕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赫悄。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工原献, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人埂淮。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓姑隅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親同诫。 傳聞我的和親對象是個殘疾皇子粤策,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344