本系列為筆者學習JavaWeb的課堂筆記,視頻資源為B站黑馬程序員出品的《黑馬程序員JavaWeb開發教程,實現javaweb企業開發全流程(涵蓋Spring+MyBatis+SpringMVC+SpringBoot等)》,章節分布參考視頻教程,為同樣學習JavaWeb系列課程的同學們提供參考。
01 概述
DispatcherServlet
(前端控制器)架構
HttpServletRequest
(請求對象)負責獲取請求數據
HttpServletResponse
(響應對象)負責設置響應數據
Browser/server
(BS
架構)又稱瀏覽器/服務器架構模式,客戶端只需要瀏覽器,應用程序的邏輯和數據都存儲在服務端。
Client/Server
(CS
架構)又稱客戶端/服務器架構模式,需要自己下載安裝軟件。
02 Postman 接口測試
Postman
是一款功能強大的網頁調試與發送網頁HTTP
請求的Chrome
插件。
03 簡單參數
補充:SpringBoot
入門程序格式
① 原始方式
在原始的web
程序中,獲取請求參數,需要通過HttpServletRequest
對象手動獲取。
② SpringBoot
方式
注:如果方法形參名稱與請求參數不匹配,可以使用@RequestParam
完成映射。
@RestController
public class RequestController {//原始方式@RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){//獲取請求參數String name = request.getParameter("name");String ageStr = request.getParameter("age");int age = Integer.parseInt(ageStr);System.out.println(name+ ":" + age);return "OK";}//springboot方式@RequestMapping("/simpleParam")public String simpleParam(String name, Integer age){System.out.println(name+ ":" + age);return "OK";}@RequestMapping("/simpleParam")public String simpleParam(@RequestParam(name = "name", required = false) String username, Integer age){System.out.println(username+ ":" + age);return "OK";}
}
04 實體參數
簡單實體對象:請求參數名與形參對象屬性名相同,定義POJO
接收即可。
復雜實體對象:請求參數名與形參對象屬性名相同,按照對象層次結構關系即可接收嵌套POJO
屬性參數。
@RestController
public class RequestController {@RequestMapping("/simplePojo")public String simplePojo(User user){System.out.println(user);return "OK";}@RequestMapping("/complexPojo")public String complexPojo(User user){System.out.println(user);return "OK";}
}
package com.itheima.pojo;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 +'}';}
}
package com.itheima.pojo;public class Address {private String province;private String city;@Overridepublic String toString() {return "Address{" +"province='" + province + '\'' +", city='" + 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;}
}
05 數組集合參數
數組參數:請求參數名與形參數組名稱相同且請求參數為多個,定義數組類型形參即可接收參數。
集合參數:請求參數名與形參集合名稱相同且請求參數為多個,@RequestParam
綁定參數關系。
@RestController
public class RequestController {
@RequestMapping("/arrayParam")public String arrayParam(String[] hobby){System.out.println(Arrays.toString(hobby));return "OK";}@RequestMapping("/listParam")public String listParam(@RequestParam List<String> hobby){System.out.println(hobby);return "OK";}
}
06 日期參數
日期參數:使用@DateTimeFormat
注解完成日期參數格式轉換。
@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";}
}
07 JSON 參數
JSON
參數:JSON
數據鍵名與形參對象屬性名相同,定義POJO
類型形參即可接收參數,使用@RequestBody
標識。
@RestController
public class RequestController {@RequestMapping("/jsonParam")public String jsonParam(@RequestBody User user){System.out.println(user);return "OK";}
}
08 路徑參數
路徑參數:通過請求URL
直接傳遞參數,使用{...}
來標識該路徑參數,需要使用@PathVariable
獲取路徑參數。
@RestController
public class RequestController {@RequestMapping("/path/{id}")public String pathParam(@PathVariable Integer id){System.out.println(id);return "OK";}@RequestMapping("/path/{id}/{name}")public String pathParam2(@PathVariable Integer id , @PathVariable String name){System.out.println(id);System.out.println(name);return "OK";}
}
09 響應
@ResponseBody
類型:方法注解、類注解
位置:Controller
方法上/類上
作用:將方法返回值直接響應,如果返回值類型是實體對象/集合,將會轉換為JSON
格式響應。
說明:@RestController=@Controller+@ResponseBody
@RestController
public class ResponseController {@RequestMapping("/hello")public String hello(){System.out.println("Hello World ~");return "Hello World ~";}@RequestMapping("/getAddr")public Address getAddr(){Address addr = new Address();addr.setProvince("廣東");addr.setCity("深圳");return addr;}@RequestMapping("/listAddr")public List<Address> listAddr(){List<Address> list = new ArrayList<>();Address addr = new Address();addr.setProvince("廣東");addr.setCity("深圳");Address addr2 = new Address();addr2.setProvince("陜西");addr2.setCity("西安");list.add(addr);list.add(addr2);return list;}
}
10 統一響應對象
@RestController
public class ResponseController {@RequestMapping("/hello")public Result hello(){System.out.println("Hello World ~");//return new Result(1,"success","Hello World ~");return Result.success("Hello World ~");}@RequestMapping("/getAddr")public Result getAddr(){Address addr = new Address();addr.setProvince("廣東");addr.setCity("深圳");return Result.success(addr);}@RequestMapping("/listAddr")public Result listAddr(){List<Address> list = new ArrayList<>();Address addr = new Address();addr.setProvince("廣東");addr.setCity("深圳");Address addr2 = new Address();addr2.setProvince("陜西");addr2.setCity("西安");list.add(addr);list.add(addr2);return Result.success(list);}
}
11 案例:獲取員工數據,返回統一響應結果,在頁面渲染展示
① 在pom.xml
文件中引入dom4j
的依賴,用于解析XML
文件
② 引入資料中提供的解析XML
的工具類XMLParseUtils
、對應的實體類Emp.xml
③ 引入資料中提供的靜態頁面文件,放在resources
下的static
目錄下
注:Springboot
項目的靜態資源(html, css, js
等前端資源)默認存放目錄為:classpath:/static、classpath:/public、classpath:/resources
。
④ 編寫Controller
程序,處理請求,響應數據
package com.itheima.controller;import com.itheima.pojo.Emp;
import com.itheima.pojo.Result;
import com.itheima.utils.XmlParserUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class EmpController {@RequestMapping("/listEmp")public Result list(){//1. 加載并解析emp.xmlString file = this.getClass().getClassLoader().getResource("emp.xml").getFile();System.out.println(file);List<Emp> empList = XmlParserUtils.parse(file, Emp.class);//2. 對數據進行轉換處理 - gender, jobempList.stream().forEach(emp -> {//處理 gender 1: 男, 2: 女String gender = emp.getGender();if("1".equals(gender)){emp.setGender("男");}else if("2".equals(gender)){emp.setGender("女");}//處理job - 1: 講師, 2: 班主任 , 3: 就業指導String job = emp.getJob();if("1".equals(job)){emp.setJob("講師");}else if("2".equals(job)){emp.setJob("班主任");}else if("3".equals(job)){emp.setJob("就業指導");}});//3. 響應數據return Result.success(empList);}}