SpringMVC

SpringMVC

一、概述

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

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

1.1 SpringMVC優(yōu)勢

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

1.2 SpringMVC本質(zhì)工作

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

二、部署

2.1 創(chuàng)建web工程

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

2.2 添加依賴

添加所需對應(yīng)的依賴

  • 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>
    <!--當(dāng)值為0或者大于0時,代表容器啟動時加載該servlet。正數(shù)的值越小,啟動時加載該servlet的優(yōu)先級越高。如果為負(fù)數(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的請求,都將其當(dāng)作控制器類的請求路徑處理

/ 表示攔截除.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)建相應(yīng)的類

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

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

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

3.2 定義處理請求的方法

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

  • 在每個方法上添加@RequesstMapping("/url")用于聲明當(dāng)前方法請求的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ù)是否為必傳項(xiàng)。默認(rèn)是true,表示請求中一定要傳入對應(yīng)的參數(shù),否則會報404錯誤,如果設(shè)置為false時,當(dāng)請求中沒有此參數(shù),將會默認(rèn)為null,而對于基本數(shù)據(jù)類型的變量,則必須有值,這時會拋出空指針異常。如果允許空值,則接口中變量需要使用包裝類來聲明。
  • defaultValue:參數(shù)的默認(rèn)值,如果請求中沒有同名的參數(shù)時,該變量默認(rèn)為此值。注意默認(rèn)值可以使用SpEL表達(dá)式,如"#{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下,需要手動導(dǎo)入jackson的依賴才能實(shí)現(xiàn)JSON對象的轉(zhuǎn)換,SpringBoot下則會默認(rèn)導(dǎo)入jackson依賴

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

3.5.1 響應(yīng)同步請求

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

  • 處理同步請求的方法的返回類型為String或者M(jìn)odelAndView,以實(shí)現(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ā)響應(yīng)才能傳值,重定向不能傳值。

    • 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 響應(yīng)異步請求(AJAX)

使用response中的輸出流進(jìn)行響應(yīng)

  • 控制器方法的返回類型為void
  • 控制器方法添加HttpServletResponse response參數(shù)
  • 在方法中通過response獲取輸出流,使用流響應(yīng)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();
}

直接在控制器方法返回響應(yīng)的對象:

  • 控制器方法的返回類型設(shè)置為響應(yīng)給ajax請求的對象類型
  • 在控制器方法前添加@ResponseBody注解,將返回的對象轉(zhuǎn)換成JSON響應(yīng)給ajax請求
  • 如果一個類中所有方法都響應(yīng)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 服務(wù)器編碼:

  • 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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容