1. BS 架構
BS架構:Browser/Server,瀏覽器/服務器架構模式。客戶端只需要瀏覽器,應用程序的邏輯和數據都存儲在服務端。
在SpringBoot進行web程序開發時,它內置了一個核心的Servlet程序 DispatcherServlet,稱之為 核心控制器。
DispatcherServlet 負責接收頁面發送的請求,然后根據執行的規則,將請求再轉發給后面的請求處理器Controller,請求處理器處理完請求之后,最終再由DispatcherServlet給瀏覽器響應數據。
瀏覽器發送請求,會攜帶請求數據,包括:請求行、請求頭;請求到達tomcat之后,tomcat會負責解析這些請求數據,將解析后的請求數據會傳遞給Servlet程序的HttpServletRequest對象,那也就意味著 HttpServletRequest 對象就可以獲取到請求數據。
Tomcat 還給Servlet程序傳遞了一個參數 HttpServletResponse,通過這個對象,我們就可以給瀏覽器設置響應數據 。
2. 簡單參數
簡單參數,參數名與形參變量名相同,定義同名的形參即可接收參數。
@RestController
public class RequestController {// http://localhost:8080/simpleParam?name=Tom&age=10// 第1個請求參數: name=Tom 參數名:name,參數值:Tom// 第2個請求參數: age=10 參數名:age , 參數值:10//springboot方式@RequestMapping("/simpleParam")public String simpleParam(String name , Integer age ){//形參名和請求參數名保持一致System.out.println(name+" : "+age);return "OK";}
}
對于簡單參數來講,請求參數名和controller方法中的形參名不一致時,無法接收到請求數據。可以使用Spring提供的@RequestParam注解完成映射。
@RestController
public class RequestController {// http://localhost:8080/simpleParam?name=Tom&age=20// 請求參數名:name//springboot方式@RequestMapping("/simpleParam")public String simpleParam(@RequestParam("name") String username , Integer age ){System.out.println(username+" : "+age);return "OK";}
}
如果該參數是可選的,可以將required屬性設置為false。(默認為 true)
@RequestMapping("/simpleParam") public String simpleParam(@RequestParam(name = "name", required = false) String username, Integer age){System.out.println(username+ ":" + age);return "OK"; }
3. 實體參數
如果請求參數比較多,通過上述的方式一個參數一個參數的接收,會比較繁瑣。 我們可以考慮將請求參數封裝到一個實體類對象中。注意:請求參數名與實體類的屬性名相同。
3.1 簡單實體對象
定義POJO實體類:
public class User {private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}
Controller方法:
@RestController
public class RequestController {//實體參數:簡單實體對象@RequestMapping("/simplePojo")public String simplePojo(User user){System.out.println(user);return "OK";}
}
3.2 復雜實體對象
復雜實體對象指的是,在實體類中有一個或多個屬性,也是實體對象類型的。
定義POJO實體類:
- Address實體類
public class Address {private String province;private String city;public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}@Overridepublic String toString() {return "Address{" +"province='" + province + '\'' +", city='" + city + '\'' +'}';}
}
- User實體類
public class User {private String name;private Integer age;private Address address; //地址對象public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", address=" + address +'}';}
}
Controller方法:
@RestController
public class RequestController {//實體參數:復雜實體對象@RequestMapping("/complexPojo")public String complexPojo(User user){System.out.println(user);return "OK";}
}
4. 數組集合參數
4.1 數組
請求參數名與形參數組名稱相同且請求參數為多個,定義數組類型形參即可接收參數。
xxxxxxxxxx?hobby=game&hobby=java
等同于 xxxxxxxxxxxxx?hobby=game,java
。
Controller方法:
@RestController
public class RequestController {//數組集合參數@RequestMapping("/arrayParam")public String arrayParam(String[] hobby){System.out.println(Arrays.toString(hobby));return "OK";}
}
4.2 集合
請求參數名與形參集合對象名相同且請求參數為多個,@RequestParam 綁定參數關系。
默認情況下,請求中參數名相同的多個值,是封裝到數組。如果要封裝到集合,要使用@RequestParam綁定參數關系。
Controller方法:
@RestController
public class RequestController {//數組集合參數@RequestMapping("/listParam")public String listParam(@RequestParam List<String> hobby){System.out.println(hobby);return "OK";}
}
5. 日期參數
- @DateTimeFormat注解的pattern屬性中指定了哪種日期格式,前端的日期參數就必須按照指定的格式傳遞。
- 后端controller方法中,需要使用Date類型或LocalDateTime類型,來封裝傳遞的參數。
Controller方法:
@RestController
public class RequestController {//日期時間參數@RequestMapping("/dateParam")public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){System.out.println(updateTime);return "OK";}
}
6. JSON 參數
如果是比較復雜的參數,前后端通過會使用JSON格式的數據進行傳輸。 (JSON是開發中最常用的前后端數據交互方式)。
- 傳遞json格式的參數,在Controller中會使用實體類進行封裝。
- 封裝規則:JSON數據鍵名與形參對象屬性名相同,定義POJO類型形參即可接收參數。需要使用 @RequestBody標識(將JSON數據映射到形參的實體類對象中)。
實體類:Address
public class Address {private String province;private String city;//省略GET , SET 方法
}
實體類:User
public class User {private String name;private Integer age;private Address address;//省略GET , SET 方法
}
Controller方法:
@RestController
public class RequestController {//JSON參數@RequestMapping("/jsonParam")public String jsonParam(@RequestBody User user){System.out.println(user);return "OK";}
}
7. 路徑參數
Controller方法:
@RestController
public class RequestController {//路徑參數@RequestMapping("/path/{id}")public String pathParam(@PathVariable Integer id){System.out.println(id);return "OK";}
}
傳遞多個參數:
Controller方法:
@RestController
public class RequestController {//路徑參數@RequestMapping("/path/{id}/{name}")public String pathParam2(@PathVariable Integer id, @PathVariable String name){System.out.println(id+ " : " +name);return "OK";}
}