首頁 > 軟體

聊聊Controller中RequestMapping的作用

2022-02-22 13:02:05

Controller @RequestMapping作用

@RequestMapping是一個用來處理請求地址對映的註解,可用於類或者方法上。用於類上,表示類中的所有響應請求的方法都是以該地址作為父路徑。

@RequestMapping註解有六個屬性,下面進行詳細的說明。

1.value, method

  • value:指定請求的實際地址,指定的地址可以是URI Template模式。
  • method:指定請求的method型別,GET、POST、PUT、DELETE等。

2.consumes, produces

  • consumes:指定處理請求的提交內容型別(Content-Type),例如application/json,text/html。
  • produces:指定返回的內容型別,僅當request請求頭中的(Accept)型別中包含該指定型別才返回。

3.params, headers

  • params:指定request中必須包含某些引數值才讓該方法處理。
  • headers:指定request中必須包含某些指定的header值,才能讓該方法處理請求。

其實還可以簡單的認為這個註解就是使用在controller類上面的註解

如果在controller類上面新增了註解@RequestMapping("/product") ,然後又在方法上面加上了註解@RequestMapping("/findAll"),你的專案埠是8080,然後在存取的時候就是localhost:8080/product/findAll

Controller設定總結及RequestMapping說明

控制器Controller

  • 控制器負責提供存取應用程式的行為,通常通過介面定義或註解定義兩種方法實現。
  • 控制器負責解析使用者的請求並將其轉換為一個模型。
  • 在Spring MVC中一個控制器可以包含多個方法
  • 在Spring MVC中,對於Controller的設定方式有很多種

實現Controller介面

Controller是一個介面,在org.springframework.web.servlet.mvc包下,介面中只有一個方法

//實現該介面的類獲得控制器功能
public interface Controller {
   //處理請求且返回一個模型與檢視物件
   ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception;
}

測試

1.新建一個Moudle,springmvc-04-controller。

2.編寫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>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

3.編寫springmvc-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"
       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">
    <context:component-scan base-package="com.chen.controller"/>
    <mvc:annotation-driven/>
    <mvc:default-servlet-handler/>
    <!-- 檢視解析器: 模板引擎 Thymeleaf Freemarker -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 字首 -->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!-- 字尾 -->
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

4.編寫一個Controller類,ControllerTest1

package com.chen.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//只要實現了 Controller 介面的類,說明這就是一個控制器了
public class ControllerTest1 implements Controller {
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","ControllerTest1");
        mv.setViewName("test");
        return mv;
    }
}

編寫完畢後,去Spring組態檔中註冊請求的bean;name對應請求路徑,class對應處理該請求的類

<bean name="/test1" class="com.chen.controller.ControllerTest1"/>

編寫前端test.jsp,注意在WEB-INF/jsp目錄下編寫,對應我們的檢視解析器

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

設定Tomcat執行測試!

說明:

實現介面Controller定義控制器是較老的辦法

缺點是:一個控制器中只有一個方法,如果要多個方法則需要定義多個Controller;定義的方式比較麻煩

使用註解@Controller

@Controller註解型別用於宣告Spring類的範例是一個控制器。

Spring可以使用掃描機制來找到應用程式中所有基於註解的控制器類,為了保證Spring能找到你的控制器,需要在組態檔中宣告元件掃描。

<!-- 自動掃描指定的包,下面所有註解類交給IOC容器管理 -->
<context:component-scan base-package="com.chen.controller"/>

增加一個ControllerTest2類,使用註解實現;

// @Controller代表這個類會被Spring接管,被這個註解的類,中的所有方法,
// 如果返回值是String,並且有具體頁面可以跳轉,那麼就會被檢視解析器解析;
@Controller
public class ControllerTest2 {
    @RequestMapping("/test2")
    public String test1(Model model){
        model.addAttribute("msg","ControllerTest2");
        return "test";
    }
}

執行Tomcat測試

可以發現,我們的兩個請求都可以指向一個檢視,但是頁面的顯示結果是不也一樣的,從這裡可以看出檢視是被複用的,而控制器與檢視之間是弱耦合關係

RequestMapping說明

@RequestMapping

  • @RequestMapping註解用於對映url到控制器類或一個特定的處理程式方法。可用於類或方法上。用於類上,表示類中的所有響應請求的方法都是以該地址作為父路徑。

測試一

@Controller
public class ControllerTest3 {
    @RequestMapping("/t1")
    public String test(Model model){
        model.addAttribute("msg","ControllerTest3");
        return "test";
    }
}

存取路徑:http://localhost:8080 / 專案名 / t1

測試二

@Controller
@RequestMapping("/c3")
public class ControllerTest3 {
    @RequestMapping("/t1")
    public String test(Model model){
        model.addAttribute("msg","ControllerTest3");
        return "test";
    }
}

存取路徑:http://localhost:8080 / 專案名/ admin /h1 , 需要先指定類的路徑再指定方法的路徑;

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com