javascript
框架:SpringMVC常用注解总结
在項目學習的過程中,使用到了哪些注解呢?
1:@RequestMapping
RequestMapping可以注解到類或者方法上,可以用來處理請求地址的映射。
注:注解于類上,說明該類中所有的響應請求方法都是以該注解地址為父路徑的。
RequestMapping有幾個屬性,把最重要的幾個分成以下3個類:
1)????value, method;
value:
指定的請求地址,或者URI模式的地址。
具體實現如下:
? ? ? A:具體類:@RequestMapping(value="/user/roles/)? ? ? ? ??
? ? ? B:含某個變量的類:@RequestMapping(value="/user/roles/{uid})? ? ?
????在聲明方法時: ? ??
?????publicStringgetProduct(@PathVariable("uid") Long uid){ ? ? ?
????} ? ??
????則把聲明的參數“uid”與形參uid所綁定,此時取得的形參是地址傳遞的uid參數。 ? ? ????
????C:含有正則表達式的類Method:
Method:
制定請求的方法,GET,POST等,若無聲明,則默認幾個常見的都可以。如GET、POST、PUT、DELETE等都可以取得。
4:?@GetMapping
?@GetMapping是一個組合注解,是@RequestMapping(method= RequestMethod.GET)的縮寫。該注解將HTTP Get 映射到特定的處理方法上。
???????? 所以此處個人的理解,@GetMapping可以算是@RequestMapping的子集,可能該說法不是很嚴謹,但是我個人暫時是這么理解的。
1. 哪一些情況下,瀏覽器會發送get請求
a. 直接在瀏覽器地址欄輸入某個地址
b. 點擊鏈接
c. 表單默認的提交方式
2.特點:
a.???請求參數會添加到請求資源路勁的后面,只能添加少量參數
b.???請求參數會顯示在瀏覽器地址欄,路由器會記錄請求地址
5:@PostMapping
1. 哪一些情況下,瀏覽器會發送post請求
a.???設置表單method = "post"
2.特點:
a. 請求參數添加到實體內容里面,可以添加大量的參數(也解釋了為什么瀏覽器地址欄不能發送post請求,在地址欄里我們只能填寫URL,并不能進入到Http包的實體當中)
b. 相對安全,但是,post請求不會對請求參數進行加密處理(可以使用https協議來保證數據安全)。
6:RequestBody
如果傳輸的是單層json對象,我們后臺可以直接用?@RequestParam接收
$.ajax({
???type :?"post",
???dataType :?"json",
???url :?"/testRequestBody",
???data:{
???????name:"韋德",
???????age:35
??? },
???success : function(result) {
??? }
});
@RequestMapping("/testRequestBody")
public?String testRequestBody(@RequestParamMap<String, Object> map) {
? System.out.println(map);// {name=韋德, age=35}
??return"index";
}
如果傳輸的是多層嵌套json對象,這個時候會就會出現數據丟失問題
@RequestBody很好的解決了這個問題,它會把前臺傳輸過來的json轉化為后臺對應的對象
$.ajax({
???type :?"post",
???dataType :?"json",
???url :?"/testRequestBody",
???contentType:"application/json",??
???data:JSON.stringify({
???????name:"韋德",
???????win:[2006,2012,2013],
???????age:35
???}),
???success : function(result) {
??? }
});
@RequestMapping("/testRequestBody")
public?StringtestRequestBody(@RequestBodyMap<String, Object> map) {
? System.out.println(map);//{name=韋德, win=[2006, 2012, 2013], age=35}
??return"index";
}
需要注意的是前臺需要指定contentType為"application/json"
同時要把json對象轉化為String,否則后臺不能識別
7:@ResponseBody
@ResponseBody注解到方法上,直接傳回結果(字符串)
ajax請求返回json格式,往常我們這樣做
privatevoid?writeJson(HttpServletResponseresponse,Object?object) {
? String json =JSON.toJSONString(object);
? response.setCharacterEncoding("UTF-8");
?response.setContentType("application/json; charset=utf-8");
?PrintWriter?out?=?null;
??try?{
????out?= response.getWriter();
????out.write(json);
? }?catch?(IOException e) {
???e.printStackTrace();
? }?finally?{
????if?(out?!=?null) {
??????out.close();
??? }
? }
}
這個時候?@ResponseBody就派上用場了,只需要一個注解,全部搞定
$.ajax({
???type :?"post",
???dataType :?"json",
???url :?"/testResponseBody",
???success : function(result) {
???????console.info(result);
??? }
});
@RequestMapping("/testResponseBody")
@ResponseBody
public?Map<String, Object>testRequestBody(){
? Map<String,Object> result =?new?HashMap<String,Object>();
? result.put("name",?"韋德");
? result.put("age",?35);
??return?result;
}
前臺console輸出
{
????"age":?35,
????"name":?"韋德"
}
說一些個人的看法,非技術層面上的,一個 API 何時用 GET、POST 甚至 PUT 請求。
首先引入一個副作用的概念,副作用指當你發送完一個請求以后,網站上的資源狀態沒有發生修改,即認為這個請求是無副作用的。比如注冊用戶這個請求是有副作用的,獲取用戶詳情可以認為是無副作用的。
再引入一個冪等性的概念,冪等是說,一個請求原封不動的發送N次和M次(N不等于M,N和M都大于1)服務器上資源的狀態最終是一致的。比如發貼是非冪等的,重放10次發貼請求會創建10個帖子。但修改帖子內容是冪等的,一個修改請求重放無論多少次,帖子最終狀態都是一致的。(前提是同一個修改操作重復10次)
嘮叨了這么多,回過頭來,何時用 PUT POST GET DELETE:
GET:無副作用,冪等
PUT:副作用,冪等
POST:副作用,非冪等
DELETE:副作用,冪等
這么看的話,DELETE 和 PUT 請求好像毫無區別。為了進一步區分這些請求方式的應用場景,我們再引入一個技術特性,request body,就是大家廣為流傳的 "POST 請求傳輸數據量比較大“ 這一說法的來源。
POST/PUT 請求可以通過傳遞 request body 來發送大量的數據,而 GET/DELETE 不能。
所以上面的表格需要再加一項:
GET:無副作用,冪等,不可帶 Request Body
PUT:副作用,冪等,可以帶 Request Body
POST:副作用,非冪等,可以帶 Request Body
DELETE:副作用,冪等,不可帶 Request Body
?
2)??params,headers
params:
????? 指定request中必須包含某些參數值,才讓該方法處理。
headers:
????? ?指定request中必須包含某些指定的header值,才能讓該方法處理請求。
3)? consumes,produces
consumes:
指定處理請求的提交內容類型(Content-Type),例如application/json,text/html;?
produces:
指定返回的內容類型,僅當request請求頭中的(Accept)類型中包含該指定類型才返回;
2:@PathVariable
????? 用于將請求URL中的模板變量映射到功能處理方法的參數上,即取出uri模板中的變量作為參數。如:
3:?@RequestParam
@RequestParam主要用于在SpringMVC后臺控制層獲取參數,類似一種是request.getParameter("name"),
它有三個常用參數:defaultValue = "0", required = false,value="isApp";
defaultValue 表示設置默認值,required通過boolean設置是否是必須要傳入的參數,value 值表示接受的傳入的參數類型。
形式如項目中的:
public ObjectuserMemberShop(@RequestParam(required= false,value="corpId")IntegercorpId,
????????????????@RequestParam("uid")Longuid){
??? }
?
參考一篇文章,其中講了@controller、@service、@repository注解,自己復制下再總結下自己的一些想法。
如果一個類帶了@controller、@service、@repository注解,將自動注冊到Spring容器,不需要再在applicationContext.xml文件定義bean了。
首先:
Controller層使用@Controller注解
Service層使用@Service注解
Dao層使用@Repository注解
?
@Controller可注解于類上,聲明該類為SpringMVC的Controller對象。
簡單說:被@Controller注解的類是一個控制器,該類的方法是相應的動作。
@Service可注解于類上,
簡單說:
1.聲明該類是一個bean。如 @Service@Scope("prototype")
public class Zoo
2.Zoo.java在bean中的id是"zoo",即類名且首字母小寫
?
例:@Service("userService")注解是告訴Spring,當Spring要創建UserServiceImpl的的實例時,bean的名字必須叫做"userService",這樣當Action需要使用UserServiceImpl的的實例時,就可以由Spring創建好的"userService",然后注入給Action。
dao層使用@repository注解
@Repository可注解于類上,
?
@Repository(value="userDao")注解是告訴Spring,讓Spring創建一個名字叫“userDao”的UserDaoImpl實例。
當Service需要使用Spring創建的名字叫“userDao”的UserDaoImpl實例時,
就可以使用@Resource(name = "userDao")注解告訴Spring,Spring把創建好的userDao注入給Service即可。
總結
以上是生活随笔為你收集整理的框架:SpringMVC常用注解总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 框架:SpringMVC的工作原理
- 下一篇: gradle idea java ssm