SpringMVC

SpringMVC

一豫尽、概述

SpringMVC是由Spring官方提供的基于MVC設(shè)計理念的web框架鳖宾。

SpringMVC是基于Servlet封裝的用于實現(xiàn)MVC控制的框架吼砂,實現(xiàn)前端和服務端的交互。

1.1 SpringMVC優(yōu)勢

  • 嚴格遵守了MVC分層思想
  • 采用了松耦合鼎文、插件式結(jié)構(gòu)
  • SpringMVC是基于Spring的擴展渔肩、提供了一套完善的MVC注解
  • SpringMVC在數(shù)據(jù)綁定、視圖解析都提供了多種處理方式拇惋,可靈活配置
  • SpringMVC對RESTful URL設(shè)計方法提供了良好的支持

1.2 SpringMVC本質(zhì)工作

  • 接收并解析請求
  • 處理請求
  • 數(shù)據(jù)渲染周偎、響應請求

二、部署

2.1 創(chuàng)建web工程

基于Maven創(chuàng)建一個web工程

2.2 添加依賴

添加所需對應的依賴

  • spring-context
  • spring-aspects
  • spring-jdbc
  • spring-test
  • spring-web
  • spring-webmvc

2.3 創(chuàng)建配置文件

創(chuàng)建SpringMVC配置文件:

  • 在resources目錄下創(chuàng)建名為spring-servlet.xml的文件

  • 添加MVC命名空間

    <?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:aop="http://www.springframework.org/schema/aop"
           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/aop
           http://www.springframework.org/schema/aop/spring-aop.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <context:annotation-config/>
        <context:component-scan base-package="com.test"/>
        <!--聲明MVC使用注解驅(qū)動-->
        <mvc:annotation-driven/>
        <!--配置靜態(tài)資源放行-->
        <mvc:resources mapping="/css/**" location="/css/"/>
        <mvc:resources mapping="/js/**" location="/js/"/>
        ...
    </beans>
    

2.4 配置前端控制器

在web.xml中配置SpringMVC的前端控制器

SpringMVC提供了一個名為DispatcherServlet的類(SpringMVC中央處理器)撑帖,用于攔截用戶請求交由SpringMVC處理

<servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <!--配置初始化參數(shù)-->
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-servlet.xml</param-value>
    </init-param>
    <!--當值為0或者大于0時蓉坎,代表容器啟動時加載該servlet。正數(shù)的值越小胡嘿,啟動時加載該servlet的優(yōu)先級越高蛉艾。如果為負數(shù),則容器啟動時不會加載該servlet衷敌,只有該servlet被選擇時才會加載勿侯。-->
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<url-pattern>中 '/*'與'/'的區(qū)別

/* 攔截所有的HTTP請求,包括.jsp的請求缴罗,都將其當作控制器類的請求路徑處理

/ 表示攔截除.jsp外的HTTP請求助琐,但不會放行靜態(tài)資源請求(html/css/js/圖片)

所以需要在spring-servlet.xml中配置靜態(tài)資源放行。

三瞒爬、使用

在SpringMVC中弓柱,我們把接收用戶請求沟堡、處理用戶請求的類稱之為Controller(控制器)

3.1 創(chuàng)建控制器

  • 創(chuàng)建controller包(需要在Spring注解掃描的范圍內(nèi))

  • 創(chuàng)建相應的類

  • 在類上添加@Controller注解侧但,聲明此類為SpringMVC的控制器

  • 在類上添加@RequestMapping("/url"),聲明此控制器類的請求url

    @Controller
    @RequestMapping("/test")
    public class TestController{
        
    }
    

3.2 定義處理請求的方法

  • 在一個控制器類中可以定義多個方法處理不同請求

  • 在每個方法上添加@RequesstMapping("/url")用于聲明當前方法請求的url

    @Controller
    @RequestMapping("/test")
    public class TestController{
        @RequestMapping("/add")
        public void addTest(){
            System.out.println("add");
        }
        @RequestMapping("/list")
        public void listTest(){
            System.out.println("list");
        }
    }
    

3.3 前端頁面提交數(shù)據(jù)

3.3.1 表單提交

  • 表單提交:輸入框需要提供name屬性,SpringMVC控制器是通過name屬性取值的

    <body>
        <h3>TEST</h3>
        <form action="test/add" method="post">
            <p>名稱<input type="text" name="testName"/></p>
            <p>數(shù)字<input type="text" name="num"/></p>
            <p><input type="submit" value="提交"/></p>
        </form>
    </body>
    

3.3.2 URL提交

  • URL提交:<a href="test/add?testName=myTest"/>

3.3.3 AJAX提交

  • AJAX提交:請求行航罗、請求頭禀横、請求體都可以用來傳值

    <input type="button" value="ajax提交" id="btn"/>
    <script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
    <script type="text/javascript">
      $('#btn').click(function(){
            var obj = {};
            obj.TestName = "myTest";
            obj.num = 1.11; 
            
            $.ajax({
                url:"test/add?k1=aaa",  //請求行傳值
                type:"post",
                headers:{
                    key2:"bbb"  //請求頭傳值
                },
                contentType:"application/json",
                data:obj,    //請求體傳值
                success:function(res){
                    console.log(res);
                }
            });
        });
    </script>
    

3.4 控制器接收數(shù)據(jù)

3.4.1 接收請求行傳值

  • 表單提交
  • URL提交
  • $.ajax()請求的url傳值
  • .post()/.get()中的{}傳值

@RequestParam注解用于接收請求行傳遞的數(shù)據(jù),有以下三個參數(shù):

  • value:如果控制器中方法參數(shù)名與前端變量名一致粥血,則可以省略柏锄,否則需要設(shè)置value屬性指定前端變量名
  • required:該參數(shù)是否為必傳項。默認是true复亏,表示請求中一定要傳入對應的參數(shù)趾娃,否則會報404錯誤,如果設(shè)置為false時缔御,當請求中沒有此參數(shù)抬闷,將會默認為null,而對于基本數(shù)據(jù)類型的變量,則必須有值,這時會拋出空指針異常笤成。如果允許空值评架,則接口中變量需要使用包裝類來聲明。
  • defaultValue:參數(shù)的默認值炕泳,如果請求中沒有同名的參數(shù)時纵诞,該變量默認為此值。注意默認值可以使用SpEL表達式培遵,如"#{systemProperties[‘java.vm.version’]}"

3.4.2 請求頭傳值

  • ajax封裝請求頭數(shù)據(jù)

    $.ajax({
        ...,
        headers:{
        
      },
        ...
    })
    

@RequestHeader注解用于接收請求頭傳遞的數(shù)據(jù)

3.4.3 請求體傳值

  • ajax封裝請求體數(shù)據(jù)

    $.ajax({
        ...,
        data:{
        
      },
        ...
    })
    

@RequestBody注解用于接收請求體傳遞的數(shù)據(jù)

@RequestBody會將前端提交的JSON格式數(shù)據(jù)轉(zhuǎn)換成Java對象浙芙,它依賴于jackson包。在SSM下籽腕,需要手動導入jackson的依賴才能實現(xiàn)JSON對象的轉(zhuǎn)換茁裙,SpringBoot下則會默認導入jackson依賴

3.5 控制器響應數(shù)據(jù)

3.5.1 響應同步請求

同步請求:form表單、超鏈接

  • 處理同步請求的方法的返回類型為String或者ModelAndView节仿,以實現(xiàn)頁面的跳轉(zhuǎn)

    • String

      請求跳轉(zhuǎn)(轉(zhuǎn)發(fā)):

      @RequestMapping("/add")
      public void addTest(){
          return "/tips.jsp"; // '/'表示根路徑晤锥,如果不加則會在add下尋找tips.jsp文件
      }
      

      重定向:

      @RequestMapping("/add")
      public void addTest(){
          return "redirect:/tips.jsp";
      }
      
    • ModelAndView

      請求跳轉(zhuǎn):

      @RequestMapping("/add")
      public void addTest(){
          ModelAndView modelAndView = new ModelAndView("/tips.jsp");
          return modelAndView;
      }
      

      重定向:

      @RequestMapping("/add")
      public void addTest(){
          ModelAndView modelAndView = new ModelAndView("redirect:/tips.jsp");
          return modelAndView;
      }
      
  • 同步請求傳值

    只有轉(zhuǎn)發(fā)響應才能傳值,重定向不能傳值廊宪。

    • String:

      //1.在控制器方法中定義一個Model類型的參數(shù)
      //2.在return頁面之前矾瘾,向model中添加鍵值對,添加的鍵值對就會被傳遞到轉(zhuǎn)發(fā)的頁面
      @RequestMapping("/add")
      public void addTest(Model model){
          model.addAttribute("key","value");
          return "/tips.jsp"; 
      }
      //除了使用Model對象傳值外箭启,還可以直接使用HttpServletRequest對象
      @RequestMapping("/add")
      public void addTest(HttpServletRequest request){
          request.setAttribute("key","value");
          return "/tips.jsp"; 
      }
      
    • ModelAndView

      @RequestMapping("/add")
      public void addTest(){
          ModelAndView modelAndView = new ModelAndView("/tips.jsp");
          modelAndView.addObject("key","value");
          return modelAndView;
      }
      

3.5.2 響應異步請求(AJAX)

使用response中的輸出流進行響應

  • 控制器方法的返回類型為void
  • 控制器方法添加HttpServletResponse response參數(shù)
  • 在方法中通過response獲取輸出流壕翩,使用流響應ajax請求
@RequestMapping("/list")
public void listTest(HttpServletResponse response) throws IOException {
    Test test = new Test();
    //使用ObjectMapper將對象轉(zhuǎn)換成JSON格式字符串
    String s = new ObjectMapper().writeValueAsString(test);
    
    response.setCharacterEncoding("utf-8");
    response.setContentType("application/json");
    
    PrintWriter out = response.getWriter();
    out.print(s);
    out.flush();
    out.close();
}

直接在控制器方法返回響應的對象:

  • 控制器方法的返回類型設(shè)置為響應給ajax請求的對象類型
  • 在控制器方法前添加@ResponseBody注解,將返回的對象轉(zhuǎn)換成JSON響應給ajax請求
  • 如果一個類中所有方法都響應ajax請求傅寡,則可以將@ResponseBody注解添加到類上
@RequestMapping("/list")
@ResponseBody
public Test listTest(){
    Test test = new Test();
    return test;
}

3.6 解決中文亂碼問題

3.6.1前端編碼:

  • JSP頁面:

    <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
    
  • HTML頁面:

    <meta charset="UTF-8">
    

3.6.2 服務器編碼:

  • tomcat/conf/server.xml

    添加UTF-8

    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8"/>
    

3.6.3 設(shè)置SpringMVC的編碼方式

  • 在web.xml中配置SpringMVC編碼過濾器的編碼方式

    <filter>
      <filter-name>EncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharaterEncodingFilter</filter-class>
        <init-param>
          <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <init-param>
          <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
      <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末放妈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子荐操,更是在濱河造成了極大的恐慌芜抒,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件托启,死亡現(xiàn)場離奇詭異宅倒,居然都是意外死亡,警方通過查閱死者的電腦和手機屯耸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門拐迁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疗绣,你說我怎么就攤上這事线召。” “怎么了多矮?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵缓淹,是天一觀的道長。 經(jīng)常有香客問我,道長割卖,這世上最難降的妖魔是什么前酿? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮鹏溯,結(jié)果婚禮上罢维,老公的妹妹穿的比我還像新娘。我一直安慰自己丙挽,他們只是感情好肺孵,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著颜阐,像睡著了一般披粟。 火紅的嫁衣襯著肌膚如雪浑槽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音恭取,去河邊找鬼资铡。 笑死图仓,一個胖子當著我的面吹牛项炼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播李剖,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼芒率,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了篙顺?” 一聲冷哼從身側(cè)響起偶芍,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎德玫,沒想到半個月后匪蟀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡化焕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年萄窜,在試婚紗的時候發(fā)現(xiàn)自己被綠了铃剔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撒桨。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖键兜,靈堂內(nèi)的尸體忽然破棺而出凤类,到底是詐尸還是另有隱情,我是刑警寧澤普气,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布谜疤,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏夷磕。R本人自食惡果不足惜履肃,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坐桩。 院中可真熱鬧尺棋,春花似錦、人聲如沸绵跷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碾局。三九已至荆残,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間净当,已是汗流浹背内斯。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留像啼,地道東北人嘿期。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像埋合,于是被迫代替她去往敵國和親备徐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 寫文章 一甚颂、SpringMVC基礎(chǔ)入門蜜猾,創(chuàng)建一個HelloWorld程序 1.首先,導入SpringMVC需要的j...
    刺繡蘭溪閱讀 555評論 0 0
  • 一振诬、SpringMVC簡介1.什么是MVCModel:數(shù)據(jù)模型View:視圖Controller:控制器 MVC是...
    青年心路閱讀 2,521評論 0 1
  • 1蹭睡、什么是MVC 2、什么是SpringMVC 3赶么、SpringMVC的特點 1肩豁、開發(fā)環(huán)境 2、創(chuàng)建maven工程...
    小茅同學閱讀 277評論 0 0
  • 三層架構(gòu) 和 MVC模型 三層架構(gòu):我們在Servlet 學習筆記講過辫呻,當前 Web 應用體系主要為 C/S架構(gòu) ...
    Whyn閱讀 529評論 0 0
  • springmvc學習筆記 學習springmvc框架原理 包括哪些組件: 前端控制器(中心) 處理器映射器(三大...
    羅志贇閱讀 1,173評論 0 51