1. 路由映射:
????????@RequestMapping:當用戶訪問某個 URL 時,該注解會根據 URL 的路徑映射到具體的程序中對應的類或方法(路由映射)。修飾方法時,路徑為類路徑 + 方法路徑。默認情況下同時支持 GET 和 POST,也可以顯式指定,如下:
// 此時只支持 GET 方法
@RequestMapping(value = "/m2", method = RequestMethod.GET)
????????@GetMapping:和上面等價,只支持 GET 的另一種寫法。
2. 接收請求中的參數:
? ? ? ? 首先,請求報文中有哪些地方可能帶有后端需要的參數?
????????從 HTTP 協議傳過來的參數均是字符串,Spring 會根據后端定義的參數類型進行轉換,若無法轉換則會報 400。
2.1 接收查詢字符串中的數據
????????接收單個參數:
public String r1(String keyword)
????????@RequestParam:用于重命名,此時前端的參數名為 keyword。一旦使用該注解則默認該參數為必傳參數,如果客戶端沒有傳此參數會報 400
public String r1(@RequestParam("keyword") String key)
????????也可以顯式指定該參數為非必傳參數,此時不傳參數會為 null。對于可能為空,且并未自動初始化的參數,應該使用包裝類型,因為包裝類型可以為 null,而基本數據類型不可以為 null。
public String r2(@RequestParam(value = "q", required = false)
? ? ? ? 接收數組:Spring 會幫我們自動綁定數組中參數的值。
public int[] r3(int[] arr)
? ? ? ? ?下面兩種方法都可以:
? ? ? ? 接收集合:需要使用 @RequestParam 綁定參數關系,也就是告知 Spring 要將傳來的數據構造為集合。
public String r4(@RequestParam List<Integer> list)
2.2 接收 body 中的數據
????????@RequestBody:該注解用于綁定請求正文中的數據。
? ? ? ? 接收 JSON:直接使用 Java 對象就可以輕松接收 JSON。這是因為 Spring 已經幫我們內置了 JSON 和 Java 對象相互轉換的工具(Jackson)。
public String r5(@RequestBody UserInfo userInfo)
? ? ? ? 接收文件:可以使用?@RequestPart 來重命名。
public String r11(MultipartFile file) throws IOException {// 得到文件名String filename = file.getOriginalFilename();// transferTo 內部封裝了 InputStream 和 OutputStreamfile.transferTo(new File("D:\\", "UserFile.jpg"));return "已接收:" + filename;}
2.3 接收 header 中的數據
? ? ? ? @RequestHeader:通過 header 中的鍵名獲取。
public String getUserAgent2(@RequestHeader("User-Agent") String ua)
? ? ? ?@CookieValue:獲取 cookie 中的某一個值。如果想要獲取很多 cookie 就要寫很多注解,所以也可以采用下面的方法。
public String r13(@CookieValue("name") String name)
? ? ? ? 使用 HttpServletRequest 類:HttpServletRequest 和?HttpServletResponse 是 Servlet 提供的接口,由 Tomcat 為我們實現。SpringWebMVC 是在 Servlet 的基礎上構建的框架,這兩個 Servlet 的核心類作為 SpringWebMVC 的內置對象存在,HttpServletRequest 中封裝了 HTTP 請求的全部信息,HttpServletResponse 中封裝了 HTTP 響應的全部信息。在高級 Web 框架出現前,使用這兩個類就可以獲取通信的全部數據,雖然現在 SpringWebMVC 為我們提供了許多方便的注解,但有些情況下使用 HttpServletRequest 更優雅。
public String r12(HttpServletRequest request) {Cookie[] cookies = request.getCookies();StringBuilder builder = new StringBuilder();if (cookies == null) return "無 Cookie 設置!";for (Cookie c : cookies) builder.append(c.getName()).append(":").append(c.getValue()).append(",");return "Cookie 信息為:" + builder;}
public String getUserAgent(HttpServletRequest request) {return request.getHeader("User-Agent");}
????????獲取 Session:并不是指從客戶端獲取 Session,因為 Session 是保存在服務器內存中的,這里實際上是在獲取 Cookie 中的 sessionId,然后根據 sessionId 獲取服務器中對應的 Session 對象。
? ? ? ? 需要實例?HttpServletRequest 類,調用其提供的 getSession 方法,這個方法就是封裝了上面提到的兩步。如果檢索到 Cookie 中有 sessionId,則表示服務器已經在內存中保存了該 Session,該方法會返回現有的Session。如果不存在,則會生成 sessionId,創建新的 Session,在響應中返回該 sessionId 給客戶端。因此 getSession 默認返回非空 Session,若需避免創建新 Session,應指定參數為 getSession(false)。
HttpSession session = request.getSession();
? ? ? ? 也可以不實例?HttpServletRequest 類,直接使用 HttpSession 類獲取,此時不存在 Session 會自動創建。
public String r15(HttpSession session)
? ? ? ? 針對 Session 的進一步操作:
session.setAttribute(使用字符串命名, 需要綁定到該會話的對象);
session.getAttribute(指定的名稱);
2.4 獲取 URL 中資源定位部分的參數
????????取路徑參數的情況并不多,{ } 里的數據即要取的值。
? ? ? ? @PathVariable:意為路徑中的變量,取路徑參數需要加此注解,可以填參數來重命名。
@RequestMapping("/r6/{r7}")public String r6(@PathVariable String r7)