沒有后臺的網(wǎng)站怎么做排名搜索風(fēng)云榜入口
目錄
1. 關(guān)于json
2.? 通過Maven倉庫,將Jackson下載導(dǎo)入到項目中
3.?使用Jackson
3.1 關(guān)于readValue方法
3.2?關(guān)于Request.class類對象
3.3 關(guān)于request對象的屬性類型
3.4 關(guān)于writeValueAsString
前端向后端傳遞參數(shù)通常有三種方法:
第一種:
【JavaEE】_前端使用GET請求的queryString向后端傳參-CSDN博客
第二種:
【JavaEE】_前端POST請求借助form表單向后端傳參-CSDN博客
第三種:
使用POST請求的body部分向后端傳參,且body格式為json格式;
本篇介紹第三種方法;
1. 關(guān)于json
1. body部分的格式就是json;
此時請求報頭部分有:Content - Type : application / json
2. 對于通過GET請求的query string部分傳參和通過POST請求的body的form表單格式傳參,是servlet天然支持的,但是對于POST請求的body使用json格式傳參,servlet本身并不支持,需要引入額外的第三方庫;
3. json本質(zhì)也是鍵值對,但規(guī)則和form表單不同,解析方式也不同。且json支持嵌套,手寫解析json并不容易;
4. json的第三方庫非常豐富,本專欄使用jackson。(spring官方推薦jackson,被spring集成)
代碼編寫詳情如下:
2.? 通過Maven倉庫,將Jackson下載導(dǎo)入到項目中
選擇Jackson Databind版本:
復(fù)制并粘貼至pom.xml中:
,引入依賴后,pom.xml內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>Servlet</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.15.0</version></dependency></dependencies><packaging>war</packaging><build><finalName>Servlet</finalName></build></project>
如果導(dǎo)入緩慢或失敗,可以點擊Maven面板的刷新按鈕,此處不再贅述,若對導(dǎo)入依賴仍有疑問,請查看本專欄Servlet程序編寫方法一文,鏈接如下:
【JavaEE】_Servlet程序的編寫方法-CSDN博客
3.?使用Jackson
1. Jackson的重點為:一個對象和兩個方法;
一個對象:ObjectMapper類;
兩個方法:readValue方法和WriteAsString方法;
2. 使用一個ObjcectMapper類(對象映射器),可以把json字符串映射為一個Java對象,或把一個java對象映射成json字符串;
在網(wǎng)絡(luò)傳輸中,使用的是json字符串;
在實現(xiàn)業(yè)務(wù)邏輯的java代碼中,使用的是java對象;
站在服務(wù)器角度,就需要把獲取到的請求(json字符串)先映射為java對象,
再進行一系列業(yè)務(wù)邏輯處理。
處理完畢后,還需要把處理完的java對象再映射回json字符串,通過響應(yīng)返回;
3. json字符串向java對象的映射:json字符串——>java對象:使用readValue方法;
? ? java對象向json字符串的映射:java對象——>json字符串:使用writeValueAsString方法;
現(xiàn)約定請求格式如下:
POST /json
Content-Type: application/json{username:"zhangsan",password:"123"
}
約定響應(yīng)格式如下:(也按照json來組織)
{ok: true
}
.java文件內(nèi)容如下:
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
class Request{public String username;public String password;
}
class Response{public boolean ok;
}
@WebServlet("/Json")
public class JsonParameterServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// 1. 獲取請求body,并將其按照json格式解析為請求java對象ObjectMapper objectMapper = new ObjectMapper();Request request = objectMapper.readValue(req.getInputStream(), Request.class);System.out.println("username: "+ request.username);System.out.println("password: "+ request.password);// 2. 構(gòu)造響應(yīng)java對象,并將其轉(zhuǎn)為json格式字符串Response response = new Response();response.ok =true;String respJson = objectMapper.writeValueAsString(response);resp.setContentType("application/json; charset=utf8");resp.getWriter().write(respJson);}
}
使用postman構(gòu)造一個POST請求發(fā)送:
獲取到的響應(yīng)如下:
在服務(wù)器日志端也可獲取到前端的參數(shù):
3.1 關(guān)于readValue方法
1. 把body的流對象(方法的第一個參數(shù))直接傳給readValue,這個方法內(nèi)部就會讀取InputStream中的所有數(shù)據(jù)(HTTP請求中的body,即json字符串);
2. 嘗試把json字符串解析成Map(鍵值對);
3. 把Map轉(zhuǎn)換成java對象(方法的第二個參數(shù));
readValue內(nèi)部就可以通過反射API創(chuàng)建出Request.class實例,并且根據(jù)Request.class提供的屬性的名字(username和password)來查詢上述Map,把得到的結(jié)果(zhangsan和123)賦值給對應(yīng)的屬性(username和password),從而獲取到了一個完整的Request對象;
請注意反射屬于非常規(guī)操作,除非萬不得已,在開發(fā)中不要隨便使用反射;
3.2?關(guān)于Request.class類對象
對于一個java代碼,會被javac編譯成.class文件(二進制),這個文件包含了.java源代碼中的核心信息,比如類的名稱、屬性及其類型、方法及其參數(shù)與類型、父類、實現(xiàn)的接口、注解等等;
當(dāng)java進程啟動,就會讀取.class文件,把這些二進制內(nèi)容讀到內(nèi)存并進行解析,這個過程稱為類加載。
類加載完畢后,就會在內(nèi)存中獲取到一個類對象。
故而.class文件中的所有信息也都在類對象中了。
可以將類對象理解為一個類的圖紙,后續(xù)要構(gòu)造這個類的實例都是基于類對象來進行展開的;
3.3 關(guān)于request對象的屬性類型
在本例中,Request對象的兩個屬性均使用public修飾:
class Request{public String username;public String password;
}
如果要將屬性被private修飾,必須提供對應(yīng)的Getter和Setter方法,
否則Jackson只會處理public屬性;
3.4 關(guān)于writeValueAsString
可以將writeValueAsString視為readValue的反向操作,這個方法可以把一個java對象映射成json字符串;
1. 通過傳入的參數(shù)獲取到類對象,通過反射獲取到屬性(ok);
2. 根據(jù)屬性名獲取屬性值(true);
3. 把上述屬性名與屬性值按照json格式構(gòu)造成字符串(reqJson)作為返回值;