SpringMVC加載控制與Postmand的使用和Rest風(fēng)格的引入及RestFul開(kāi)發(fā)全面詳解
前言
從繁到簡(jiǎn)是貫徹SSM學(xué)習(xí)過(guò)程的原始真解
一.bean的加載控制
在MVC的模式中,Spring控制著業(yè)務(wù)和功能的bean,SpringMVC控制著表現(xiàn)層的bean,因?yàn)楦髯缘淖饔貌煌?,我們要避免Spring加載到SpringMVC控制的bean,如何實(shí)現(xiàn)?
方式一:
設(shè)定Spring的包掃描范圍,排除表現(xiàn)層的bean所在的包
@ComponentScan({"com.yu7daily.service","com.yu7daily.dao"}) public class SpringConfig {...}
這樣寫(xiě)的好處是可以適配所有的數(shù)據(jù)層技術(shù)通用性強(qiáng),如果使用的是mybatis,他的自動(dòng)代理為我們生成了對(duì)象可以不用掃描dao層對(duì)應(yīng)的包
方式二:
按注解過(guò)濾掉bean,因?yàn)镾pringMVC的配置類上存在@Controller注解,通過(guò)設(shè)置來(lái)過(guò)濾掉這個(gè)注解所在的類即可
@ComponentScan(value="com.yu7daily", excludeFilters = @ComponentScan.Filter( type = FilterType.ANNOTATION, classes = Controller.class ) ) //設(shè)置spring配置類加載bean時(shí)的過(guò)濾規(guī)則,當(dāng)前要求排除掉表現(xiàn)層對(duì)應(yīng)的bean //excludeFilters屬性:排除掃描路徑中指定類別加載的bean //type屬性:設(shè)置排除規(guī)則,當(dāng)前使用按照bean定義時(shí)的注解類型進(jìn)行排除 //classes屬性:設(shè)置排除的具體注解類,當(dāng)前設(shè)置排除@Controller定義的bean
方式三:
將二者加載到同一個(gè)環(huán)境
二.容器加載
在web3.0中,提供了快速初始化web容器的方式——繼承AbstractDispatcherServletInitializer類并重寫(xiě)其方法
1.createServletApplicationContext()方法
創(chuàng)建Servlet容器時(shí),加載SpringMVC對(duì)應(yīng)的bean并放入WebApplicationContext對(duì)象范圍中,從而將WebApplicationContext的作用范圍提升至ServletContext范圍,即 整個(gè)web容器范圍
protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(SpringmvcConfig.class); return ctx; }
2.createRootApplicationContext()方法
創(chuàng)建servlet容器時(shí)需要加載非springMVC對(duì)應(yīng)的bean
protected WebApplicationContext createRootApplicationContext() { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(SpringConfig.class); return ctx; }
3.getServletMappings()方法
設(shè)定SpringNc對(duì)應(yīng)的請(qǐng)求映射路徑,設(shè)置為 / 后表示攔截所有請(qǐng)求,任意請(qǐng)求都將轉(zhuǎn)入到SpringMVC進(jìn)行處理
protected String[] getServletMappings() { return new String[]{"/"}; }
這樣每當(dāng)我們啟動(dòng)服務(wù)器時(shí),就會(huì)自動(dòng)生成Spring和SpringMVC的容器,簡(jiǎn)化開(kāi)發(fā)
上述不難發(fā)現(xiàn),都是通過(guò)指定配置文件名來(lái)完成容器的加載,存在一定的硬編碼問(wèn)題,于是Spring為我們提供了更簡(jiǎn)單的加載方式——繼承AbstractAnnotationConfigDispatcherServletInitializer即可
代碼量顯著減少,這種方式更值得使用!
三.PostMan的引入
一般向?yàn)g覽器發(fā)送get請(qǐng)求比較容易,但發(fā)送post請(qǐng)求我們得另寫(xiě)表單,發(fā)送ajax請(qǐng)求得另寫(xiě)JS代碼,十分麻煩,PostMan的誕生很好地解決了這一問(wèn)題
它主要是用來(lái)模擬各種HTTP請(qǐng)求的(如:get/post/delete/put…等等).,而且與瀏覽器的區(qū)別在于有的瀏覽器不能輸出Json格式,而Postman更直觀接口返回的結(jié)果
1.發(fā)送GET請(qǐng)求
1.首先寫(xiě)好表現(xiàn)層
@RequestMapping("/commonParam") @ResponseBody public String commonParam(String name ,int age){ System.out.println("傳遞的參數(shù)為 name ==> "+name); System.out.println("普通參數(shù)傳遞 age ==> "+age); return "Hello SpringMVC"; }
2.在PostMan中發(fā)送請(qǐng)求
3.在IDEA中接收到了Postman發(fā)送過(guò)來(lái)的請(qǐng)求
2.發(fā)送POST請(qǐng)求
由于POST請(qǐng)求的參數(shù)處于請(qǐng)求體內(nèi),所以在Postman中要選擇以body的形式發(fā)送
服務(wù)器端接受的數(shù)據(jù)如下:
3.中文亂碼問(wèn)題解決
當(dāng)我將“pyq”改為“懶羊羊”后發(fā)送請(qǐng)求則會(huì)出現(xiàn)中文亂碼問(wèn)題
按照以往的套路,是在web服務(wù)器中添加一個(gè)過(guò)濾器即可,而在SpringMVC中將過(guò)濾器寫(xiě)在配置類中即可
@Override protected Filter[] getServletFilters() { CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); return new Filter[]{filter}; //若要配置多個(gè)過(guò)濾器,在數(shù)組中添加即可 }
四.Rest風(fēng)格
1.REST簡(jiǎn)介
REST(Representational State Transfer),表現(xiàn)形式狀態(tài)轉(zhuǎn)換,它是一種軟件架構(gòu)風(fēng)格,按照這種風(fēng)格來(lái)訪問(wèn)資源則稱之為RESTful
當(dāng)我們想表示一個(gè)網(wǎng)絡(luò)資源的時(shí)候,可以使用兩種方式:
1.傳統(tǒng)風(fēng)格資源描述形式
http://localhost/user/getById?id=1 查詢id為1的用戶信息
http://localhost/user/saveUser 保存用戶信息
2.REST風(fēng)格描述形式
傳統(tǒng)方式一般是一個(gè)請(qǐng)求url對(duì)應(yīng)一種操作,這樣做不僅麻煩,也不安全,可以知道你進(jìn)行的操作,使用rest風(fēng)格后請(qǐng)求地址變的簡(jiǎn)單了,并且光看請(qǐng)求URL并不是很能猜出來(lái)該URL的具體功能
為了解決開(kāi)發(fā)人員明白一個(gè)相同的url地址進(jìn)行的是何種操作,按照REST風(fēng)格訪問(wèn)資源時(shí)使用行為動(dòng)作對(duì)資源操作進(jìn)行了區(qū)分
http://localhost/users | 查詢?nèi)坑脩粜畔?GET(查詢) |
---|---|
http://localhost/users/1 | 查詢指定用戶信息 GET(查詢) |
http://localhost/users | 添加用戶信息 POST(新增/保存) |
http://localhost/users | 修改用戶信息 PUT(修改/更新) |
http://localhost/users/1 | 刪除用戶信息 DELETE(刪除) |
請(qǐng)求的方式比較多,但是比較常用的就4種,分別是GET
,POST
,PUT
,DELETE
。
按照不同的請(qǐng)求方式代表不同的操作類型。
- 發(fā)送GET請(qǐng)求是用來(lái)做查詢
- 發(fā)送POST請(qǐng)求是用來(lái)做新增
- 發(fā)送PUT請(qǐng)求是用來(lái)做修改
- 發(fā)送DELETE請(qǐng)求是用來(lái)做刪除
值得注意的是:之所以稱之為REST風(fēng)格是因?yàn)橹皇且环N"風(fēng)格"而已,并不是規(guī)范,在實(shí)際開(kāi)發(fā)中可以靈活變通,修改
2.RESTful傳參
RESTful的傳參方式稍微和上述有所不同,需要在@RequestMapping中指定請(qǐng)求行為和參數(shù)的名稱,以post提交為例
@RequestMapping(value = "/users/{age}",method = RequestMethod.POST) @ResponseBody public String save(@PathVariable Integer age){ //@PathVariable表示此參數(shù)由路徑傳遞 System.out.println("傳參age"); return "Hello SpringMVC"; }
我們輸入的路徑相比之下就顯得格外簡(jiǎn)潔,安全
同樣也可以成功傳送到服務(wù)器端
請(qǐng)求行為可以通過(guò)method靈活更改,但是設(shè)定好之后更改傳遞的方式就會(huì)報(bào)錯(cuò),例如method=RequestMethod.POST卻以GET的方式提交
@RequestParam | 用于接收url地址傳參或表單傳參(非json格式) |
---|---|
@RequestBody | 用于接收json數(shù)據(jù)(傳參數(shù)>1) |
@PathVariable | 用于接收路徑參數(shù),使用{參數(shù)名稱}描述路徑參數(shù)(傳參數(shù)較少) |
@RequestParam、@RequestBody前面的文章有過(guò)介紹
3.RESTful簡(jiǎn)便形式(快速開(kāi)發(fā))
簡(jiǎn)化開(kāi)發(fā)一般解決硬編碼問(wèn)題,例如:
每個(gè)方法的@RequestMapping注解中都定義了訪問(wèn)路徑/books,@RequestMapping注解中都要使用method屬性定義請(qǐng)求方式,響應(yīng)json都需要加上@ResponseBody注解重復(fù)性太高
所以:
1.將@RequestMapping提到類上面,用來(lái)定義所有方法共同的訪問(wèn)路徑。
2.使用@GetMapping @PostMapping @PutMapping @DeleteMapping代替,設(shè)置當(dāng)前控制器方法請(qǐng)求訪問(wèn)路徑與請(qǐng)求動(dòng)作,每種對(duì)應(yīng)一個(gè)請(qǐng)求動(dòng)作,例如@GetMapping對(duì)應(yīng)GET請(qǐng)求
3.將ResponseBody提到類上面,讓所有的方法都有@ResponseBody的功能
4.使用@RestController注解替換@Controller與@ResponseBody注解,簡(jiǎn)化書(shū)寫(xiě)
就先這樣:
public class QQ { @RestController //@Controller + ReponseBody @RequestMapping("/goodss") public class goodsController { @PostMapping public String save(@RequestBody Goods goods){ System.out.println("goods save..." + goods); return "Hello SpringMVC"; } @DeleteMapping("/{id}") public String delete(@PathVariable Integer id){ System.out.println("goods delete..." + id); return "Hello SpringMVC"; } @PutMapping public String update(@RequestBody Goods goods){ System.out.println("goods update..." + goods); return "Hello SpringMVC"; } @GetMapping("/{id}") public String getById(@PathVariable Integer id){ System.out.println("goods getById..." + id); return "Hello SpringMVC"; } @GetMapping public String getAll(){ System.out.println("goods getAll..."); return "Hello SpringMVC"; } } }
硬編碼問(wèn)題得到了極大的改善!這就是Restful的極速開(kāi)發(fā)
4.放行靜態(tài)資源
protected String[] getServletMappings() {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E--> return new String[]{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->"/"};}
因?yàn)樯鲜鰯r截方法存在的原因,SpringMVC將所有請(qǐng)求都拿去處理(靜態(tài)資源JS/CSS/HTML…)而這些本應(yīng)是交給tomcat來(lái)處理,因此客戶端就會(huì)出現(xiàn)404錯(cuò)誤
所以,SpringMVC需要將靜態(tài)資源進(jìn)行放行
@Configuration public class SpringMvcSupport extends WebMvcConfigurationSupport { protected void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/pages/**").addResourceLocations("/pages/"); registry.addResourceHandler("/js/**").addResourceLocations("/js/"); registry.addResourceHandler("/css/**").addResourceLocations("/css/"); registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/"); } }
到此這篇關(guān)于SpringMVC加載控制與Postmand的使用和Rest風(fēng)格的引入及RestFul開(kāi)發(fā)全面詳解的文章就介紹到這了,更多相關(guān)SpringMVC加載控制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java使用定時(shí)器實(shí)現(xiàn)監(jiān)聽(tīng)數(shù)據(jù)變化
這篇文章主要為大家詳細(xì)介紹了Java如何使用定時(shí)器監(jiān)聽(tīng)數(shù)據(jù)變化,當(dāng)滿足某個(gè)條件時(shí)(例如沒(méi)有數(shù)據(jù)更新)自動(dòng)執(zhí)行某項(xiàng)任務(wù),有興趣的可以了解下2023-11-11Java如何將字符串String轉(zhuǎn)換為整型Int
這篇文章主要介紹了Java如何將字符串String轉(zhuǎn)換為整型Int,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08Linux環(huán)境卸載Centos7自帶的OpenJDK和安裝JDK1.8圖文教程
CentOS系統(tǒng)是開(kāi)發(fā)者常用的Linux操作系統(tǒng),安裝它時(shí)會(huì)默認(rèn)安裝自帶的舊版本的OpenJDK,但在開(kāi)發(fā)者平時(shí)開(kāi)發(fā)Java項(xiàng)目時(shí)還是需要完整的JDK,這篇文章主要給大家介紹了關(guān)于Linux環(huán)境卸載Centos7自帶的OpenJDK和安裝JDK1.8的相關(guān)資料,需要的朋友可以參考下2024-07-07Java中快速排序優(yōu)化技巧之隨機(jī)取樣、三數(shù)取中和插入排序
快速排序是一種常用的基于比較的排序算法,下面這篇文章主要給大家介紹了關(guān)于Java中快速排序優(yōu)化技巧之隨機(jī)取樣、三數(shù)取中和插入排序的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09Spring 自動(dòng)裝配的二義性實(shí)例解析
這篇文章主要介紹了Spring 自動(dòng)裝配的二義性實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11如何解決springboot讀取配置文件的中文亂碼問(wèn)題
本篇文章主要介紹了如何解決springboot讀取配置文件的中文亂碼問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看2018-05-05深入解析Java中的編碼轉(zhuǎn)換以及編碼和解碼操作
這篇文章主要介紹了Java中的編碼轉(zhuǎn)換以及編碼和解碼操作,文中詳細(xì)解讀了編碼解碼的相關(guān)IO操作以及內(nèi)存使用方面的知識(shí),需要的朋友可以參考下2016-02-02Spring實(shí)戰(zhàn)之設(shè)置普通屬性值的方法示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之設(shè)置普通屬性值的方法,結(jié)合實(shí)例形式分析了Spring設(shè)置普通屬性值的方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-11-11