1. 程式人生 > >springMVc @RequestMapping正則表示式模式的url

springMVc @RequestMapping正則表示式模式的url

   公司最近忙,好一些時間沒有寫了。今天寫一個springMVC的一個很普遍的知識。有時候大家可能會遇到如下問題;


@RequestMapping(method = RequestMethod.GET,value="/{provinceId}_{levelId}.htm")
    public Map<String, Appointment> test() {
        return appointmentBook.getAppointmentsForToday();
    }


@RequestMapping(method = RequestMethod.GET,value="/{provinceId}_{levelId}_s{id}.htm")
    public Map<String, Appointment> test1() {
        return appointmentBook.getAppointmentsForToday();
    }
如上兩個url,當我在瀏覽器上輸入/2_3_s1.htm(此處省略url前面的東西),老是進入第一個方法,而且你兩個方法的順序調換也是一樣的,總是進入第一個,其實問題不難看出來。其實第一個url就是包含了第一個的,/2_3_s1.htm的請求連結兩個方法都符合(相當於把3_s1看成了一個整體,所以說第一個方法也符合),至於為什麼進入第一個,應該是第一個url包含第二個,相當於是父子關係。
解決方法:
          將第一個方法改成如下
@RequestMapping(method = RequestMethod.GET,value="/{provinceId}_{levelId:\\d*}.htm")
    public Map<String, Appointment> test() {
        return appointmentBook.getAppointmentsForToday();
    }




就是在levelId後面加了\\d*,就是加了一個正則表示levelId只能匹配整數,這樣寫的話,我們之前的連結/2_3_s1.htm就會進入第二個方法,因為你把3_s1即使看成一個連結也不符合整數這個條件,所以就會進入第二個方法。
\\d{6}:表示6位數字
\\?-[0,9]d:表示負整數
[a-z]{3} :三位字母
等等
總的一句話就是可以用正則表示式解決上訴問題。

還有一個額外的知識點,有時候公司為了要求規範url,有時候一樣的方法,就是要寫出兩個url,這裡可以不用再寫兩個方法了,一個方法指定多個值如:@RequestMapping(value={"/foo","/bar"})