1. 程式人生 > >SpringMVC 學習(二)——使用 @RequestMapping 對映請求

SpringMVC 學習(二)——使用 @RequestMapping 對映請求

Spring MVC 使用 @RequestMapping 註解控制器指定可 以 URL

在控制器的及方法定義處都可

@RequestMapping

義處:提供初求對映資訊。相於  WEB 用的根目

方法:提供分對映資訊。相義處 URL。若

義處 @RequestMapping方法處標記 URL

WEB 用的根目

DispatcherServlet 獲請求後,就通控制器上

@RequestMapping 提供的對映資訊求所對應理 方法。

 

 

使用 @RequestMapping 對映求示例

 

義處標記

@RequestMapping 限定了理 器可以理所有 URI /hello  求,它 WEB 容器部 署的根路徑

理器可以定多個理方法,理來 自/hello 下的

 

 

 

P404. RequestMapping_請求方式

對映求引數、求方法或

@RequestMapping 除了可以使用 URL 對映求外,

可以使用求方法、求引數及對映

@RequestMapping value method params heads  表示 URL求方法、求引數及的對映條 件,他系,合使用多個條件可讓請求對映 更加精化。

params headers支援簡單的表

param1: 表示求必包含名 param1 求引數

!param1: 表示求不能包含名 param1 求引數

param1 != value1: 表示求包含名 param1 求引數,但其不能 value1

{“param1=value1”,

“param2”}: 求必包含名 param1 param2  求引數,且 param1 引數的須為 value1

 

 

對映求引數、求方法或

 

P606. RequestMapping_Ant 路徑

Ant 源地址支援 3 匹配符

?匹配檔名中的一個字元

*匹配檔名中的任意字元

**** 匹配多路徑

@RequestMapping 支援 Ant 格的 URL

/user/*/createUser: 匹配

/user/aaa/createUser/user/bbb/createUser URL

/user/**/createUser: 匹配

/user/createUser/user/aaa/bbb/createUser URL

/user/createUser??: 匹配

/user/createUseraa/user/createUserbb URL

 

P707. RequestMapping_PathVariable註解

@PathVariable  對映 URL 定的佔位符

佔位符的 URL Spring3.0 新增的功能功能在

SpringMVC REST 進發程中具有里程碑的 意

@PathVariable 可以將 URL 中佔位符引數定到控 制器理方法的入參中URL 中的 {xxx} 佔位符可以通

@PathVariable("xxx") 定到操作方法的入參中。

 

 

REST

REST Representational State Transfer。(源)表現層態轉化。是目前 最流行的一件架。它結構清晰、符合準、易於理解、展方便,  所以正得到越來越多網站的採用

源(Resources:網上的一個體,或者是網上的一個具體資訊。它 可以是一段文字、一張圖片、一首歌曲、一之就是一個具體的存在。 可以用一個URI源定位符)指向它,每種資對應一個特定的 URI 。要 源,訪問它的URI就可以,因此 URI 為每一個源的獨一無二的識 別

現層Representation源具體呈出來的形式,叫做它的表現層

Representation。比如,文字可以用 txt 格式表,也可以用 HTML 格 式、XML 格式、JSON 格式表,甚至可以採用二制格式。

態轉化(State Transfer每發出一個求,就代表了客端和服器的一 次互動程。HTTP協議,是一個無狀態協議,即所有的狀都儲存在服器 端。因此,如果客端想要操作服器,必手段,器端

態轉State Transfer。而這種轉化是建立在表現層之上的,所以就是

現層態轉。具體,就是 HTTP 協議裡面,四個表示操作方式的

GETPOSTPUTDELETE。它別對應基本操作:GET 用來源,POST 用來新建源,PUT 用來更新源,DELETE 用來源。

 

示例:

/order/1  HTTP GET :得到 id = 1 order

/order/1  HTTP DELETE id = 1 order

/order/1  HTTP PUT更新id = 1 order

/order  HTTP POST新增 order

HiddenHttpMethodFilter瀏覽 form 只支援 GET

POST 求,而DELETEPUT method 並不支

Spring3.0 添加了一個過濾器,可以將轉換 為標準的 http 方法,使得支援 GETPOSTPUT

DELETE 求。

 

 

@PathVariable URL 佔位符到入參

 

佔位符的 URL Spring3.0 新增的功能功能在

SpringMVC REST 進發程中具有里程碑的 意

@PathVariable 可以將 URL 中佔位符引數定到控 制器理方法的入參中URL 中的 {xxx} 佔位符可以通@PathVariable("xxx") 定到操作方法的入參中。

 

 

 

程式碼示例:

helloWorld.java

package com.xuehj.springmvc.handler;

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;

/**
 * @program: SpringMVC
 * @description: TODO
 * @author: Mr.Xue
 * @create: 2018-12-24 09:36
 **/
@Controller
@RequestMapping("/view")
public class HelloWorld {
    /**
     * 1. 使用 @RequestMapping 註解來對映請求的 URL
     * 2. 返回值會通過檢視解析器解析為實際的物理檢視, 對於 InternalResourceViewResolver 檢視解析器,
     * 會做如下的解析:通過 prefix + returnVal + 字尾 這樣的方式得到實際的物理檢視, 然會做轉發操作
     * /WEB-INF/views/success.jsp
     *
     * @return
     */
    @RequestMapping("/helloworld")
    public String hello() {
        System.out.println("hello world");
        return "success.jsp";
    }

    /**
     * 常用: 使用 method 屬性來指定請求方式
     */
    @RequestMapping(value = "/testMethod", method = RequestMethod.POST)
    public String testMethod() {
        System.out.println("testMethod");
        return "success.jsp";
    }

    /**
     * 瞭解: 可以使用 params 和 headers 來更加精確的對映請求. params 和 headers 支援簡單的表示式.
     *
     * @return
     */
    @RequestMapping(value = "testParamsAndHeaders", params = {"username",
            "age!=10"}, headers = {"Accept-Language=en-US,zh;q=0.8"})
    public String testParamsAndHeaders() {
        System.out.println("testParamsAndHeaders");
        return "success.jsp";
    }

    @RequestMapping("/testAntPath/*/abc")
    public String testAntPath() {
        System.out.println("testAntPath");
        return "success.jsp";
    }

    /**
     * @param id
     * @return
     * @PathVariable 可以來對映 URL 中的佔位符到目標方法的引數中.
     */
    @RequestMapping("/testPathVariable/{id}")
    public String testPathVariable(@PathVariable("id") int id) {
        System.out.println("testPathVariable: " + id);
        return "../success.jsp";
    }

    /**
     * Rest 風格的 URL.
     * 以 CRUD 為例:
     * 新增: /order POST
     * 修改: /order/1 PUT update?id=1
     * 獲取: /order/1 GET get?id=1
     * 刪除: /order/1 DELETE delete?id=1
     * <p>
     * 如何傳送 PUT 請求和 DELETE 請求呢 ?
     * 1. 需要配置 HiddenHttpMethodFilter
     * 2. 需要傳送 POST 請求
     * 3. 需要在傳送 POST 請求時攜帶一個 name="_method" 的隱藏域, 值為 DELETE 或 PUT
     * <p>
     * 在 SpringMVC 的目標方法中如何得到 id 呢?
     * 使用 @PathVariable 註解
     */
    @RequestMapping(value = "/testRest/{id}", method = RequestMethod.GET)
    public String testRest(@PathVariable Integer id) {
        System.out.println("testRest GET: " + id);
        return "../success.jsp";
    }

    @RequestMapping(value = "/testRest", method = RequestMethod.POST)
    public String testRest() {
        System.out.println("testRest POST");
        return "success.jsp";
    }

    @RequestMapping(value = "/testRest/{id}", method = RequestMethod.DELETE)
    public String testRestDelete(@PathVariable Integer id) {
        System.out.println("testRest Delete: " + id);
        return "../success.jsp";
    }

    @RequestMapping(value = "/testRest/{id}", method = RequestMethod.PUT)
    public String testRestPut(@PathVariable Integer id) {
        System.out.println("testRest Put: " + id);
        return "../success.jsp";
    }

}

success.jsp

<%--
  Created by IntelliJ IDEA.
  User: 薛恆傑
  Date: 2018/12/24
  Time: 9:39
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"  isErrorPage="true"%>
<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <h1>Hello World</h1>
    </body>
</html>

dispatcher-servlet.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"
       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">

    <!-- 配置自定掃描的包 -->
    <context:component-scan base-package="com.xuehj.springmvc"/>

    <!-- 配置檢視解析器: 如何把 handler 方法返回值解析為實際的物理檢視 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--<property name="prefix" value="/view/"/>-->
        <!--<property name="suffix" value=".jsp"/>-->
        <property name="prefix" value=""/>
        <property name="suffix" value=""/>
    </bean>
</beans>

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">
    <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>

    <!--
	配置 org.springframework.web.filter.HiddenHttpMethodFilter: 可以把 POST 請求轉為 DELETE 或 PUT 請求
	-->
    <filter>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 配置 DispatcherServlet -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 配置 DispatcherServlet 的一個初始化引數: 配置 SpringMVC 配置檔案的位置和名稱 -->
        <!--
            實際上也可以不通過 contextConfigLocation 來配置 SpringMVC 的配置檔案, 而使用預設的.
            預設的配置檔案為: /WEB-INF/<servlet-name>-servlet.xml
        -->
        <!--
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

index.jsp

<%--
  Created by IntelliJ IDEA.
  User: 薛恆傑
  Date: 2018/12/24
  Time: 9:21
  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>
        <a href="view/helloworld">Hello world</a>

        <br><br>
        <a href="view/testMethod">testMethod</a>

        <br><br>
        <form method="post" action="${pageContext.request.contextPath}/view/testMethod">
            <input type="submit" value="提交"/>
        </form>

        <br><br>
        <a href="view/testParamsAndHeaders">Test ParamsAndHeaders</a>

        <br><br>
        <a href="view/testAntPath/ddd/abc">Test AntPath</a>

        <br><br>
        <a href="view/testPathVariable/1">Test PathVariable</a>

        <br><br>
        <a href="view/testRest/1">Test Rest Get</a>

        <br><br>
        <form action="view/testRest" method="post">
            <input type="submit" value="TestRest POST"/>
        </form>

        <br><br>
        <form action="view/testRest/1" method="post">
            <input type="hidden" name="_method" value="DELETE"/>
            <input type="submit" value="TestRest DELETE"/>
        </form>

        <br><br>
        <form action="view/testRest/1" method="post">
            <input type="hidden" name="_method" value="PUT"/>
            <input type="submit" value="TestRest PUT"/>
        </form>

    </body>
</html>