項目架構(gòu)
項目介紹
教育后臺管理系統(tǒng)是提供給相關(guān)業(yè)務(wù)人員使用的一個后臺管理系統(tǒng),業(yè)務(wù)人員可以在這個后臺管理系統(tǒng)中,對課程信息、講師信息、 學(xué)員信息等數(shù)據(jù)進行維護。
課程管理模塊
課程管理
- 新建課程
- 條件查詢:課程名稱,狀態(tài)
- 課程信息列表展示:ID,課程名稱,價格,排序,狀態(tài)
- 課程狀態(tài)的切換:上架,下架
營銷信息 (營銷信息其實就是課程的具體信息)
- 回顯對應(yīng)課程的詳細信息
- 修改課程信息,包含了圖片上傳
配置課時(配置課時指的就是對課程內(nèi)容的配置,課程內(nèi)容就包括了章節(jié)信息和課時信息)
- 添加章節(jié)
- 以樹形結(jié)構(gòu)的下拉列表方式 展示課程對應(yīng)的章節(jié)與課時信息
- 修改章節(jié)
- 章節(jié)章節(jié)狀態(tài)的設(shè)置
前后端分離開發(fā)
前后端分離已成為互聯(lián)網(wǎng)項目開發(fā)的業(yè)界標準使用方式,將前端和后端的開發(fā)進行解耦。并且前后端分離會為以后的大型分布式架構(gòu)、微服務(wù)架構(gòu)、多端化服務(wù)(各種客戶端,比如瀏覽器、車載終端、安卓、IOS 等)打下堅實的基礎(chǔ)。
前后端分離的核心思想就是前端HTML頁面通過AJAX調(diào)用后端的API接口,并通過JSON數(shù)據(jù)進行交互。
接口文檔
前后端分離開發(fā)方式需要由前后端工程師共同定義接口;編寫接口文檔之后都根據(jù)這個接口文檔進行開發(fā),到項目結(jié)束前都要一直進行接口文檔的維護。
一個接口的描述至少包括下面幾項:
- 名稱: findCourseList
- 描述: 根據(jù)條件查詢課程信息
- URL: http://localhost:8080/edu_home/course/
- 請求方式: GET
- 請求參數(shù) methodName:"findCourseList";
- 響應(yīng)結(jié)果
{ "status": "0", "msg": "success"}
前后端耦合的缺陷 (以 JSP 為例)
- UI 出好設(shè)計圖之后,前端開發(fā)工程師只負責將設(shè)計圖切成 HTML,需要由 Java 開發(fā)工程師來將 HTML 套成 JSP 頁面,修改問題的時候需要雙方協(xié)同開發(fā),效率低下。
- JSP 頁面必須要在支持 Java 的 WEB 服務(wù)器上運行(如 Tomcat、Jetty 等),無法使用 Nginx 等(官方宣稱單實例 HTTP 并發(fā)高達 5 W),性能提升不上來。
- 第一次請求 JSP,必須要在 WEB 服務(wù)器中編譯成 Servlet,第一次運行會較慢。 之后的每次請求 JSP 都是訪問 Servlet 再用輸出流輸出的 HTML 頁面,效率沒有直接使用 HTML 高。
前后端分離的優(yōu)勢
- 前后端分離的模式下,如果發(fā)現(xiàn) Bug,可以快速定位是誰的問題,不會出現(xiàn)互相踢皮球的現(xiàn)象
- 前后端分離可以減少后端服務(wù)器的并發(fā)/負載壓力。除了接口以外的其他所有HTTP請求全部轉(zhuǎn)移到前端 Nginx 上,接口的請求則轉(zhuǎn)發(fā)調(diào)用 Tomcat.
- 前后端分離的模式下,即使后端服務(wù)器暫時超時或宕機了,前端頁面也會正常訪問,只不過數(shù)據(jù)刷不出來而已。
- 前后端分離會更加合理的分配團隊的工作量,減輕后端團隊的工作量,提高了性能和可擴展性。
技術(shù)選型
前端技術(shù)選型
Vue.js – 是一套用于構(gòu)建用戶界面的漸進式 JavaScript 框架
Element UI 庫 – 是餓了么前端出品的基于 Vue.js 的后臺組件庫,方便程序員進行頁面快速布局和構(gòu)建
node.js – 運行在服務(wù)端的 JavaScript 運行環(huán)境
axios – 對 ajax 的封裝, 簡單來說就是 ajax 技術(shù)實現(xiàn)了局部數(shù)據(jù)的刷新,axios 實現(xiàn)了對 ajax 的封裝
后端技術(shù)選型
Web 層:Servlet 前端控制器,F(xiàn)ilter 過濾器,BeanUtils 數(shù)據(jù)封裝
Service 層:業(yè)務(wù)邏輯處理
Dao 層:MySQL 數(shù)據(jù)庫,Druid 數(shù)據(jù)庫連接池,DBUtils 操作數(shù)據(jù)庫
項目開發(fā)環(huán)境
開發(fā)工具:后端 IntelliJ IDEA,前端 VS code,數(shù)據(jù)庫 SQLYog
開發(fā)環(huán)境:JDK 11,Maven 3.6.3,MySQL 5.7
Maven 項目管理工具
Maven 介紹
Maven 是一個跨平臺的項目管理工具。作為 Apache 組織的一個頗為成功的開源項目,其主要服務(wù)于基于 Java 平臺的項目創(chuàng)建,依賴管理和項目信息管理。Maven 是 Apache 的頂級項目,意為“專家,內(nèi)行”,它是一個項目管理的工具,Maven 自身是純 java 開發(fā)的,可以使用 Maven 對 java 項目進行構(gòu)建、依賴管理。
依賴管理:依賴指的就是項目中需要使用的第三方 Jar 包, 一個大一點的工程往往需要幾十上百個 Jar 包,按照之前的方式,每使用一種 Jar 就需要導(dǎo)入到工程中,還要解決各種 Jar 沖突的問題;而 Maven 可以對 Jar 包進行統(tǒng)一的管理,包括快速引入 Jar 包,以及對使用的 Jar 包進行統(tǒng)一的版本控制。
一鍵構(gòu)建項目:之前創(chuàng)建項目需要確定項目的目錄結(jié)構(gòu),比如 src 存放 Java 源碼,resources 存放配置文件,還要配置環(huán)境比如 JDK 的版本等等,如果有多個項目就需要每次搞一套配置,十分麻煩;而 Maven 提供了一個標準化的 Java 項目結(jié)構(gòu),可以通過 Maven 快速創(chuàng)建一個標準的 Java 項目。
Maven 的使用
下載地址:http://maven.apache.org/download.cgi
Maven 下載后,將 Maven 解壓到一個沒有中文沒有空格的路徑下,解壓后目錄結(jié)構(gòu)如下:
- bin:存放了 maven 的命令
- boot:存放了一些 maven 本身的引導(dǎo)程序,如類加載器等
- conf:存放了 maven 的一些配置文件,如 setting.xml 文件
- lib:存放了 maven 本身運行所需的一些 jar 包
配置 Maven 環(huán)境變量:配置 MAVEN_HOME ,變量值是 maven 安裝的路徑;將 MAVEN_HOME 添加到 Path 系統(tǒng)變量。
最后通過命令行運行 mvn -v 命令檢查 maven 是否安裝成功。
Maven 倉庫
Maven 中的倉庫是用來存放 maven 構(gòu)建的項目和各種依賴的(Jar包)。
倉庫分類
- 本地倉庫:位于自己計算機中的倉庫,用來存儲從遠程倉庫或中央倉庫下載的插件和 jar 包。
- 遠程倉庫:需要聯(lián)網(wǎng)才可以使用的倉庫,阿里提供了一個免費的 maven 遠程倉庫。
- 中央倉庫:在 maven 軟件中內(nèi)置一個遠程倉庫地址 http://repo1.maven.org/maven2,它是中央倉庫,服務(wù)于整個互聯(lián)網(wǎng),它是由 Maven 團隊自己維護,里面存儲了非常全的 jar 包,它包含了世界上大部分流行的開源項目構(gòu)件。
本地倉庫的配置
Maven 倉庫默認是在 C 盤的 .m2 目錄下,所以這里要重新配置到別的盤符中。
在 Maven 安裝目錄中,進入 conf 文件夾, 可以看到一個 settings.xml 文件;打開 settings.xml 文件,在 localRepository 標簽下配置倉庫目錄。
阿里云遠程倉庫配置
打開 settings.xml,找到 <mirrors> 標簽,將如下內(nèi)容復(fù)制到 <mirrors> 中即可:
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
創(chuàng)建 Maven 項目
IDEA 中配置 Maven
打開 IDEA 創(chuàng)建一個新的 project,然后選擇 File –> Settings –> 搜素 maven,修改默認配置配置。
創(chuàng)建 Maven 工程
在 IDEA 中配置好 maven 后使用 maven 快速的去構(gòu)建一個 Java Web 項目,不選擇 archetype。
Maven目錄說明:
src/main/java —— 存放項目的 .java 文件 src/main/resources —— 存放項目資源文件,如數(shù)據(jù)庫的配置文件 src/test/java —— 存放所有單元測試 .java 文件,如 JUnit 測試類 target —— 項目輸出位置,編譯后的 class 文件會輸出到此目錄 pom.xml —— maven 項目核心配置文件
Maven 工程改造
當前創(chuàng)建的 maven 項目是一個 普通的 Java 項目,不是 web 項目,所以需要改造。
- 在 main 目錄下創(chuàng)建一個 webapp 文件夾
- 選擇 project Structure —> facets—> 點擊 號添加 web —> 選擇當前工程 hello_maven
- 根據(jù)新建的 webapp 目錄,來修改 Deployment 和 Resources 的路徑信息
pom.xml 核心配置文件
一個 maven 工程都有一個 pom.xml 文件,通過 pom.xml 文件定義項目的信息、項目依賴、引入插件等等。
- 此時,在項目中直接創(chuàng)建一個 Servlet,會出現(xiàn)缺少 jar 包報錯;要解決問題,就要將 servlet-api-xxx.jar 包放進來;而作為 maven 工程應(yīng)當添加 servlet 的坐標,從而導(dǎo)入它的 jar。
- 在 pom.xml 文件中可以引入依賴包的坐標
<?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>com.renda</groupId> <artifactId>hello_maven</artifactId> <version>1.0-SNAPSHOT</version>? <!-- import package coordinates --> <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> </dependencies></project>
一個 Maven 工程就是由 groupId,artifactId 和 version 作為唯一標識;所以在引用其他第三方庫的時候,也是通過這三個變量確定。
坐標的概念:在 maven 中坐標就是為了定位一個唯一確定的 jar 包;maven 擁有大量的構(gòu)建,需要一個統(tǒng)一規(guī)范來唯一標識一個構(gòu)建。
Maven 坐標主要組成 – 確定一個 jar 在互聯(lián)網(wǎng)位置:
groupId - 定義當前 Maven 組織名稱,通常是公司名artifactId - 定義實際項目名稱version - 定義當前項目的當前版本packaging - 打包類型:打成 jar 包或者打成 war 包
maven 的依賴管理,是對項目所依賴的 jar 包進行統(tǒng)一管理:
dependencies表示依賴關(guān)系使用 <dependency> 聲明一個依賴后,Maven 就會自動下載這個依賴包
坐標的來源方式:
- 輸入網(wǎng)址,進行查詢:https://mvnrepository.com/
- 使用 IDEA 在 pom.xml 文件中右鍵選擇 Generate –> Dependency –> 搜索輸入名稱
添加插件
在 pom.xml 中加入如下配置:
<project ...> ...? <!-- properties 是全局設(shè)置,可以設(shè)置整個 maven 項目的編譯器 JDK 版本 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 重點 --> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties>? <!-- 在 build 中需要指定一下項目的 JDK 編譯版本,maven 默認使用 1.5 版本進行編譯 --> <!-- 注意 build 與 dependencies 是平級關(guān)系,標簽不要寫錯位置 --> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <release>11</release> </configuration> </plugin> </plugins> </build></project>
運行 Maven 項目
- ServletDemo01
@WebServlet("/demo01")public class ServletDemo01 extends HttpServlet {? @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); }? @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("Hello Maven!"); }}
- index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html> <head> <title>Title</title> </head> <body> <p>This is My First Maven Project</p> </body></html>
- 配置 Tomcat,部署項目。
- 運行項目, 默認訪問 index.jsp。
- 訪問 Servlet:http://localhost:8080/hello_maven/demo01。
Maven 的常用命令
生命周期:使用 maven 完成項目的構(gòu)建,項目構(gòu)建包括:清理、編譯、測試、部署等過程。
Maven 通過執(zhí)行一些簡單命令即可實現(xiàn)生命周期的各個過程:
- mvn compile – 完成編譯操作 , 執(zhí)行完畢后,會生成 target 目錄,該目錄中存放了編譯后的字節(jié)碼文件。
- mvn clean – 執(zhí)行完畢后,會將 target 目錄刪除。
- mvn test – 執(zhí)行完畢后,會在target目錄中生成三個文件夾:surefire、surefire-reports(測試報告)、test-classes(測試的字節(jié)碼文件)
- mvn package – 完成打包操作;執(zhí)行完畢后,會在 target 目錄中生成一個文件,該文件可能是 jar 或 war。
- mvn install – 將打好的 jar 包安裝到本地倉庫的操作,執(zhí)行完畢后,會在本地倉庫中出現(xiàn)安裝后的 jar 包,方便其他工程引用。
IDEA 界面左側(cè)有一個 maven 視圖,里面有對應(yīng)的命令插件,可以執(zhí)行上面表格中的命令。
依賴范圍介紹
A 依賴 B,需要在 A 的 pom.xml 文件中添加 B 的坐標,添加坐標時需要指定依賴范圍:
- compile – 編譯范圍,指 A 在編譯時依賴 B,此范圍為默認依賴范圍。編譯范圍的依賴會用在編譯、測試、運行,由于運行時需要所以編譯范圍的依賴會被打包。
- provided – 只有在當 JDK 或者一個容器已提供該依賴之后才使用, provided 依賴在編譯和測試時需要,在運行時不需要,比如:servlet API 被 Tomcat 容器提供。
- runtime – 在運行和測試系統(tǒng)的時候需要,但在編譯的時候不需要。比如:JDBC 的驅(qū)動包。由于運行時需要所以 runtime 范圍的依賴會被打包。
- test – 在編譯和運行時都不需要,它們只有在測試編譯和測試運行階段可用, 比如:Junit。由于運行時不需要所以 test 范圍依賴不會被打包。
- system – 與 provided 類似,但是必須顯式的提供一個對于本地系統(tǒng)中 JAR 文件的路徑,需要指定 system Path 磁盤路徑,system 依賴不推薦使用。
后臺系統(tǒng)搭建
課程管理模塊功能分析
課程管理:展示課程列表、根據(jù)課程名和狀態(tài)進行查詢、新建課程、課程上架與下架。
營銷信息:回顯課程信息、修改課程信息(包含了圖片上傳)。
配置課時(一個課程對應(yīng)多個章節(jié),一個章節(jié)有多個課時):以樹形結(jié)構(gòu)的下拉框形式展示課程對應(yīng)的章節(jié)與課時信息、添加章節(jié)功能、修改章節(jié)功能、修改章節(jié)狀態(tài)功能。
課程管理模塊表設(shè)計
一個課程信息表對多個課程章節(jié)表
一個課程章節(jié)表對多個課時信息表
一個課時信息表對一個課程媒體表
環(huán)境搭建
使用 Maven 快速構(gòu)建工程。
導(dǎo)入 pom.xml。
導(dǎo)入工具類及配置文件。
導(dǎo)入實體類。
在項目中添加 Lombok 依賴 jar,Lombok 常用注解:
- @Getter/@Setter: 作用類上,生成所有成員變量的 getter / setter 方法
- @ToString : 作用于類,覆蓋默認的 toString() 方法,可以通過 of 屬性限定顯示某些字段,通過 exclude 屬性排除某些字段
- @AllArgsConstructor:生成全參構(gòu)造器
- @NoArgsConstructor:生成無參構(gòu)造器
- @Data: 該注解使用在類上,該注解會提供 getter、setter、equals、hashCode、toString 方法。
導(dǎo)入表對應(yīng)的實體類。
通用 Servlet
每個模塊下都有很多的功能,比如課程模塊的新建課程,上架課程,下架課程,根據(jù)課程名查詢等等功能 ,每一個功能都是一個 Servlet。但是 Servlet 太多了不好管理,而且 Servlet 越多服務(wù)器運行就越慢,資源消耗就越多。
Servlet 對應(yīng)模塊
使用一個 Servlet 對應(yīng)一個模塊的方式進行開發(fā)
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>Title</title></head><body> <a href="${pageContext.request.contextPath}/test?methodName=addCourse">新建課程</a> <a href="${pageContext.request.contextPath}/test?methodName=findByName">根據(jù)課程名查詢</a> <a href="${pageContext.request.contextPath}/test?methodName=findByStatus">根據(jù)課程狀態(tài)查詢</a></body></html>
TestServlet
/** * 模擬課程模塊,模塊中有很多功能 * */@WebServlet("/test")public class TestServlet extends HttpServlet { /** * doGet() 方法作為調(diào)度器 控制器,根據(jù)請求的功能不同,調(diào)用對應(yīng)的方法 * * */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 獲取要調(diào)用的方法名 String methodName = req.getParameter("methodName"); // 判斷執(zhí)行對應(yīng)的方法 if("addCourse".equals(methodName)){ addCourse(req,resp); }else if("findByStatus".equals(methodName)){ findByName(req,resp); }else if("findByStatus".equals(methodName)){ findByStatus(req,resp); }else{ System.out.println("訪問的功能不存在!"); } }? @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); }?? /** * 模塊對應(yīng)的功能部分 * */ public void addCourse(HttpServletRequest req, HttpServletResponse resp){ System.out.println("新建課程"); }? public void findByStatus(HttpServletRequest req, HttpServletResponse resp){ System.out.println("根據(jù)狀態(tài)查詢"); }? public void findByName(HttpServletRequest req, HttpServletResponse resp){ System.out.println("根據(jù)課程名稱查詢"); }}
提高代碼的可維護行
可以使用反射去對代碼進行優(yōu)化,提升代碼的可維護性/可擴展性
/** * 對應(yīng)的是課程管理模塊 */@WebServlet("/test")public class TestServlet extends BaseServlet {? /** * 根據(jù)請求功能不同,調(diào)用不同的方法,起到調(diào)度器的作用。 */ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 獲取參數(shù):要訪問的方法名 String methodName = req.getParameter("methodName"); if (methodName != null) { // 使用反射方式提升代碼的可維護性 try { // 獲取字節(jié)碼對象 Class aClass = this.getClass(); // 根據(jù)傳入的方法名獲取對應(yīng)的方法對象 Method method = aClass.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); method.invoke(this, req, resp); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); System.out.println("請求的功能不存在"); } } }?? @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); }? /** * 添加課程 */ public void addCourse(HttpServletRequest req, HttpServletResponse resp) { System.out.println("新建課程"); }? /** * 根據(jù)課程名查詢 */ public void findByName(HttpServletRequest req, HttpServletResponse resp) { System.out.println("根據(jù)課程名查詢"); }? /** * 根據(jù)課程狀態(tài)查詢 */ public void findByStatus(HttpServletRequest req, HttpServletResponse resp) { System.out.println("根據(jù)課程狀態(tài)查詢"); }}
抽取通用的 BaseServlet
將反射相關(guān)的代碼抽取到一個類中 BaseServlet,讓 BaseServlet 去繼承 HTTPServlet
BaseServlet
public class BaseServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 獲取參數(shù):要訪問的方法名 String methodName = req.getParameter("methodName"); if (methodName != null) { // 使用反射方式提升代碼的可維護性 try { // 獲取字節(jié)碼對象 Class aClass = this.getClass(); // 根據(jù)傳入的方法名獲取對應(yīng)的方法對象 Method method = aClass.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); method.invoke(this, req, resp); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); System.out.println("請求的功能不存在"); } } }?? @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); }}
TestServlet 繼承 BaseServlet
@WebServlet("/test")public class TestServlet extends BaseServlet {? /** * 添加課程 */ public void addCourse(HttpServletRequest req, HttpServletResponse resp) { System.out.println("新建課程"); }? /** * 根據(jù)課程名查詢 */ public void findByName(HttpServletRequest req, HttpServletResponse resp) { System.out.println("根據(jù)課程名查詢"); }? /** * 根據(jù)課程狀態(tài)查詢 */ public void findByStatus(HttpServletRequest req, HttpServletResponse resp) { System.out.println("根據(jù)課程狀態(tài)查詢"); }?}
JSON
JSON 簡述
JSON (JavaScript Object Notation) – JavaScript 對象表示法(JSON 源于 JS)。
- JSON 是一種輕量級的數(shù)據(jù)交換格式
- JSON 采用完全獨立于語言的文本格式,不同的編程語言 JSON 數(shù)據(jù)是一致的
- JSON 易于人閱讀和編寫,也易于機器解析和生成(一般用于提升網(wǎng)絡(luò)傳輸速率)
對比 XML 與 JSON
XML – 可擴展標記語言,是一種用于標記電子文件使其具有結(jié)構(gòu)性的標記語言。
JSON – 是一種輕量級的數(shù)據(jù)交換格式。
相同點: 它們都可以作為一種數(shù)據(jù)交換格式。
區(qū)別:
- XML 是重量級的,JSON 是輕量級的,XML 在傳輸過程中比較占帶寬,JSON 占帶寬少,易于壓縮。
- XML 和 JSON 都用在項目交互下,XML 多用于做配置文件,JSON 用于數(shù)據(jù)交互
- JSON 獨立于編程語言存在,任何編程語言都可以去解析 JSON
JSON 語法格式
{ "id" : 1, "name" : "張小明", "age" : 25}
- 由 {} 括起來
- 數(shù)據(jù)以"鍵 : 值"對的形式出現(xiàn)(鍵多以字符串形式出現(xiàn);值可取字符串,數(shù)值,或者其他 JSON 對象)
- 每兩個"鍵 : 值"對以逗號分隔(最后一個"鍵 : 值"對省略逗號)
- 參數(shù)值如果是 String 類型,就必須加引號;如果是數(shù)字類型,引號可加可不加
// 自定義 JSON 數(shù)據(jù)格式var person = {"name":"Mary", "sex":"女", "age":19};console.log(person);?// 數(shù)組格式var persons = {"person" : [{"name":"Mary", "sex":"女", "age":19}, {"name":"jack", "sex":"男", "age":20}]};console.log(persons)?// 集合格式var personList = [{"name":"小紅", "sex":"女", "age":19}, {"name":"小明", "sex":"男", "age":20}];console.log(personList)
JSON 數(shù)據(jù)的轉(zhuǎn)換
前后端的 AJAX 通訊用的都是 JSON 格式,所以在開發(fā)的過程中經(jīng)常會涉及到 JSON 數(shù)據(jù)的轉(zhuǎn)換
FastJson 介紹
Fastjson 是一個 Java 庫,可以將 Java 對象轉(zhuǎn)換為 JSON 格式,當然它也可以將 JSON 字符串轉(zhuǎn)換為 Java 對象。
FastJson 特點如下:
- 能夠支持將 java bean 序列化成 JSON 字符串,也能夠?qū)?JSON 字符串反序列化成 Java bean
- 速度快
- 無其他包的依賴,使用比較方便
FastJson 的使用
在 Maven 項目中使用 FastJson 庫,需要提前在 Maven 的配置文件中添加此 FastJson 包的依賴
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.3</version></dependency>?<dependency> <groupId>com.colobu</groupId> <artifactId>fastjson-jaxrs-json-provider</artifactId> <version>0.3.1</version></dependency>
將 Java 對象轉(zhuǎn)換為 JSON 格式
定義一個名為 Person 的 JavaBean 類
public class Person { private String username;? private int age;? private String birthday;? // getter and setter ...}
可以使用 JSON.toJSONString() 將 Java 對象轉(zhuǎn)換換為 JSON 對象
public class TestFastJson {? /** * Java 對象轉(zhuǎn)換為 Json */ @Test public void javaBeanToJSON() { // 創(chuàng)建 Person 對象 Person person = new Person("小明", 23, DateUtils.getDateFormat());? // 轉(zhuǎn)換為 JSON 數(shù)據(jù) String jsonString = JSON.toJSONString(person); System.out.println(jsonString); }? /** * Java 中的集合轉(zhuǎn)換為 JSON */ @Test public void listToJSON() { // 創(chuàng)建 Person 對象集 Person person1 = new Person("小明", 21, DateUtils.getDateFormat()); Person person2 = new Person("小紅", 22, DateUtils.getDateFormat()); Person person3 = new Person("小張", 23, DateUtils.getDateFormat()); List<Person> personList = new ArrayList<>(); Collections.addAll(personList, person1, person2, person3);? String jsonString = JSON.toJSONString(personList); System.out.println(jsonString); }}
Fastjson 中的 @JSONField 注解
@Data@AllArgsConstructor@NoArgsConstructorpublic class Person { // 可以通過 name 來指定輸出的 JSON 名稱 @JSONField(name = "USERNAME", ordinal = 1) private String username;? // 可以使用 ordinal 指定 JSON 的字段順序 @JSONField(name = "AGE", ordinal = 2) private int age;? // 使用 serialize 指定是否進行序列化 @JSONField(ordinal = 3, serialize = true) private String birthday;}
將 JSON 字符串轉(zhuǎn)換為 Java 對象
/** * JSON 轉(zhuǎn)換為對象 */@Testpublic void JSONtoJavaBean() { String json = "{"USERNAME":"小明","AGE":23,"birthday":"2020-08-22 23:15:52"}";? Person person = JSON.parseObject(json, Person.class); System.out.println(person);}?/** * JSON 轉(zhuǎn)換為集合 */@Testpublic void JSONtoList() { String json = "[{"USERNAME":"小明","AGE":21,"birthday":"2020-08-22 23:17:34"},{"USERNAME":"小紅","AGE":22,"birthday":"2020-08-22 23:17:34"},{"USERNAME":"小張","AGE":23,"birthday":"2020-08-22 23:17:34"}]n";? List<Person> personList = JSON.parseArray(json, Person.class); System.out.println(personList);}
想了解更多,歡迎關(guān)注我的微信公眾號:Renda_Zhang
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 舉報,一經(jīng)查實,本站將立刻刪除。