SpringMVC基礎之一->簡單介紹及使用

一、什麼是MVC?

​ MVC是模型(Model)、視圖(View)、控制器(Controller)的簡寫,是一種軟件設計規範。就是將業務邏輯、數據、顯示分離的方法來組織代碼。MVC主要做用是下降了視圖與業務邏輯間的雙向偶合。MVC不是一種設計模式,MVC是一種架構模式。固然不一樣的MVC存在差別。html

Model(模型):數據模型,提供要展現的數據,所以包含數據和行爲,能夠認爲是領域模型或JavaBean組件(包含數據和行爲),不過如今通常都分離開來:Value Object(數據Dao) 和 服務層(行爲Service)。也就是模型提供了模型數據查詢和模型數據的狀態更新等功能,包括數據和業務。前端

View(視圖):負責進行模型的展現,通常就是咱們見到的用戶界面,客戶想看到的東西。java

Controller(控制器):接收用戶請求,委託給模型進行處理(狀態改變),處理完畢後把返回的模型數據返回給視圖,由視圖負責展現。 也就是說控制器作了個調度員的工做。web

​ 其實在最先期的時候還有model1和model2的設計模型
最典型的MVC就是JSP + servlet + javabean的模式。
image.pngspring

代碼展現:chrome

HelloServlet.java數據庫

package com.mashibing.controller;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String method = request.getParameter("method");
        if (method.equals("add")){
            request.getSession().setAttribute("msg","add");
        }else if(method.equals("sub")){
            request.getSession().setAttribute("msg","sub");
        }
        request.getRequestDispatcher("index.jsp").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

web.xml設計模式

<?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_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.mashibing.controller.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/user</url-pattern>
    </servlet-mapping>
</web-app>

index.jspspring-mvc

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  ${msg}
  </body>
</html>

輸入網址:http://localhost:8080/servlet...tomcat

二、SpringMVC

一、SpringMVC的介紹
Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, 「Spring Web MVC,」 comes from the name of its source module (spring-webmvc), but it is more commonly known as 「Spring MVC」.
Spring Web MVC是構建在Servlet API上的原始Web框架,從一開始就包含在Spring Framework中。 正式名稱 「Spring Web MVC,」 來自其源模塊(spring-webmvc)的名稱,但它一般被稱爲「Spring MVC」。

​ 簡而言之,springMVC是Spring框架的一部分,是基於java實現的一個輕量級web框架。

​ 學習SpringMVC框架最核心的就是DispatcherServlet的設計,掌握好DispatcherServlet是掌握SpringMVC的核心關鍵。

二、SpringMVC的優勢

​ 1.清晰的角色劃分:控制器(controller)、驗證器(validator)、命令對象(command obect)、表單對象(form object)、模型對象(model object)、Servlet分發器(DispatcherServlet)、處理器映射(handler mapping)、試圖解析器(view resoler)等等。每個角色均可以由一個專門的對象來實現。

​ 2.強大而直接的配置方式:將框架類和應用程序類都能做爲JavaBean配置,支持跨多個context的引用,例如,在web控制器中對業務對象和驗證器validator)的引用。
​ 3.可適配、非侵入:能夠根據不一樣的應用場景,選擇何事的控制器子類(simple型、command型、from型、wizard型、multi-action型或者自定義),而不是一個單一控制器(好比Action/ActionForm)繼承。
​ 4.可重用的業務代碼:可使用現有的業務對象做爲命令或表單對象,而不須要去擴展某個特定框架的基類。
​ 5.可定製的綁定(binding)和驗證(validation):好比將類型不匹配做爲應用級的驗證錯誤,這能夠保證錯誤的值。再好比本地化的日期和數字綁定等等。在其餘某些框架中,你只能使用字符串表單對象,須要手動解析它並轉換到業務對象。
​ 6.可定製的handler mapping和view resolution:Spring提供從最簡單的URL映射,到複雜的、專用的定製策略。與某些web MVC框架強制開發人員使用單一特定技術相比,Spring顯得更加靈活。
​ 7.靈活的model轉換:在Springweb框架中,使用基於Map的鍵/值對來達到輕易的與各類視圖技術集成。
​ 8.可定製的本地化和主題(theme)解析:支持在JSP中可選擇地使用Spring標籤庫、支持JSTL、支持Velocity(不須要額外的中間層)等等。
​ 9.簡單而強大的JSP標籤庫(Spring Tag Library):支持包括諸如數據綁定和主題(theme)之類的許多功能。他提供在標記方面的最大靈活性。
​ 10.JSP表單標籤庫:在Spring2.0中引入的表單標籤庫,使用在JSP編寫表單更加容易。
​ 11.Spring Bean的生命週期:能夠被限制在當前的HTTp Request或者HTTp Session。準確的說,這並不是Spring MVC框架自己特性,而應歸屬於Spring MVC使用的WebApplicationContext容器。

三、SpringMVC的實現原理

​ springmvc的mvc模式:
image.png

SpringMVC的具體執行流程:

​ 當發起請求時被前置的控制器攔截到請求,根據請求參數生成代理請求,找到請求對應的實際控制器,控制器處理請求,建立數據模型,訪問數據庫,將模型響應給中心控制器,控制器使用模型與視圖渲染視圖結果,將結果返回給中心控制器,再將結果返回給請求者。
image.png
一、DispatcherServlet表示前置控制器,是整個SpringMVC的控制中心。用戶發出請求,DispatcherServlet接收請求並攔截請求。
二、HandlerMapping爲處理器映射。DispatcherServlet調用HandlerMapping,HandlerMapping根據請求url查找Handler。
三、返回處理器執行鏈,根據url查找控制器,而且將解析後的信息傳遞給DispatcherServlet
四、HandlerAdapter表示處理器適配器,其按照特定的規則去執行Handler。
五、執行handler找到具體的處理器
六、Controller將具體的執行信息返回給HandlerAdapter,如ModelAndView。
七、HandlerAdapter將視圖邏輯名或模型傳遞給DispatcherServlet。
八、DispatcherServlet調用視圖解析器(ViewResolver)來解析HandlerAdapter傳遞的邏輯視圖名。
九、視圖解析器將解析的邏輯視圖名傳給DispatcherServlet。
十、DispatcherServlet根據視圖解析器解析的視圖結果,調用具體的視圖,進行試圖渲染
十一、將響應數據返回給客戶端

三、基於XML的Hello_SpringMVC

一、添加pom依賴

<dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
    </dependencies>

二、編寫web.xml文件

<?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_4_0.xsd"
         version="4.0">
    <!--配置DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--關聯springmvc的配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </init-param>
    </servlet>
    <!--匹配servlet的請求,/標識匹配全部請求-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--/*和/都是攔截全部請求,/會攔截的請求不包含*.jsp,而/*的範圍更大,還會攔截*.jsp這些請求-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

三、編寫springmvc須要的spring配置文件,applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--處理映射器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
    <!--處理器適配器-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>

    <!--視圖解析器-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--配置前綴-->
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <!--配置後綴-->
        <property name="suffix" value=".jsp"></property>
    </bean>

    <bean id="/hello" class="com.mashibing.controller.HelloController"></bean>
</beans>

四、HelloController.java

package com.mashibing.controller;


import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        //建立模型和視圖對象
        ModelAndView mv = new ModelAndView();
        //將須要的值傳遞到model中
        mv.addObject("msg","helloSpringMVC");
        //設置要跳轉的視圖,
        mv.setViewName("hello");
        return mv;
    }
}

五、建立hello.jsp頁面

<%--
  Created by IntelliJ IDEA.
  User: root
  Date: 2020/3/5
  Time: 20:25
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${msg}
</body>
</html>

六、配置tomcat,發送請求

http://localhost:8080/hello

四、基於註解的Hello_SpringMVC

一、添加pom依賴

<dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
    </dependencies>

二、編寫web.xml文件

<?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_4_0.xsd"
         version="4.0">
    <!--配置DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--
        關聯springmvc的配置文件
        -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </init-param>
    </servlet>
    <!--匹配servlet的請求,
    /:標識匹配全部請求,可是不會jsp頁面
    /*:攔截全部請求,攔截jsp頁面
    -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

三、編寫applicationContext.xml文件

<?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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--自動掃描包,由IOC容器進行控制管理-->
    <context:component-scan base-package="com.mashibing"></context:component-scan>
    <!-- 視圖解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          id="internalResourceViewResolver">
        <!-- 前綴 -->
        <property name="prefix" value="/WEB-INF/jsp/" />
        <!-- 後綴 -->
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

四、編寫HelloController.java

package com.mashibing.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController{
    /*
    * @RequestMapping就是用來標識此方法用來處理什麼請求,其中的/能夠取消
    * 取消後默認也是從當前項目的根目錄開始查找,通常在編寫的時候看我的習慣
    * 同時,@RequestMapping也能夠用來加在類上,
    * */
    @RequestMapping("/hello")
    public String hello(Model model){
        model.addAttribute("msg","hello,SpringMVC");
        return "hello";
    }
}

五、編寫hello.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${msg}
</body>
</html>

六、輸入請求http://localhost:8080/hello

五、注意細節

一、springmvc_helloworld運行流程:

​ 經過上述的代碼,咱們可以總結出具體的運行流程:

​ 一、客戶端發送請求http://localhost:8080/hello

​ 二、由tomcat接受到對應的請求

​ 三、SpringMVC的前端控制器DispatcherServlet接收到全部的請求

​ 四、查看請求地址和@RequestMapping註解的哪一個匹配,來找到具體的類的處理方法

​ 五、前端控制器找到目標處理類和方法以後,執行目標方法

​ 六、方法執行完成以後會有一個返回值,SpringMVC會將這個返回值用視圖解析器進行解析拼接成完整的頁面地址

​ 七、DispatcherServlet拿到頁面地址以後,轉發到具體的頁面

二、springmvc的配置文件

web.xml

<?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_4_0.xsd"
         version="4.0">
    <!--配置DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--
        關聯springmvc的配置文件
        此配置文件的屬性能夠不添加,可是須要在WEB-INF的目錄下建立 前端控制器名稱-servlet.xml文件
        -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>
三、DispatcherServlet的url-pattern

web.xml

<?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_4_0.xsd"
         version="4.0">
    <!--配置DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--
        關聯springmvc的配置文件
        此配置文件的屬性能夠不添加,可是須要在WEB-INF的目錄下建立 前端控制器名稱-servlet.xml文件
        -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </init-param>
    </servlet>
    <!--匹配servlet的請求,
    /:標識匹配全部請求,可是不會jsp頁面
    /*:攔截全部請求,攔截jsp頁面

     可是須要注意的是,當配置成index.html的時候,會發現請求不到
     緣由在於,tomcat下也有一個web.xml文件,全部的項目下web.xml文件都須要繼承此web.xml
     在服務器的web.xml文件中有一個DefaultServlet用來處理靜態資源,可是url-pattern是/
     而咱們在本身的配置文件中若是添加了url-pattern=/會覆蓋父類中的url-pattern,此時在請求的時候
     DispatcherServlet會去controller中作匹配,找不到則直接報404
     而在服務器的web.xml文件中包含了一個JspServlet的處理,因此不過攔截jsp請求
    -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>
四、@RequestMapping

​ @RequestMapping用來匹配客戶端發送的請求,能夠在方法上使用,也能夠在類上使用。

​ 方法:表示用來匹配要處理的請求

​ 類上:表示爲當前類的全部方法的請求地址添加一個前置路徑,訪問的時候必需要添加此路徑

package com.mashibing.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/mashibing")
public class HelloController{

    /*
    * @RequestMapping就是用來標識此方法用來處理什麼請求,其中的/能夠取消
    * 取消後默認也是從當前項目的根目錄開始查找,通常在編寫的時候看我的習慣
    * 同時,@RequestMapping也能夠用來加在類上,
    * */
    @RequestMapping("/hello")
    public String hello(Model model){
        model.addAttribute("msg","hello,SpringMVC");
        return "hello";
    }
}

注意:在整個項目的不一樣方法上不能包含相同的@RequestMapping值

​ 除此之外,@RequestMapping註解還能夠添加不少額外的屬性值,用來精確匹配請求

package com.mashibing.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/mashibing")
public class HelloController{

    /*
    * @RequestMapping就是用來標識此方法用來處理什麼請求,其中的/能夠取消
    * 取消後默認也是從當前項目的根目錄開始查找,通常在編寫的時候看我的習慣
    * 同時,@RequestMapping也能夠用來加在類上,
    * */
    @RequestMapping("/hello")
    public String hello(Model model){
        model.addAttribute("msg","hello,SpringMVC");
        return "hello";
    }

    /**
     * Request的其餘屬性值
     *  value:要匹配的請求
     *  method:限制發送請求的方式: POST GET
     *  params:表示請求要接受的參數,若是定義了這個屬性,那麼發送的時候必需要添加參數
     *         params有幾種匹配規則
     *          一、直接寫參數的名稱,param1,param2
     *              params = {"username"}
     *          二、表示請求不能包含的參數,!param1
     *              params = {"!username"}
     *          三、表示請求中須要要包含的參數可是能夠限制值 param1=values  param1!=value
     *              params = {"username=123","age"}
     *              params = {"username!=123","age"}
     *  headers:填寫請求頭信息
     *          chrome:User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36
     *          firefox:User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0
     *
     *  consumers:只接受內容類型是哪一種的請求,至關於指定Content-Type
     *  produces:返回的內容類型 Content-Type:text/html;charset=utf-8
     *
     * @return
     */
    @RequestMapping(value = "/hello2",method = RequestMethod.POST)
    public String hello2(){
        return "hello";
    }

    @RequestMapping(value = "/hello3",params = {"username!=123","age"})
    public String hello3(String username){
        System.out.println(username);
        return "hello";
    }

    @RequestMapping(value = "/hello4",headers = {"User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0"})
    public String hello4(){
        return "hello";
    }
}

​ @RequestMapping還包含了不少複雜的匹配功能,提供了通配符的支持:

package com.mashibing.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/mashibing")
public class HelloController{

    /*
    * @RequestMapping就是用來標識此方法用來處理什麼請求,其中的/能夠取消
    * 取消後默認也是從當前項目的根目錄開始查找,通常在編寫的時候看我的習慣
    * 同時,@RequestMapping也能夠用來加在類上,
    * */
    @RequestMapping("/hello")
    public String hello(Model model){
        model.addAttribute("msg","hello,SpringMVC");
        return "hello";
    }

    /**
     * Request的其餘屬性值
     *  value:要匹配的請求
     *  method:限制發送請求的方式: POST GET
     *  params:表示請求要接受的參數,若是定義了這個屬性,那麼發送的時候必需要添加參數
     *         params有幾種匹配規則
     *          一、直接寫參數的名稱,param1,param2
     *              params = {"username"}
     *          二、表示請求不能包含的參數,!param1
     *              params = {"!username"}
     *          三、表示請求中須要要包含的參數可是能夠限制值 param1=values  param1!=value
     *              params = {"username=123","age"}
     *              params = {"username!=123","age"}
     *  headers:填寫請求頭信息
     *          chrome:User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36
     *          firefox:User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0
     *
     *  consumers:只接受內容類型是哪一種的請求,至關於指定Content-Type
     *  produces:返回的內容類型 Content-Type:text/html;charset=utf-8
     *
     * @return
     */
    @RequestMapping(value = "/hello2",method = RequestMethod.POST)
    public String hello2(){
        return "hello";
    }

    @RequestMapping(value = "/hello3",params = {"username!=123","age"})
    public String hello3(String username){
        System.out.println(username);
        return "hello";
    }

    @RequestMapping(value = "/hello4",headers = {"User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0"})
    public String hello4(){
        return "hello";
    }

    /**
     * @Request包含三種模糊匹配的方式,分別是:
     *  ?:能替代任意一個字符
     *  *: 能替代任意多個字符和一層路徑
     *  **:能代替多層路徑
     * @return
     */
    @RequestMapping(value = "/**/h*llo?")
    public String hello5(){
        System.out.println("hello5");
        return "hello";
    }
}

六、@PathVariable

​ 若是須要在請求路徑中的參數像做爲參數應該怎麼使用呢?可使用@PathVariable註解,此註解就是提供了對佔位符URL的支持,就是將URL中佔位符參數綁定到控制器處理方法的參數中。

package com.mashibing.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/mashibing")
public class HelloController{

    @RequestMapping(value = "/pathVariable/{name}")
    public String pathVariable(@PathVariable("name") String name){
        System.out.println(name);
        return "hello";
    }
}

七、REST

​ REST即表述性狀態傳遞(英文:Representational State Transfer,簡稱REST)是Roy Fielding博士在2000年他的博士論文中提出來的一種軟件架構風格。它是一種針對網絡應用的設計和開發方式,能夠下降開發的複雜性,提升系統的可伸縮性。

​ 在三種主流的Web服務實現方案中,由於REST模式的Web服務與複雜的SOAPXML-RPC對比來說明顯的更加簡潔,愈來愈多的web服務開始採用REST風格設計和實現。例如,Amazon.com提供接近REST風格的Web服務進行圖書查找;雅虎提供的Web服務也是REST風格的。

​ REST,翻譯過來叫作表現層狀態轉化,是目前最流行的一個互聯網軟件架構,它架構清晰,符合標準,易於理解,擴展方便。

表現層(Representation):把資源具體呈現出來的形式,所以叫作表現層。

資源(Resource):網絡上的一個具體信息,文本,圖片,音頻,視頻均可以稱之爲資源,若是想要訪問到互聯網上的某一個資源,那麼就必需要使用一個URL來惟一性的獲取改資源,也能夠這麼說,URL是每個資源的惟一標識符。

狀態轉化(State Transfer):當客戶端發出一個請求的時候,就表明客戶端跟服務端的一次交互過程,HTTP是一種無狀態協議,即全部的狀態都保存在服務器端,所以,客戶端若是想要操做服務器,必須經過某些手段,讓服務器的狀態發生轉化,而這種轉化是創建在表現層的,這就是名字的由來(非人話)

​ 人話:咱們在獲取資源的時候就是進行增刪改查的操做,若是是原來的架構風格,須要發送四個請求,分別是:

​ 查詢:localhost:8080/query?id=1

​ 增長:localhost:8080/insert

​ 刪除:localhost:8080/delete?id=1

​ 更新:localhost:8080/update?id=1

​ 按照此方式發送請求的時候比較麻煩,須要定義多種請求,而在HTTP協議中,有不一樣的發送請求的方式,分別是GET、POST、PUT、DELETE等,咱們若是能讓不一樣的請求方式表示不一樣的請求類型就能夠簡化咱們的查詢

​ GET:獲取資源 /book/1

​ POST:新建資源 /book

​ PUT:更新資源 /book/1

​ DELETE:刪除資源 /book/1

​ 一切看起來都很是美好,可是你們須要注意了,咱們在發送請求的時候只能發送post或者get,沒有辦法發送put和delete請求,那麼應該如何處理呢?下面開始進入代碼環節:

RestController.java

package com.mashibing.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Controller
public class RestController {

    @RequestMapping(value = "/user",method = RequestMethod.POST)
    public String add(){
        System.out.println("添加");
        return "success";
    }

    @RequestMapping(value = "/user/{id}",method = RequestMethod.DELETE)
    public String delete(@PathVariable("id") Integer id){
        System.out.println("刪除:"+id);
        return "success";
    }

    @RequestMapping(value = "/user/{id}",method = RequestMethod.PUT)
    public String update(@PathVariable("id") Integer id){
        System.out.println("更新:"+id);
        return "success";
    }

    @RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
    public String query(@PathVariable("id") Integer id){
        System.out.println("查詢:"+id);
        return "success";
    }
}

web.xml

<?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_4_0.xsd"
         version="4.0">
    <!--配置DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--
        關聯springmvc的配置文件:
        此配置文件的屬性能夠不添加,可是須要在WEB-INF的目錄下建立 前端控制器名稱-servlet.xml文件
        -->

        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
    </servlet>
    <!--匹配servlet的請求,
    /:標識匹配全部請求,可是不會jsp頁面
    /*:攔截全部請求,攔截jsp頁面

     可是須要注意的是,當配置成index.html的時候,會發現請求不到
     緣由在於,tomcat下也有一個web.xml文件,全部的項目下web.xml文件都須要繼承此web.xml
     在服務器的web.xml文件中有一個DefaultServlet用來處理靜態資源,可是url-pattern是/
     而咱們在本身的配置文件中若是添加了url-pattern=/會覆蓋父類中的url-pattern,此時在請求的時候
     DispatcherServlet會去controller中作匹配,找不到則直接報404
     而在服務器的web.xml文件中包含了一個JspServlet的處理,因此不過攔截jsp請求
    -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <filter>
        <filter-name>hiddenFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>hiddenFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

rest.jsp

<%--
  Created by IntelliJ IDEA.
  User: root
  Date: 2020/3/6
  Time: 23:01
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="/user" method="post">
        <input type="submit" value="增長">
    </form>
    <form action="/user/1" method="post">
        <input name="_method" value="delete" type="hidden">
        <input type="submit" value="刪除">
    </form>
    <form action="/user/1" method="post">
        <input name="_method" value="put" type="hidden">
        <input type="submit" value="修改">
    </form>
    <a href="/user/1">查詢</a><br/>
</body>
</html>

success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
666
</body>
</html>
相關文章
相關標籤/搜索