1. 程式人生 > >springMVC的一個controller方法怎麼處理多個請求地址

springMVC的一個controller方法怎麼處理多個請求地址

寫這篇部落格的想法是前一陣子在csdn的問答中遇到有人問這個問題(傳送門:http://ask.csdn.net/questions/382662),當時我也很懵逼,因為確實沒有具體研究過,所以趁這次機會記錄一下,如果有什麼不對滴,請大家多多斧正,始めましょう。。。

先放程式碼

/**
 * Created by xyc on 2017/5/14 0014.
 */
@Controller
@RequestMapping("/path")
public class PathController {
    /**
     * 測試發現/methodA/{param1}/{param2}可以通過,/methodA/{param1}則報錯
     * @param
param1 * @param param2 * @return */
@ResponseBody @GetMapping(value={"/methodA/{param1}","/methodA/{param1}/{param2}"}) public String methodA(@PathVariable("param1") Integer param1,@PathVariable("param2") Integer param2){ return "methodA success:param1="+param1+",param2="
+param2; } /** * 測試發現/methodB/{param1}/{param2}和/methodB/{param1}都可以通過 * @param param1 * @param param2 * @return */ @ResponseBody @GetMapping(value={"/methodB/{param1}","/methodB/{param1}/{param2}"}) public String methodB(@PathVariable(value = "param1",required = true
) Integer param1,@PathVariable(value = "param2",required = false) Integer param2){ return "methodB success:param1="+param1+",param2="+param2; } /** * 測試發現/methodC/{param1}/{param2}可以通過,/methodC/{param1}則報錯 * @param param1 * @param param2 * @return */ @ResponseBody @GetMapping(value="/methodC/{param1}/{param2}") public String methodC(@PathVariable(value = "param1",required = false) Integer param1,@PathVariable(value = "param2",required = false) Integer param2){ return "methodC success:param1="+param1+",param2="+param2; } /** * 測試發現/methodD/{param1}/{param2}可以通過,/methodD/{param1}則報錯 * @param param1 * @param param2 * @return */ @ResponseBody @GetMapping(value="/methodD/{param1}/{param2}") public String methodD(@PathVariable(value = "param1",required = true) Integer param1,@PathVariable(value = "param2",required = false) Integer param2){ return "methodD success:param1="+param1+",param2="+param2; } /** * 測試發現/methodE/{param1}/{param2}/suffix可以通過,/methodC/{param1}/suffix和/methodC/suffix則報錯 * @param param1 * @param param2 * @return */ @ResponseBody @GetMapping(value="/methodE/{param1}/{param2}/suffix") public String methodE(@PathVariable(value = "param1",required = false) Integer param1,@PathVariable(value = "param2",required = false) Integer param2){ return "methodE success:param1="+param1+",param2="+param2; } /** * 測試發現/methodF/{param1}/{param2}/suffix可以通過,/methodD/{param1}/suffix和/methodD/suffix則報錯 * @param param1 * @param param2 * @return */ @ResponseBody @GetMapping(value="/methodF/{param1}/{param2}/suffix") public String methodF(@PathVariable(value = "param1",required = true) Integer param1,@PathVariable(value = "param2",required = false) Integer param2){ return "methodF success:param1="+param1+",param2="+param2; } }

好,這篇部落格就到這裡,大家下次見……

哈哈,開個小玩謔,接下來解釋一下(背景音藥走起,動詞大慈…),first,讓我們看一下methodA和methodB

  • 對於methodA,我的註釋已經寫了,/methodA/{param1}/{param2}可以通過,/methodA/{param1}則報錯,因為@PathVariable的required預設值是true(這裡注意不要把required預設值誤以為是false),所以理所當然你的param1和param2都要提供,不然就報錯;
  • 對於methodB,我通過將param1設定為必須,而param2設定為非必須,那麼我就可以通過判斷有木有param2來對映路徑,所以/methodB/{param1}/{param2}和/methodB/{param1}都可以通過;當然你如果把param1和param2都設定為非必須的捏,其實這種情況和methodB產生的結果一毛一樣;

剛開始測試完methodA和methodB後我就想/method/{param1}/{param2}其實是隱含包括/method/{param1}的,就是param2不輸入唄,但是測試了methodC和methodD後我發現我被打臉了(難道我滴想法不對麼)

  • 如methodC所示,我只提供了/methodC/{param1}/{param2}這一種匹配路徑,同時將param1和param2都設定為非必須,然後測試發現/methodC/{param1}/{param2}可以通過,/methodC/{param1}則報錯,本來按照我的想法/methodC/{param1}報錯是可以理解的,因為在param1和param2都可以為空的情況下你只傳一個引數,他不知道這到底是param1還是param2,但是按照順序來講的話,如果你的引數緊接著methodC,例如methodC/1的話,那麼他就代表著1會匹配param1,因為param1也是緊接著methodC,當然沒有methodC//1這種寫法,不然的話1可能會匹配param2,呵呵呵…
  • mehtodD也沒什麼好講的,因為它的結果和methodC一樣,儘管它的param1是必須,而param2是非必須,然鵝這並沒有什麼卵用,看來還是param1太寂寞了,沒有param2就不行;

接下來我又開始開腦洞,是不是給匹配路徑加一個字尾就好了,因為在我的想法中字尾起到一個定位功能,有了起點和終點,應該可以了吧,但是又一次被現實無情的打臉,methodE和methodF就不細講了。

本篇部落格的結論就是如果你想讓一個controller方法處理多個請求,那麼就按methodB的套路來,不要想太多,如果部落格有什麼錯誤的地方,歡迎請大家指正……

相關推薦

springMVC一個controller方法怎麼處理請求地址

寫這篇部落格的想法是前一陣子在csdn的問答中遇到有人問這個問題(傳送門:http://ask.csdn.net/questions/382662),當時我也很懵逼,因為確實沒有具體研究過,所以趁這次機會記錄一下,如果有什麼不對滴,請大家多多斧正,始めまし

一個Servlet中處理請求方法

1. 在一個Servlet中可以有多個請求處理方法! 2. 客戶端傳送請求時,必須多給出一個引數,用來說明要呼叫的方法   請求處理方法的簽名必須與service相同,即返回值和引數,以及宣告的異常都

一個servlet處理請求方法

對象 ini repl 反射機制 https ssl 銷毀 vax pla 實現思路 1.進行全局掃描:將項目下所標識有註解的方法進行收集和解析(註意:掃描是一個 非常消耗性能的操作,這種操作應該只需要進行一次 2.進行類的解析 目的:找到哪

Servlet做Controller,實現一個處理請求

        傳統的Servlet都是一個請求對應一個Servlet。        例子如下:請求:http://localhost:8080/ServletTest/Loginweb.xml配置: <servlet> <servlet-name>Regist</serv

Servlet(五):一個Servlet處理請求

catch onu servlet容器 -name 浪費 根據 head 重復 vat 一、為什麽要使用一個Servlet來處理多個請求? 當瀏覽器發送了一次請求到服務器時,servlet容器會根據請求的url-pattern找到對應的Servlet類,執行對應的doPos

處理請求

AR spa .get cat host weight true serve exceptio /** * 連接好多的客戶端 */ public void getManyCon(){ ServerSocket serverS

IIS是怎麼處理請求的?

  一,假設有一臺伺服器,它的IIS上部署有一個Web應用程式-S,可以通過瀏覽器或其他方式進行訪問。     假設有A、B、C三臺電腦同時訪問網站S,IIS接收到3個HTTP請求,然後分別為三個請求各建立一個執行緒。每個執行緒都有各自的執行緒棧,

IIS是怎麽處理請求的?

.com 部署 通過 .exe -i nbsp 網站程序 用戶 .cn 一,假設有一臺服務器,它的IIS上部署有一個Web應用程序-S,可以通過瀏覽器或其他方式進行訪問。 假設有A、B、C三臺電腦同時訪問網站S,IIS接收到3個HTTP請求,然後分別為三個請求各

Servlet容器如何同時來處理請求

工作者執行緒Work Thread:執行程式碼的一組執行緒排程執行緒Dispatcher Thread:每個執行緒都具有分配給它的執行緒優先順序,執行緒是根據優先順序排程執行的Servlet採用多執行緒來處理多個請求同時訪問。servlet依賴於一個執行緒池來服務請求。執行緒池實際上是一系列的工作者執行緒集合

實現一個controller上整合controller

這是我在做專案時遇到的一個問題,想到了以下兩個方法。 一、自定製UITabBar 1.自定製UITabBar必須建立一個UITabBarController的子類,如 @interface MainTabBarViewController :UITabBarContro

SpringMVC 對映器Mapping【請求交給同一個Action】,不經過action直接跳轉到介面

1) org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping(核心) 將程式設計師定義的Action所對應的<bean

如果優雅地處理請求並在請求結束後統一處理

如何優雅地處理多個請求並在請求結束後統一處理 前不久我接到一個需求,首頁更新的資料是從3個介面獲取的,三個介面獲取到的資料後再重新整理介面,大家可以腦補X東,X寶的app首頁,螢幕從上到下,上面是banner區,用來展示促銷商品之類的廣告,中間是幾個按

http協議Connection:Keep-alive 是怎麼用,一次連線可以處理請求?

1. 在HTTP1.0中,沒有正式規定 Connection:Keep-alive 操作;在HTTP1.1中所有連線都是Keep-alive的,也就是預設都是持續連線的(Persistent Connection)。 2. 兩種的連線方式的區別如下圖所示 3.

vue中使用axios.all() 方法發起請求控制檯報錯的解決方法

今天在專案中使用axios時發現axios.all() 方法可以執行但是控制檯報錯,後來在論壇中看到是由於axios.all() 方法並沒有掛載到 axios物件上,需要我們手動去新增 == 只需要在

vue+axios 開發環境與生產環境配置請求介面,本地開發和線上開發有請求地址怎麼處理?上線後自動獲取ip,不需改請求地址可運用專案中

1. 配置本地開發環境介面: 進入到專案目錄config檔案中index.js ;當頁面有多個不同地址時此可以重定向,下圖中會出現報錯的就是路徑問題, 建立所有httpUrl介面請求。舉例後臺請求地址為:192.168.11.12:80/omc/login  ,第一個

Python 進階之原始碼分析:如何將一個方法變為方法

前一篇文章《Python 中如何實現引數化測試?》中,我提到了在 Python 中實現引數化測試的幾個庫,並留下一個問題: 它們是如何做到把一個方法變成多個方法,並且將每個方法與相應的引數繫結起來的呢? 我們再提煉一下,原問題等於是:在一個類中,如何使用裝飾器把一個類方法變成多個類方法(或者產生類似的效果

springMVC(5) springMVC一個controller方法

上面的例子都是實現Controller,實現handleRequest方法,我們想像struts2那樣一個action裡有多個方法怎麼辦? 可以繼承MultiActionController類,在類裡

vue解決一個方法同時傳送請求的問題

在專案開發過程中,讓人抓狂之一的問題就是一個點選事件,當快速點選的時候,它會重複傳送多個請求。這是不允許出現的。 但是怎麼解決這個問題呢? 一般處理方法,就是點選的時候,立刻將該按鈕disabled,這樣就可以避免重複傳送請求了。但是我發現這個有一個弊端,那就是: 前端精品教程:百度網盤下載 如果,該

springMVC一個Controller處理所有使用者請求的併發問題

有狀態和無狀態的物件基本概念:  有狀態物件(Stateful Bean),就是有例項變數的物件 ,可以儲存資料,是非執行緒安全的。一般是prototype scope。 無狀態物件(Stateless Bean),就是沒有例項變數的物件,不能儲存資料,是不變類,是執行緒安全的。一般是singleton s

vue解決一個方法同時傳送請求

在專案開發過程中,讓人抓狂之一的問題就是一個點選事件,當快速點選的時候,它會重複傳送多個請求。這是不允許出現的。 但是怎麼解決這個問題呢? 一般處理方法,就是點選的時候,立刻將該按鈕disabled,這樣就可以避免重複傳送請求了。但是我發現這個有一個弊端,那就是: 如果