在Spring MVC1中,我們知道了MVC的定義,同時也知道了@RequestMapping和@RestController這個注解的作用。
本篇文章,我們將學習使用Spring MVC獲取請求參數和返回不同的響應等等
請求
傳遞單個參數
如圖所示,創建RequestController類:
?在類中實現傳遞單個參數:
@RestController
public class RequestController {@RequestMapping("/r1")public String r1(String name){return "獲取參數"+name;}
}
我們可以使用Postman對代碼進行測試 :
傳int和Integer對比(傳錯誤類型和不傳參數):
傳遞Integer:
@RequestMapping("/r2")public String r2(Integer num){return "獲取參數"+num;}
傳遞int:
@RequestMapping("/r3")public String r3(int num){return "獲取參數"+num;}
可以看到在不傳參時int直接報了個500(500屬于客戶端的問題,是要我們后端開發人員負責的),因此在實際開發中建議多使用包裝類型。
傳遞多個參數
@RequestMapping("/r4")public String r4(String name,Integer age){return "獲取參數:"+name+" age:"+age;}
Postman測試:?
傳遞對象?
當我們需要傳遞兩個以上的參數時,就可以使用對象來進行傳遞,使代碼更加簡潔。
先在目錄下創建一個學生類:
public class Student {private String name;private Integer age;private Integer id;
}
我們可以使用Lombok的@Data注解來減少Getter和Setter方法的書寫:
首先,我們需要在pom.xml中添加Lombok的依賴,這里建議使用插件進行添加:?在pom.xml文件中右鍵-生成:
選中我們剛才安裝的插件:
?
繼續按圖示點擊,然后OK即可:?回到剛才的Student代碼處,添加上@Data注解。
@Data
public class Student {private String name;private Integer age;private Integer id;
}
這是Lombok中所包含的一些其他注解:
?@Data=@Getter+@Setter+@ToString+@EqualsAndHashCode+@RequiredArgsConstructor+@NoArgsContryctor
@RequestMapping("/r5")public String r5(Student student){return student.toString();}
}
測試:?
后端參數映射(后端參數重命名)
后端參數映射需要使用@RequestParam這個注解:
@RequestMapping("/r6")public String r6(@RequestParam("name")String userName){return "獲取參數"+userName;}
測試:?
傳遞數組
@RequestMapping("/r7")public String r7(int[] arr){return Arrays.toString(arr);}
測試:
方式1:?
方式2:
?
傳遞集合
@RequestMapping("/r8")public String r8(@RequestParam List<String> list){return list.toString();}
?測試:
方式1:
方式2:
傳遞Json對象
傳遞Json對象需要使用@RequestBody這個注解
@RequestMapping("/r10")public String r10(@RequestBody Student student){return student.toString();}
測試:?
Json字符串轉對象和對象轉字符串
代碼:
public class TestJson {public static void main(String[] args) throws JsonProcessingException {ObjectMapper mapper = new ObjectMapper();//json字符串轉對象String jsonstr = "{\"name\":\"張三\",\"age\":15,\"id\":5}";Student student = mapper.readValue(jsonstr,Student.class);System.out.println(student);//json對象轉字符串String s = mapper.writeValueAsString(student);System.out.println(s);}
}
?運行結果:
傳遞URL中的對象
注意這里的參數一個都不能少,Spring是無法識別出缺失的參數的。?
@RequestMapping("r9/{name}/{age}")public String r9(@PathVariable("name")String userName,@PathVariable Integer age){return "獲取參數:"+userName+" age:"+age;}
測試:?
?傳遞文件
這里的注解@RequestPart可加也可不加。
@RequestMapping("/r11")public String r11(MultipartFile file){return file.getOriginalFilename();}
測試:?
獲取Cookie
Spring中內置了HttpSeverletRequest和HttpSeverletResponse兩個對象(這兩個對象包含了Http請求/響應中的所有屬性)。因為Cookie一般是在請求中的,所以我們可以通過HttpSeverletRequest來獲取到Cookie。
方式1:?
@RequestMapping("/getC1")public String getCookie1(HttpServletRequest request){Cookie[] cookies = request.getCookies();if(cookies != null){Arrays.stream(cookies).forEach((ck)->{System.out.println(ck.getName()+":"+ck.getValue());});}return "獲取cookie成功";}
點擊這里創建一個Cookie:?輸入127.0.0.1后Add Domain即可:
點擊這里創建Cookie:
測試:
方式2:
@RequestMapping("/getC2")public String getCookie2(@CookieValue("xmy") String xmy){return xmy;}
測試:
設置Session
方式1:
@RequestMapping("/setSess")public String setSess(HttpServletRequest request){HttpSession session = request.getSession();session.setAttribute("name","zhangsan");return "設置session成功";}
方式2:
@RequestMapping("/setSess1")public String setSess1(HttpSession session) {session.setAttribute("name","zhangsan");return "設置session成功";}
獲取Session?
方式1:
@RequestMapping("/getSess1")public String getSess1(HttpServletRequest request){HttpSession session = request.getSession();String name = (String) session.getAttribute("name");return name;}
測試:
?方式2:
@RequestMapping("/getSess2")public String getSess2(HttpSession session){String name = (String) session.getAttribute("name");return name;}
測試:
?方式3:
@RequestMapping("/getSess3")public String getSess3(@SessionAttribute("name")String name){return name;}
獲取Header中的元素
這里我們獲取的是Header中的User-Agent元素。
方式1:
@RequestMapping("/getHeader")public String getHeader(HttpServletRequest request){String header = request.getHeader("User-Agent");return header;}
測試:
?方式2:
@RequestMapping("/getHeader2")public String getHeader2(@RequestHeader("User-Agent")String header){return header;}
測試:
響應
返回靜態頁面
先在static目錄下創建一個HTML文件:?
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>我是一個標題</h1>
</body>
</html>
這里我們需要把類上面的@RestController變成@Controller,@Controller是定義?個控制器, Spring 框架啟動時加載, 把這個對象交給Spring管理(返回的是視圖),而@RestController = @ResponseBody(返回數據)+@Controller,因此RestController返回的是數據。
@Controller
public class ResponseController {@RequestMapping("/index")public String index(){return "/index.html";}
測試:
注意:因為在這里使用的是@Controller,所以我們后面需要返回數據的內容都要加上@ResponseBody 。
返回數據
@RequestMapping("/index2")@ResponseBodypublic String index2(){return "返回數據";}
測試:?
返回HTML代碼片段
//返回html@RequestMapping("/index3")@ResponseBodypublic String index3(){return "<h1>hello springmvc<h1>";}
?測試:
返回Json?
//返回json@RequestMapping("/index4")@ResponseBodypublic HashMap<String,String> index4(){HashMap<String,String> map = new HashMap<>();map.put("k1","v1");map.put("k2","v2");map.put("k3","v3");map.put("k4","v4");return map;}
?測試:
設置狀態碼
設置狀態碼需要使用HttpSeverletResponse對象?
//設置狀態碼@ResponseBody@RequestMapping("/index5")public String setStatus(HttpServletResponse response){response.setStatus(418);return "設置狀態碼";}
測試:
設置返回類型
//設置返回類型@RequestMapping(value = "return",produces = "applicatin/json")@ResponseBodypublic String returnJson(){return "{\"success\":true}";}
?測試: