這篇文章將為大家詳細(xì)講解有關(guān)Spring mvc Controller和RestFul原理的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
成都創(chuàng)新互聯(lián)公司是專(zhuān)業(yè)的中原網(wǎng)站建設(shè)公司,中原接單;提供成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行中原網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
控制器Controller
控制器復(fù)雜提供訪問(wèn)應(yīng)用程序的行為,通常通過(guò)接口定義或注解定義兩種方法實(shí)現(xiàn)。
控制器負(fù)責(zé)解析用戶的請(qǐng)求并將其轉(zhuǎn)換為一個(gè)模型。
在Spring MVC中一個(gè)控制器類(lèi)可以包含多個(gè)方法
在Spring MVC中,對(duì)于Controller的配置方式有很多種
實(shí)現(xiàn)Controller接口
Controller是一個(gè)接口,在org.springframework.web.servlet.mvc包下,接口中只有一個(gè)方法;
//實(shí)現(xiàn)該接口的類(lèi)獲得控制器功能 public interface Controller { //處理請(qǐng)求且返回一個(gè)模型與視圖對(duì)象 ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception; }
測(cè)試
編寫(xiě)一個(gè)Controller類(lèi),ControllerTest1
// 定義控制器 // 注意點(diǎn):不要導(dǎo)錯(cuò)包,實(shí)現(xiàn)Controller接口,重寫(xiě)方法; public class ControllerTest1 implements Controller { public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { //返回一個(gè)模型視圖對(duì)象 ModelAndView mv = new ModelAndView(); mv.addObject("msg","Test1Controller"); mv.setViewName("test"); return mv; } }
編寫(xiě)完畢后,去Spring配置文件中注冊(cè)請(qǐng)求的bean;name對(duì)應(yīng)請(qǐng)求路徑,class對(duì)應(yīng)處理請(qǐng)求的類(lèi)
<bean name="/t1" class="com.xiaohua.controller.ControllerTest1"/>
編寫(xiě)前端test.jsp,注意在WEB-INF/jsp目錄下編寫(xiě),對(duì)應(yīng)我們的視圖解析器
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Kuangshen</title> </head> <body> ${msg} </body> </html>
配置Tomcat運(yùn)行測(cè)試,我這里沒(méi)有項(xiàng)目發(fā)布名配置的就是一個(gè) / ,所以請(qǐng)求不用加項(xiàng)目名,OK!
說(shuō)明:
實(shí)現(xiàn)接口Controller定義控制器是較老的辦法
缺點(diǎn)是:一個(gè)控制器中只有一個(gè)方法,如果要多個(gè)方法則需要定義多個(gè)Controller;定義的方式比較麻煩;
使用注解@Controller
@Controller注解類(lèi)型用于聲明Spring類(lèi)的實(shí)例是一個(gè)控制器(在講IOC時(shí)還提到了另外3個(gè)注解);
Spring可以使用掃描機(jī)制來(lái)找到應(yīng)用程序中所有基于注解的控制器類(lèi),為了保證Spring能找到你的控制器,需要在配置文件中聲明組件掃描。
<!-- 自動(dòng)掃描指定的包,下面所有注解類(lèi)交給IOC容器管理 -->
<context:component-scan base-package="com.xiaohua.controller"/>
增加一個(gè)ControllerTest2類(lèi),使用注解實(shí)現(xiàn);
// @Controller注解的類(lèi)會(huì)自動(dòng)添加到Spring上下文中 @Controller public class ControllerTest2{ //映射訪問(wèn)路徑 @RequestMapping("/t2") public String index(Model model){ //Spring MVC會(huì)自動(dòng)實(shí)例化一個(gè)Model對(duì)象用于向視圖中傳值 model.addAttribute("msg", "ControllerTest2"); //返回視圖位置 return "test"; } }
運(yùn)行tomcat測(cè)試
可以發(fā)現(xiàn),我們的兩個(gè)請(qǐng)求都可以指向一個(gè)視圖,但是頁(yè)面結(jié)果的結(jié)果是不一樣的,從這里可以看出視圖是被復(fù)用的,而控制器與視圖之間是弱偶合關(guān)系。
RequestMapping
@RequestMapping注解用于映射url到控制器類(lèi)或一個(gè)特定的處理程序方法??捎糜陬?lèi)或方法上。用于類(lèi)上,表示類(lèi)中的所有響應(yīng)請(qǐng)求的方法都是以該地址作為父路徑。
為了測(cè)試結(jié)論更加準(zhǔn)確,我們可以加上一個(gè)項(xiàng)目名測(cè)試 myweb
只注解在方法上面
@Controller public class TestController { @RequestMapping("/h2") public String test(){ return "test"; } }
訪問(wèn)路徑:http://localhost:8080 / 項(xiàng)目名 / h2
同時(shí)注解類(lèi)與方法
@Controller @RequestMapping("/admin") public class TestController { @RequestMapping("/h2") public String test(){ return "test"; } }
訪問(wèn)路徑:http://localhost:8080 / 項(xiàng)目名/ admin /h2 , 需要先指定類(lèi)的路徑再指定方法的路徑;
RestFul風(fēng)格
Restful就是一個(gè)資源定位及資源操作的風(fēng)格。不是標(biāo)準(zhǔn)也不是協(xié)議,只是一種風(fēng)格?;谶@個(gè)風(fēng)格設(shè)計(jì)的軟件可以更簡(jiǎn)潔,更有層次,更易于實(shí)現(xiàn)緩存等機(jī)制。
功能
資源:互聯(lián)網(wǎng)所有的事物都可以被抽象為資源
資源操作:使用POST、DELETE、PUT、GET,使用不同方法對(duì)資源進(jìn)行操作。
分別對(duì)應(yīng) 添加、 刪除、修改、查詢。
傳統(tǒng)方式操作資源 :通過(guò)不同的參數(shù)來(lái)實(shí)現(xiàn)不同的效果!方法單一,post 和 get
http://127.0.0.1/item/queryItem.action?id=1 查詢,GET
http://127.0.0.1/item/saveItem.action 新增,POST
http://127.0.0.1/item/updateItem.action 更新,POST
http://127.0.0.1/item/deleteItem.action?id=1 刪除,GET或POST
使用RESTful操作資源 : 可以通過(guò)不同的請(qǐng)求方式來(lái)實(shí)現(xiàn)不同的效果!如下:請(qǐng)求地址一樣,但是功能可以不同!
http://127.0.0.1/item/1 查詢,GET
http://127.0.0.1/item 新增,POST
http://127.0.0.1/item 更新,PUT
http://127.0.0.1/item/1 刪除,DELETE
學(xué)習(xí)測(cè)試
在新建一個(gè)類(lèi) RestFulController
@Controller public class RestFulController { }
在Spring MVC中可以使用 @PathVariable 注解,讓方法參數(shù)的值對(duì)應(yīng)綁定到一個(gè)URI模板變量上。
@Controller public class RestFulController { //映射訪問(wèn)路徑 @RequestMapping("/commit/{p1}/{p2}") public String index(@PathVariable int p1, @PathVariable int p2, Model model){ int result = p1+p2; //Spring MVC會(huì)自動(dòng)實(shí)例化一個(gè)Model對(duì)象用于向視圖中傳值 model.addAttribute("msg", "結(jié)果:"+result); //返回視圖位置 return "test"; } }
我們來(lái)測(cè)試請(qǐng)求查看下
使用路徑變量的好處?
使路徑變得更加簡(jiǎn)潔;
獲得參數(shù)更加方便,框架會(huì)自動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換。
通過(guò)路徑變量的類(lèi)型可以約束訪問(wèn)參數(shù),如果類(lèi)型不一樣,則訪問(wèn)不到對(duì)應(yīng)的請(qǐng)求方法,如這里訪問(wèn)是的路徑是/commit/1/a,則路徑與方法不匹配,而不會(huì)是參數(shù)轉(zhuǎn)換失敗。
我們來(lái)修改下對(duì)應(yīng)的參數(shù)類(lèi)型,再次測(cè)試
//映射訪問(wèn)路徑 @RequestMapping("/commit/{p1}/{p2}") public String index(@PathVariable int p1, @PathVariable String p2, Model model){ String result = p1+p2; //Spring MVC會(huì)自動(dòng)實(shí)例化一個(gè)Model對(duì)象用于向視圖中傳值 model.addAttribute("msg", "結(jié)果:"+result); //返回視圖位置 return "test"; }
使用method屬性指定請(qǐng)求類(lèi)型
用于約束請(qǐng)求的類(lèi)型,可以收窄請(qǐng)求范圍。指定請(qǐng)求謂詞的類(lèi)型如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等
我們來(lái)測(cè)試一下:
增加一個(gè)方法
//映射訪問(wèn)路徑,必須是POST請(qǐng)求 @RequestMapping(value = "/hello",method = {RequestMethod.POST}) public String index2(Model model){ model.addAttribute("msg", "hello!"); return "test"; }
我們使用瀏覽器地址欄進(jìn)行訪問(wèn)默認(rèn)是Get請(qǐng)求,會(huì)報(bào)錯(cuò)405:
如果將POST修改為GET則正常了;
//映射訪問(wèn)路徑,必須是Get請(qǐng)求 @RequestMapping(value = "/hello",method = {RequestMethod.GET}) public String index2(Model model){ model.addAttribute("msg", "hello!"); return "test"; }
小結(jié):
Spring MVC 的 @RequestMapping 注解能夠處理 HTTP 請(qǐng)求的方法, 比如 GET, PUT, POST, DELETE 以及 PATCH。
所有的地址欄請(qǐng)求默認(rèn)都會(huì)是 HTTP GET 類(lèi)型的。
方法級(jí)別的注解變體有如下幾個(gè): 組合注解
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@GetMapping 是一個(gè)組合注解
它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一個(gè)快捷方式。
關(guān)于“Spring mvc Controller和RestFul原理的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
網(wǎng)站題目:SpringmvcController和RestFul原理的示例分析
新聞來(lái)源:http://bm7419.com/article4/iidgoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、App開(kāi)發(fā)、網(wǎng)站改版、服務(wù)器托管、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)