java?SpringBootWeb請求響應(yīng)舉例詳解
Servlet
用java編寫的服務(wù)器端程序
客戶端發(fā)送請求至服務(wù)器
服務(wù)器啟動(dòng)并調(diào)用Servlet,Servlet根據(jù)客戶端請求生成響應(yīng)內(nèi)容并將其傳給服務(wù)器
服務(wù)器將響應(yīng)返回給客戶端
javaweb的工作原理

在SpringBoot進(jìn)行web程序開發(fā)時(shí),內(nèi)置了一個(gè)核心的Servlet程序DispatcherServlet,稱之為核心控制器.
DispatcherServlet負(fù)責(zé)接收頁面發(fā)送的請求,根據(jù)資源鏈接執(zhí)行的規(guī)則,將請求再分發(fā)給部署在tomcat中的請求處理器Controller,請求處理器處理完請求之后,最終再由DispatcherServlet給瀏覽器響應(yīng)數(shù)據(jù).
瀏覽器發(fā)送請求到后端服務(wù)器tomcat后,tomcat會(huì)負(fù)責(zé)解析這些請求數(shù)據(jù),將解析后數(shù)據(jù)傳遞到Servlet程序的HttpServletRequest對象,意味著HttpServletRequest對象可以獲取到請求數(shù)據(jù).同時(shí)傳遞了一個(gè)HttpServletResponse對象,來給瀏覽器設(shè)置響應(yīng)數(shù)據(jù).
請求:瀏覽器->HTTP->tomcat(內(nèi)置servlet解析)->request對象->數(shù)據(jù)
響應(yīng):數(shù)據(jù)->response對象->servlet解析->HTTP->瀏覽器
請求
接收頁面?zhèn)鬟f來的請求數(shù)據(jù)
后端接收前端傳遞的數(shù)據(jù)
底層依賴于getset方法進(jìn)行取值(反射)
Postman
一款功能強(qiáng)大的網(wǎng)頁調(diào)試和發(fā)送網(wǎng)頁HTTP請求的Chrome插件
用于接口測試
接口測試:模擬前端發(fā)送請求,檢驗(yàn)數(shù)據(jù)傳輸?shù)恼_性
界面功能如下所示

后端資源鏈接不能重復(fù)
簡單參數(shù)
通過Servlet中提供的API HttpServletRequest可以獲取請求的相關(guān)信息
@RequestMapping("/simpleParam")
public String simpleParam(HttpServletRequest request){
String name = request.getParameter("name");
String age = request.getParameter("age");
System.out.println(name+" : "+age);
return "OK";
}
//request對象中包含請求數(shù)據(jù),可以直接通過getParameter()方法進(jìn)行獲取
使用SpringBoot方式
在SpringBoot環(huán)境中,對原始的API進(jìn)行了封裝,接收參數(shù)形式更加簡單.
可以直接定義同名參數(shù)接收數(shù)據(jù).
@RequestMapping("/simpleParam")
public String simpleParam(String name , Integer age ){
System.out.println(name+" : "+age);
return "OK";
}
使用postman進(jìn)行測試

快速提交帶參數(shù)的請求
參數(shù)名不一致
可以使用@RequestParam進(jìn)行映射
用法如下
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam("username") String name ,Integer age){
System.out.println(name+" : "+age);
return "OK";
}
//在形參前加上注解完成映射
實(shí)體參數(shù)
如果參數(shù)數(shù)量比較多,可以通過封裝到一個(gè)pojo對象的方式進(jìn)行數(shù)據(jù)封裝
參數(shù)名需與POJO屬性名一致
簡單實(shí)體對象
定義一個(gè)pojo實(shí)體類
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;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
在controller方法中傳入pojo對象接受數(shù)據(jù)
@RequestMapping("/simplePojo")
public String simplePojo(User user){
System.out.println(user);
return "OK";
}
//pojo對象接受與其屬性名相同的參數(shù)
復(fù)雜實(shí)體對象
在實(shí)體類中的一個(gè)或多個(gè)屬性為其他實(shí)體類的對象
封裝需要遵循如下規(guī)則:
請求參數(shù)名與形參對象的屬性名相同,即接收屬性中的實(shí)體類對象屬性時(shí),參數(shù)需要為對象.屬格式.

數(shù)組集合參數(shù)
數(shù)組參數(shù)
請求參數(shù)名和形參對象屬性名相同且請求參數(shù)為多個(gè).
即接收多個(gè)同名參數(shù)
傳遞形式:

集合
集合參數(shù)
請求參數(shù)名和形參集合對象名字相同且請求參數(shù)為多個(gè)
使用@RequestParam綁定參數(shù)關(guān)系
@RequestMapping("/listParam")
public String listParam(@RequestParam List<String> hobby){
System.out.println(hobby);
return "OK";
}
傳遞形式

日期參數(shù)
對日期類型的參數(shù)進(jìn)行封裝的時(shí)候,需要通過@DateTimeFormat注解,以及其中的pattern屬性來設(shè)置日期格式
pattern屬性中制定了前端傳遞參數(shù)時(shí)的規(guī)格.
@RequestMapping("/dateParam")
public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
System.out.println(updateTime);
return "OK";
}
傳遞形式

JSON參數(shù)
比較復(fù)雜的參數(shù)可以通過JSON格式進(jìn)行傳輸,JSON數(shù)據(jù)鍵名和形參對象屬性名相同,定義POJO類型形參即可接收參數(shù),controller方法需要使用@RequestBody注解
使用實(shí)體類對象接受
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user){
System.out.println(user);
return "OK";
}
傳遞形式

路徑參數(shù)
通過請求URL傳遞參數(shù),使用{}進(jìn)行標(biāo)識(shí),需要使用@PathVariable注解獲取路徑參數(shù)
參數(shù)盡量使用包裝類
@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+ " : " +name);
return "OK";
}
傳遞形式

響應(yīng)
@RestController注解
包含@Controller注解和@ResponseBody注解
Controller注解聲明類為控制器
ResponseBody將返回值解析為JSON或者XML格式
可以在controller類中響應(yīng)一個(gè)實(shí)體對象或者集合
eg:
響應(yīng)一個(gè)實(shí)體類對象
@RequestMapping("/simpleParam")
public String simpleParam( String name , Integer age){
User user = new User();
user.setName();
user.setAge();
return user;
}
響應(yīng)一個(gè)集合
@RequestMapping("/list")
public ArrayList<String> simpleParam( String name , Integer age){
ArrayList<String> list = new ArrayList<>();
return list;
}
無論響應(yīng)數(shù)據(jù)形式是什么,都應(yīng)該以Result形式返回(統(tǒng)一規(guī)范)
Result
{
Integer code//1:成功 0:失敗
String msg//響應(yīng)碼 描述字符串
Object data//使用Object類型可以接收任意數(shù)據(jù)
static Result success(data){
//返回成功時(shí)的result
}
static Result error(msg){
//返回失敗時(shí)的result
}
}
綜合案例(解析xml文件傳遞到前端頁面)
前端
頁面綁定js數(shù)據(jù),數(shù)據(jù)綁定鉤子函數(shù)請求的數(shù)據(jù)
鉤子函數(shù):
mounted() {
axios.get("/User").then(result=>(
this.tableData=result.data.data
))
},
在組件加載階段使用axios異步請求數(shù)據(jù)
后端
讀取解析xml文件
String file = 類名.class//獲取字節(jié)碼文件 .getClassLoader()//獲取類加載器 .getResource()//獲得資源 .File()//文件路徑 XmlParserUtils.parse(file)對xml進(jìn)行解析,得到一個(gè)對象集合
調(diào)用result里的success方法
返回成功對象
return Result.success(list);
分層解耦
三層架構(gòu)
數(shù)據(jù)訪問->邏輯訪問->請求處理
數(shù)據(jù)訪問:
負(fù)責(zé)業(yè)務(wù)數(shù)據(jù)的維護(hù)操作,包括增,刪,改,查等操作
邏輯處理:
負(fù)責(zé)業(yè)務(wù)邏輯處理的代碼
請求處理,響應(yīng)數(shù)據(jù):
負(fù)責(zé),接收頁面的請求,給頁面響應(yīng)數(shù)據(jù)
按照三個(gè)組成部分,將代碼分為三層
Controller(控制層)
接收前端發(fā)送的請求,對請求進(jìn)行處理,并響應(yīng)數(shù)據(jù)
Service(業(yè)務(wù)層)
處理具體的業(yè)務(wù)邏輯,對數(shù)據(jù)進(jìn)行處理
Dao/Mapper(數(shù)據(jù)訪問層/持久層)
負(fù)責(zé)數(shù)據(jù)的訪問操作,包含數(shù)據(jù)的增刪改查操作
分層解耦
內(nèi)聚:軟件中各個(gè)功能模塊內(nèi)部的功能聯(lián)系
耦合:軟件中各個(gè)層(模塊)之間的依賴關(guān)聯(lián)程度
IOC/DI技術(shù)(inversion of control/dependency injection)
IOC容器中管理的對象稱為bean
@Component(加在實(shí)現(xiàn)類上)
@Primary有多個(gè)實(shí)現(xiàn)類對象時(shí)優(yōu)先用被primary注解標(biāo)注的
把實(shí)現(xiàn)類對象直接放入IOC容器中(控制反轉(zhuǎn))
@Autowired(加在聲明對象語句上)
把IOC容器中的對象拿出來(依賴注入)
解決創(chuàng)建對象時(shí)產(chǎn)生的耦合
UserService a = new UserService(); //左側(cè)通過實(shí)現(xiàn)接口實(shí)現(xiàn)多態(tài)進(jìn)行解耦 //右側(cè)通過IOC/DI思想解決
Bean的聲明
把對象交給IOC容器管理,需要以如下注解代替@Component
Dao層->@Repository(自定義名字(默認(rèn)類名小寫))
Service層->@Service(自定義名字(默認(rèn)類名小寫))
Controller層->@Controller(自定義名字(默認(rèn)類名小寫))
其他類對象->@Componet(自定義名字(默認(rèn)類名小寫))
以上四大注解生效需要被組件掃描注解@ComponentScan掃描
默認(rèn)掃描范圍為引導(dǎo)類所在包以及其子包
Bean注入
@Primary優(yōu)先使用本類對象
@Qualifier(“str”)選擇名字為str的bean對象進(jìn)行使用
由SpringBoot框架提供
@Resource(name=“str”)選擇名字為str的bean對象使用
由java提供
rvice();
//左側(cè)通過實(shí)現(xiàn)接口實(shí)現(xiàn)多態(tài)進(jìn)行解耦
//右側(cè)通過IOC/DI思想解決
#### Bean的聲明
把對象交給IOC容器管理,需要以如下注解代替@Component
Dao層->@Repository(自定義名字(默認(rèn)類名小寫))
Service層->@Service(自定義名字(默認(rèn)類名小寫))
Controller層->@Controller(自定義名字(默認(rèn)類名小寫))
其他類對象->@Componet(自定義名字(默認(rèn)類名小寫))
以上四大注解生效需要被組件掃描注解@ComponentScan掃描
默認(rèn)掃描范圍為引導(dǎo)類所在包以及其子包
#### Bean注入
@Primary優(yōu)先使用本類對象
@Qualifier("str")選擇名字為str的bean對象進(jìn)行使用
由SpringBoot框架提供
@Resource(name="str")選擇名字為str的bean對象使用
由java提供總結(jié)
到此這篇關(guān)于java SpringBootWeb請求響應(yīng)的文章就介紹到這了,更多相關(guān)java SpringBootWeb請求響應(yīng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)將Object轉(zhuǎn)成List的五種方法
在Java中,將一個(gè)Object轉(zhuǎn)換為List是一個(gè)常見的需求,尤其是在處理集合操作和數(shù)據(jù)轉(zhuǎn)換時(shí),本文將詳細(xì)討論如何實(shí)現(xiàn)這一轉(zhuǎn)換,并提供一些代碼示例,需要的朋友可以參考下2025-03-03
MyBatis?ofType和javaType的區(qū)別說明
這篇文章主要介紹了MyBatis?ofType和javaType的區(qū)別,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
mybatis?resultMap之collection聚集兩種實(shí)現(xiàn)方式
本文主要介紹了mybatis?resultMap之collection聚集兩種實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09
Log4j關(guān)閉Spring和Hibernate日志打印方式
這篇文章主要介紹了Log4j關(guān)閉Spring和Hibernate日志打印方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12

