色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>數(shù)值算法/人工智能>

springMVC請(qǐng)求映射全面分析

大小:0.6 MB 人氣: 2017-10-11 需要積分:1
 在springMVC的控制器中,我們常使用@RequestMapping來完成我們的請(qǐng)求映射,我們可以在類定義上和方法定義上使用注解,其配置的路徑將為類中定義的所有方法的父路徑,如上篇實(shí)例中的/user(類)/hello(方法)。
  一般的,我們類定義上的路徑注解起到命名空間的作用,防止不同方法的路徑映射產(chǎn)生沖突,比如我在UserController和ArticleController下都定義了如下的方法:
  @RequestMapping(“l(fā)ist”) publicvoidlist(){ 。..。 }
  一個(gè)list映射路徑,這時(shí)候springMVC就不知道該將請(qǐng)求交給到哪個(gè)方法處理。當(dāng)然,我們也能在方法上進(jìn)行二級(jí)路徑配置區(qū)分:
  /*************UserController***********/@RequestMapping(“user/list”) publicvoidlist(){ 。..。 } /*************ArticleController***********/@RequestMapping(“article/list”) publicvoidlist(){ 。..。 }
  這樣就能有效防止沖突了,但如果我有很多個(gè)方法存在這樣的沖突,是否都要在每個(gè)方法加上前綴呢?這時(shí)候我們可以選擇在類路徑上注解@RequestMapping來對(duì)全體方法進(jìn)行區(qū)分。
  通過url進(jìn)行映射
  1. Ant風(fēng)格字符匹配
  除了標(biāo)準(zhǔn)的url外,@RequestMapping還支持Ant風(fēng)格字符,即”?”、”*”、”**”,其中
  1. “?”:匹配一個(gè)任意字符,如/user/a?,匹配user/aa,user/ab等路徑
  2. “*”:匹配任意字符串,如/user/a*,匹配/user下任意以a開頭的路徑如/user/abc,/user/aqw等
  3. “**“:匹配多級(jí)路徑字符串,如/user/**/list,匹配/user/user1/list,/user/1resu/list等
  在這里,需要注意的是當(dāng)*的 位置與 個(gè)數(shù)不同時(shí),*可以代表的 字符數(shù)有區(qū)別,看下面示例:
  @RequestMapping(“u1/*”)//只能匹配u1/a,u1/b,不能匹配u1/————即此時(shí)*表示一個(gè)或多個(gè)字符publicvoidtest(HttpServletResponse response) throwsIOException{ response.getWriter().print(“u1/*”); } @RequestMapping(“u1/**”)//能夠匹配u1/,u1/qq,u1/qq/ww,這里要特別注意的是,“**“能匹配零個(gè)而“*”不能publicvoidtest(HttpServletResponse response) throwsIOException{ response.getWriter().print(“u1/*”); } @RequestMapping(“u2/a*”)//能夠匹配u2/a,u2/ab,u2/aqqqq等————即此時(shí)*表示零個(gè)或零個(gè)以上字符publicvoidtest1(HttpServletResponse response) throwsIOException{ response.getWriter().print(“u2/a*”); }
  2. restful占位符匹配
  除了使用上面風(fēng)格,@RequestMapping還支持restful風(fēng)格占位符的形式,假如我們需要針對(duì)特定用戶查看其特定文章,restful風(fēng)格路徑匹配如下所示:
  @Controller//注解為控制器,通過spring容器掃描,會(huì)注冊(cè)為一個(gè)Bean@RequestMapping(“/user/{uid}”)//一級(jí)訪問路徑,對(duì)類中所有方法生效publicclassUserController{@RequestMapping(“article/{aid}”) publicString detail(@PathVariable(“uid”)Integer uid,@PathVariable(“aid”)Integer aid){ System.out.println( “查看id為”+ uid + “的用戶文章,且文章id為”+aid); return“someplace”; } }
  這里,如果我們想訪問用戶id為1,文章id為2的用戶文章,就可以訪問如下路徑:[項(xiàng)目根路徑]/user/1/article/2來完成。
  我們使用@PathVariable(“val”)來完成對(duì)應(yīng)路徑中{val}的資源請(qǐng)求,這里的兩個(gè)val名稱需一致,緊接著的方法入?yún)⒚秩我猓覀儎倓偸纠艘粋€(gè)多路徑參數(shù)綁定,假設(shè)只有一個(gè),如下也是合法的:
  @RequestMapping(“user/{uid}”) publicString detail(@PathVariable(“uid”)Integer notUid){//notUid名字也能成功綁定return“someplace”; }
  此外,如果我們?nèi)雲(yún)⒚趾蛈rl路徑資源名稱一致,則可以省略配置@PathVariable中的value值,如下實(shí)例也能正確綁定路徑資源到入?yún)?br />   @RequestMapping(“user/{uid}”) publicString detail(@PathVariable Integer uid){//notUid名字也能成功綁定return“someplace”; }
  3. 優(yōu)先匹配規(guī)則
  url還有如下兩個(gè)常見匹配準(zhǔn)則: 最長(zhǎng)最精確優(yōu)先匹配和 占位符優(yōu)先匹配
  1. 最長(zhǎng)最精確優(yōu)先匹配
  下面我們來看前一個(gè)匹配實(shí)例:
  @RequestMapping(“test/**”) publicvoidtest2(HttpServletResponse response) throwsIOException{ response.getWriter().print(“test/**”); } @RequestMapping(“test/*”) publicvoidtest3(HttpServletResponse response) throwsIOException{ response.getWriter().print(“test/*”); } @RequestMapping(“test/*/**”) publicvoidtest4(HttpServletResponse response) throwsIOException{ response.getWriter().print(“test/*/**”); } @RequestMapping(“test/*/*”) publicvoidtest5(HttpServletResponse response) throwsIOException{ response.getWriter().print(“test/*/*”); } @RequestMapping(“test/1/*”) publicvoidtest6(HttpServletResponse response) throwsIOException{ response.getWriter().print(“test/1/*”); } @RequestMapping(“test/1/2”) publicvoidtest7(HttpServletResponse response) throwsIOException{ response.getWriter().print(“test/1/2”); }
  直接看上面匹配會(huì)覺得很亂,我們直接看下面的測(cè)試:
  測(cè)試
  匹配結(jié)果
  test/a 匹配test/*而不匹配test/**(更精確優(yōu)先匹配)
  test/a/a/aa/a 匹配test/**而不匹配test/*/**,(在多層匹配中,**比***更精確)
  test/a/a 匹配test/*/*,因?yàn)?*/*比**精確
  test/1/a 匹配test/1/*,因?yàn)?1/*比/*/*精確
  test/1/2 匹配test/1/2,這是完全匹配
  2. 占位符優(yōu)先匹配原則
  占位符是指@PathVariable等路徑資源占位符,下面我們?cè)诳匆粋€(gè)實(shí)例
  @RequestMapping(“test/1/2”) publicvoidtest7(HttpServletResponse response) throwsIOException{ response.getWriter().print(“test/1/2”); } @RequestMapping(“test/1/{id}”) publicvoidtest8(HttpServletResponse response,@PathVariable Integer id ) throwsIOException{ response.getWriter().print(“test/1/(myId=)”+ id ); } @RequestMapping(“test/1/a”) publicvoidtest7(HttpServletResponse response) throwsIOException{ response.getWriter().print(“test/1/a”); }
  從上一個(gè)實(shí)例的所有路徑映射中,我們測(cè)試出test/1/2是最精確的。但我們根據(jù)添加了占位符映射,在游覽器輸入 test/1/2,此時(shí)游覽器返回 test/1/(myId=)2,即 占位符的優(yōu)先級(jí)比普通字符串的優(yōu)先級(jí)更高!但如果我們此時(shí)輸入 test/1/a。程序不會(huì)因?yàn)槲覀兊?在方法入?yún)⒅衖d映射為Integer類型而放棄匹配,占位符的優(yōu)先級(jí)依然比字符(串)a的優(yōu)先級(jí)高,但由于 “a”不能轉(zhuǎn)化為Integer類型,所以服務(wù)器會(huì)返回 400錯(cuò)誤
  通過HTTP其它請(qǐng)求資源映射
  除了使用url外,我們還能通過請(qǐng)求參數(shù)、請(qǐng)求方法、或請(qǐng)求頭進(jìn)行映射
  我們先看看@RequestMapping的完整屬性列表:
  屬性
  說明
  value 指定請(qǐng)求的實(shí)際地址, 比如 /action/info之類。
  method 指定請(qǐng)求的method類型, GET、POST、PUT、DELETE等
  consumes 指定處理請(qǐng)求的提交內(nèi)容類型(Content-Type),例如application/json, text/html;
  produces 指定返回的內(nèi)容類型,僅當(dāng)request請(qǐng)求頭中的(Accept)類型中包含該指定類型才返回
  params 指定request中必須包含某些參數(shù)值是,才讓該方法處理
  headers 指定request中必須包含某些指定的header值,才能讓該方法處理請(qǐng)求
  其中,consumes, produces使用content-type信息進(jìn)行過濾信息;headers中可以使用content-type進(jìn)行過濾和判斷。
  在前面的使用中,我們發(fā)現(xiàn)并沒有指定value屬性,直接在括號(hào)里輸入字符串也能向value屬性賦值,這是因?yàn)樵?a href='http://www.1cnz.cn/v/tag/852/' target='_blank' class='arckwlink_none'>java注解中不加其他屬性,直接賦值必定是針對(duì)注解的value成員,如果該注解沒有名為value的成員,則會(huì)報(bào)錯(cuò)
  下面我們先看幾個(gè)示例:
  示例1:vmethod,headers
  @RequestMapping(value = “testa”,method = RequestMethod.POST,headers = “content-type=text/*”)
  表示映射路徑為testa,請(qǐng)求方法必須為POST方法(如果我們用post發(fā)出請(qǐng)求,會(huì)返回錯(cuò)誤信息HTTP Status 405 - Request method ‘GET’ not supported),headers部分表示請(qǐng)求頭信息中必須包含等號(hào)后相應(yīng)部分內(nèi)容,*匹配任意字符串
  示例2:consumes
  @RequestMapping(value = “testb”, consumes=“application/json”)
  表示方法僅匹配request Content-Type為“application/json”類型的請(qǐng)求。
  示例3:produces
  @RequestMapping(value = “/testc”, produces=“application/json”)
  表示方法匹配的請(qǐng)求需要請(qǐng)求頭中Accept部分包含”application/json“,同時(shí)在響應(yīng)時(shí),會(huì)將返回內(nèi)容同時(shí)設(shè)置為”application/json‘’
  示例4:params
  @RequestMapping(value = “testd”,method = RequestMethod.GET,params = {“id1”,“id2”}) publicvoidtest12(HttpServletResponse response,Integer id1,Integer id2) throwsIOException{ response.getWriter().print(id1 + “——”+ id2); }
  示例表示入?yún)⑿璋瑓?shù)名為id1,id2的兩個(gè)參數(shù),這里如果我輸入:
  1. http://localhost:8080/springMVC/user/testd—-
  2. http://localhost:8080/springMVC/user/testd?id1=1—報(bào)404錯(cuò)誤
  3. ttp://localhost:8080/springMVC/user/testd?id1=1&id2=2—-返回1——2
  4. ttp://localhost:8080/springMVC/user/testd?id1=1&id2=2&id3=3—-返回1——2
  從以上我們可以看出,只有具有相應(yīng)參數(shù)的才能完成映射,且可以有除了params中要求以外的參數(shù),如id3。
  在params的常見映射規(guī)則如下:
  示例規(guī)則
  說明
  ”param1” 請(qǐng)求必須包含名為param1的參數(shù)
  “!param1” 請(qǐng)求中不能包含名為param1的參數(shù)
  “param1!=value1 請(qǐng)求中必須包含param1參數(shù),但其值不能為value1
  {“param1=value1”,”param2”} 請(qǐng)求中需要包含param1參數(shù)和param2參數(shù),且param1的值必須為value1
?

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?
      主站蜘蛛池模板: 在线观看精品视频看看播放| 果冻传媒2021精品在线观看| 午夜福利院电影| 久久综合老色鬼网站| 国产AV麻豆出品在线播放| 正在播放一区二区| 亚洲黄色在线播放| 日本最新在线不卡免费视频| 精品久久久亚洲精品中文字幕| 俄罗斯雏妓的BBB孩交| ewp系列虐杀在线视频| 伊人影院综合| 亚洲乱码国产一区三区| 偷拍 拍自 欧美色区| 日本一卡精品视频免费| 欧美区 bt| 久色视频网| 日本久久久久久久做爰片日本| 香蕉eeww99国产精品| 天天躁躁水汪汪人碰人| 一抽一出BGM免费3分钟| 亚洲精品一二三区-久久| 最近日本字幕MV免费观看在线| 在线高清电影理论片4399| vivoe另类| xxx在线播放| xxnx18日本| 国产亚洲精品在浅麻豆| 国产亚洲精品品视频在线| 伦理片在线线手机版韩国免费6| 久久黄色免费| 久久精品国产在热亚洲| 秋霞伦理手机在线看片| 日本人吃奶玩奶虐乳| 亚洲伊人精品综合在合线| 欲乱艳荡少寡妇全文免费| 菠萝菠萝蜜免费播放高清| 苍井空小公主qvod| 精品国产成人AV在线看| 麻豆AV久久AV盛宴AV| 欧美一道本一区二区三区|