【框架】127:幾個(gè)非常重要的注解

?今天是劉小愛自學(xué)Java的第127天。

感謝你的觀看,謝謝你。

image

今天的知識(shí)點(diǎn)有點(diǎn)多,有點(diǎn)記不過來了。

學(xué)習(xí)內(nèi)容安排如下:

  • 使用注解優(yōu)化昨天寫的springMVC入門程序。
  • 映射路徑各種風(fēng)格的學(xué)習(xí),也就對應(yīng)了注解@RequestMapping中的參數(shù)。
  • 各種類型的請求參數(shù)獲取。
  • 整篇都是圍繞著各種注解的使用,做個(gè)整合,以后那個(gè)忘了做個(gè)回顧。

一、注解簡化代碼

昨天寫了一個(gè)springMVC入門程序,將其運(yùn)行流程梳理了一遍,但是代碼編寫太麻煩了。

1存在的問題

image

①問題一

映射器、適配器、處理器,視圖解析器,一堆的信息需要配置。

②問題二

看到new關(guān)鍵字,就可以使用spring優(yōu)化,具體在文章第三節(jié)中有詳細(xì)說明。

一個(gè)處理器類只能處理一個(gè)請求,并且這個(gè)類還要在配置文件中配置。

這個(gè)問題我們以前學(xué)servlet的時(shí)候就遇到過,當(dāng)時(shí)我們是創(chuàng)建一個(gè)BaseServlet,再使用反射,讓其子類一個(gè)方法對應(yīng)一個(gè)請求。

這里的解決方式是使用注解。

2注解的使用

image

①配置注解

  • 開啟注解掃描:這個(gè)在學(xué)spring框架的時(shí)候就用過很多次了。
  • mvc注解驅(qū)動(dòng):這個(gè)就相當(dāng)于自動(dòng)配置映射器、適配器了。

②處理器類

@Controller:這個(gè)注解即相當(dāng)于將這個(gè)處理器類存放到了spring容器中。

@RequestMapping("/show"):在每個(gè)方法上使用這個(gè)注解就可以接受一個(gè)請求。

方法名我們可以自定義,有多個(gè)請求就可以創(chuàng)建多個(gè)對應(yīng)的方法。

我大膽地猜測一下,該注解的底層實(shí)現(xiàn)也是使用的反射,當(dāng)然目前就不做深入研究了。

其中:"/show"就對應(yīng)著訪問路徑,當(dāng)然在瀏覽器訪問時(shí)要在路徑后面加上.do。

二、不同風(fēng)格的映射路徑

一共有好幾種,依次說明。

1Ant風(fēng)格的映射

Ant也就是螞蟻的意思,符號(hào)“*”不就像一只螞蟻么?大概這就是它名稱的由來。

image

①通配符:?

代表可以使用任意一個(gè)字符。

例子中路徑配置的是“a?”,那么ab、ac、a加任意一個(gè)字符都可以訪問。

②通配符:*

代表了0個(gè)或者多個(gè)字符。

例子中路徑配置的是“a*”,那么abcdd、afa都可以訪問,甚至單獨(dú)的一個(gè)a也可以。

其中當(dāng)*單獨(dú)使用的時(shí)候只能配置一個(gè)或者多個(gè)的字符,0個(gè)就不行了。

**③通配符:****

代表了0個(gè)或者多個(gè)路徑。

例子中路徑配置的是“**”,那么隨便多個(gè)路徑都可以,沒有路徑也行。

其中當(dāng)*和其它字符一起使用時(shí)就不能多個(gè)路徑了,代表0或多個(gè)字符,和作用一樣。

2占位符的映射(restful風(fēng)格)

restful風(fēng)格厲害的地方在于:路徑中輸入的字符可以作為參數(shù)被取出來。

image

使用注解@PathVariable

該注解可以獲取路徑中的字符作為參數(shù)

不過值得注意的是

@PathVariable(“key”)中的key必須和對應(yīng)占位符中的參數(shù)名保持一致。

如果傳遞的參數(shù)類型和接受參數(shù)的形參類型不一致,則會(huì)自動(dòng)轉(zhuǎn)換。比如上圖年齡傳了“18”字符串,方法形參使用Integer來接受參數(shù)。

3限定請求方法的映射

這種方式就是可以限定方法的請求類型,比如我們只接受GET請求:

image

@RequestMapping(value=””,method=””)

使用RequestMethod.GET設(shè)定請求方式為GET請求,如果是POST請求就不行了。

我們點(diǎn)擊RequestMethod的源碼可以發(fā)現(xiàn),其一共有8種請求類型,都是以枚舉的形式存在,自己指定需要限制的請求方式即可。

4限定請求參數(shù)的映射

@RequestMapping(value=””,params=””)

和限定請求方法很像,就是將method換成了params,名稱都是見名知義的。

image

①params=”id”

請求參數(shù)中必須有id,如果沒有id會(huì)報(bào)錯(cuò)。

與之相反的是:如果params=”!id”表示請求參數(shù)中不能包含id,如果有id會(huì)報(bào)錯(cuò)。

②params=”id=1”

請求參數(shù)中id必須為1,如果不為1會(huì)報(bào)錯(cuò)。

與之相反的是:如果params=”id!=1”表示請求參數(shù)中id必須不為1,如果等于1會(huì)報(bào)錯(cuò)。

③params={“name”, ”age”}

請求參數(shù)中必須有name,age參數(shù),當(dāng)然有多余的其它參數(shù)也行,但這兩個(gè)必須要有。

5混合注解

image

@GetMapping:限定請求方式必須要為GET請求才行,就相當(dāng)于:@RequestMapping用method=RequestMethod.GET。

類似的注解還有@PostMapping、@PutMapping、@DeleteMapping。

值得注意的是

上述例子中,①和②分開使用都可以達(dá)到效果,如果放在一起會(huì)報(bào)錯(cuò)。

三、接收數(shù)據(jù)及數(shù)據(jù)綁定

1接收servlet的內(nèi)置對象

image

常用的servlet對象一共有三個(gè):request,response,session。

這些對象的接收非常簡單,只需要在方法形參中有該對象就能接收,不需要任何配置。

2springMVC的Model對象

我們前面使用ModelAndView,每次都要new對象,既然學(xué)了spring,肯定能優(yōu)化。

image

springMVC的Model對象就是用來代替ModelAndView的:

  • addAtrribute()就相當(dāng)于addObject()
  • 返回字符串就相當(dāng)于設(shè)定ViewName的值。

注意:①和②不能放在一起聯(lián)合使用,我這邊只是做一個(gè)對比說明它們是一回事。

3接收普通的請求參數(shù)

也就是@RequestParam這個(gè)注解的使用,這個(gè)注解非常重要,使用起來也方便。

image

①required=false

有false,自然是有true的。如果不寫的話,默認(rèn)就是ture,我這邊為了說明寫了false。

  • true:表示請求參數(shù)必須要有name,如果沒有就會(huì)報(bào)錯(cuò)。
  • false:表示請求參數(shù)可以沒有name,如果沒有就顯示null。

②defaultValue=""

看名稱就很好理解,這個(gè)是指定一個(gè)默認(rèn)值,如果不指定參數(shù)就用這個(gè)默認(rèn)值。

其中關(guān)于注解@PathVariable和其很類似,這個(gè)在rest風(fēng)格映射路徑中說明。

如果請求路徑中攜帶有參數(shù)可以使用注解@PathVariable,如果參數(shù)并不在請求路徑中(POST請求)可以使用@RequestParam。

4獲取cookie

@CookieValue這個(gè)注解的使用

image

我們在使用瀏覽器的時(shí)候,如果多次請求,請求參數(shù)中會(huì)存在一個(gè)cookie。

可以通過@CookieValue獲取cookie的值,其中其key為一個(gè)固定值JSESSIONID。

最后

還有幾種數(shù)據(jù)類型沒時(shí)間學(xué)了,比如實(shí)體類對象、集合這些。

我擦咧,一個(gè)知識(shí)點(diǎn)不能整合在一起有點(diǎn)難受,看來時(shí)間管理不行啊,得跟羅志祥學(xué)學(xué)了,真不知道他是怎么安排過來的。

謝謝你的觀看。

如果可以的話,麻煩幫忙點(diǎn)個(gè)贊,謝謝你。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。