?今天是劉小愛自學(xué)Java的第127天。
感謝你的觀看,謝謝你。
今天的知識(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存在的問題
①問題一
映射器、適配器、處理器,視圖解析器,一堆的信息需要配置。
②問題二
看到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注解的使用
①配置注解
- 開啟注解掃描:這個(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)“*”不就像一只螞蟻么?大概這就是它名稱的由來。
①通配符:?
代表可以使用任意一個(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ù)被取出來。
使用注解@PathVariable
該注解可以獲取路徑中的字符作為參數(shù)
不過值得注意的是:
@PathVariable(“key”)中的key必須和對應(yīng)占位符中的參數(shù)名保持一致。
如果傳遞的參數(shù)類型和接受參數(shù)的形參類型不一致,則會(huì)自動(dòng)轉(zhuǎn)換。比如上圖年齡傳了“18”字符串,方法形參使用Integer來接受參數(shù)。
3限定請求方法的映射
這種方式就是可以限定方法的請求類型,比如我們只接受GET請求:
@RequestMapping(value=””,method=””)
使用RequestMethod.GET設(shè)定請求方式為GET請求,如果是POST請求就不行了。
我們點(diǎn)擊RequestMethod的源碼可以發(fā)現(xiàn),其一共有8種請求類型,都是以枚舉的形式存在,自己指定需要限制的請求方式即可。
4限定請求參數(shù)的映射
@RequestMapping(value=””,params=””)
和限定請求方法很像,就是將method換成了params,名稱都是見名知義的。
①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混合注解
@GetMapping:限定請求方式必須要為GET請求才行,就相當(dāng)于:@RequestMapping用method=RequestMethod.GET。
類似的注解還有@PostMapping、@PutMapping、@DeleteMapping。
值得注意的是:
上述例子中,①和②分開使用都可以達(dá)到效果,如果放在一起會(huì)報(bào)錯(cuò)。
三、接收數(shù)據(jù)及數(shù)據(jù)綁定
1接收servlet的內(nèi)置對象
常用的servlet對象一共有三個(gè):request,response,session。
這些對象的接收非常簡單,只需要在方法形參中有該對象就能接收,不需要任何配置。
2springMVC的Model對象
我們前面使用ModelAndView,每次都要new對象,既然學(xué)了spring,肯定能優(yōu)化。
springMVC的Model對象就是用來代替ModelAndView的:
- addAtrribute()就相當(dāng)于addObject()
- 返回字符串就相當(dāng)于設(shè)定ViewName的值。
注意:①和②不能放在一起聯(lián)合使用,我這邊只是做一個(gè)對比說明它們是一回事。
3接收普通的請求參數(shù)
也就是@RequestParam這個(gè)注解的使用,這個(gè)注解非常重要,使用起來也方便。
①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è)注解的使用
我們在使用瀏覽器的時(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è)贊,謝謝你。