java實(shí)現(xiàn)通用分頁(后端)
1.通用分頁是什么?
Java通用分頁是指在Java編程語言中實(shí)現(xiàn)的一種通用分頁功能。它通常用于在Java Web應(yīng)用中展示大量數(shù)據(jù)或查詢結(jié)果,并將其分頁顯示給用戶。
在Java中,通常會(huì)使用以下幾個(gè)組件或類來實(shí)現(xiàn)通用分頁功能:
1. 分頁查詢:通常會(huì)通過數(shù)據(jù)庫查詢或其他方式獲取大量數(shù)據(jù),然后使用分頁查詢技術(shù)來獲取特定頁的數(shù)據(jù)。這通常包括設(shè)置每頁顯示的數(shù)據(jù)數(shù)量、當(dāng)前頁碼和排序規(guī)則等參數(shù),然后根據(jù)參數(shù)篩選和返回相應(yīng)頁的數(shù)據(jù)。
2. 頁面展示:通用分頁需要在前端頁面上展示分頁數(shù)據(jù),可以使用Java的模板引擎或前端框架來實(shí)現(xiàn)。在頁面上通常會(huì)顯示當(dāng)前頁的數(shù)據(jù)列表、頁碼導(dǎo)航、上一頁和下一頁按鈕等控件,以便用戶瀏覽和導(dǎo)航不同頁的數(shù)據(jù)。
3. 分頁邏輯:在Java中,通常會(huì)使用一些邏輯代碼或工具類來處理分頁邏輯,例如計(jì)算總頁數(shù)、當(dāng)前頁起始索引、數(shù)據(jù)轉(zhuǎn)換等。這些代碼可以根據(jù)每頁顯示的數(shù)據(jù)數(shù)量、總數(shù)據(jù)量和當(dāng)前頁碼等來計(jì)算所需的數(shù)據(jù)范圍,并在數(shù)據(jù)庫查詢中使用相應(yīng)的參數(shù)。
4. 控制器和路由:在Java Web應(yīng)用中,控制器和路由負(fù)責(zé)處理用戶的請求,并將相應(yīng)的數(shù)據(jù)傳遞給前端頁面。在通用分頁中,控制器會(huì)接收用戶請求的頁碼等參數(shù),并將相應(yīng)頁的數(shù)據(jù)查詢結(jié)果傳遞給頁面展示部分進(jìn)行渲染。
總體而言,Java通用分頁是通過數(shù)據(jù)庫查詢、分頁邏輯、頁面展示和控制器等組件配合工作,實(shí)現(xiàn)在Java Web應(yīng)用中對大量數(shù)據(jù)進(jìn)行分頁顯示的一種功能。它可以提升用戶體驗(yàn)、優(yōu)化數(shù)據(jù)加載性能,并方便用戶瀏覽和導(dǎo)航大數(shù)據(jù)集。
通用分頁通常會(huì)包括如下元素:
- 1. 頁面切換按鈕或鏈接:用于在不同頁面之間切換。
- 2. 當(dāng)前頁碼信息:顯示當(dāng)前所在的頁面。
- 3. 總頁面數(shù)信息:顯示內(nèi)容總共被分成了多少頁。
- 4. 上一頁和下一頁按鈕或鏈接:用于直接跳轉(zhuǎn)到上一頁或下一頁。
- 5. 條目計(jì)數(shù)信息:顯示當(dāng)前頁面的內(nèi)容數(shù)量。
2.通用分頁的作用
Java通用分頁在Java Web應(yīng)用中具有以下幾個(gè)作用:
- 1. 改善用戶體驗(yàn):通用分頁可以將大量數(shù)據(jù)分頁展示,避免一次性加載大量數(shù)據(jù)導(dǎo)致頁面加載過慢的問題。通過分頁顯示,用戶可以更快速地獲取所需信息,提升用戶體驗(yàn)。
- 2. 優(yōu)化數(shù)據(jù)加載性能:通過分頁查詢,Java通用分頁可以減少每次數(shù)據(jù)查詢返回的數(shù)據(jù)量,減輕服務(wù)器的負(fù)載壓力,降低數(shù)據(jù)庫查詢的開銷,提高數(shù)據(jù)檢索的效率和性能。
- 3. 方便數(shù)據(jù)導(dǎo)航和瀏覽:Java通用分頁提供了方便的導(dǎo)航和瀏覽功能,用戶可以通過頁碼導(dǎo)航、上一頁和下一頁按鈕等進(jìn)行頁面切換,快速瀏覽各個(gè)分頁的數(shù)據(jù)內(nèi)容。
- 4. 防止數(shù)據(jù)溢出:當(dāng)需要展示的數(shù)據(jù)量非常大時(shí),如果不使用分頁,可能會(huì)導(dǎo)致內(nèi)存溢出或網(wǎng)絡(luò)傳輸超時(shí)等問題。通過使用Java通用分頁,將數(shù)據(jù)分批加載和展示,可以避免這種情況的發(fā)生。
- 5. 支持可配置性:Java通用分頁通常提供了一些可配置的參數(shù),如每頁顯示的數(shù)據(jù)數(shù)量、排序規(guī)則等,允許用戶根據(jù)需求進(jìn)行個(gè)性化配置,滿足不同用戶對分頁展示的需求。
總之,Java通用分頁在Java Web應(yīng)用中起到提升用戶體驗(yàn)、優(yōu)化數(shù)據(jù)加載性能、支持?jǐn)?shù)據(jù)導(dǎo)航和瀏覽等作用。它使得展示大量數(shù)據(jù)更加高效、靈活,并能夠滿足用戶對數(shù)據(jù)展示的需求。
3. 通用分頁的優(yōu)缺點(diǎn)
Java通用分頁的優(yōu)點(diǎn):
- 1. 提高用戶體驗(yàn):通用分頁可以將大量數(shù)據(jù)劃分為多個(gè)頁面,避免加載過長的頁面,提高頁面加載速度,讓用戶能夠快速瀏覽和查找所需內(nèi)容,提升用戶體驗(yàn)。
- 2. 優(yōu)化性能:通過分頁查詢,可以減少一次性加載大量數(shù)據(jù)的開銷,節(jié)省內(nèi)存和網(wǎng)絡(luò)資源,提高數(shù)據(jù)查詢和展示性能,減輕服務(wù)器壓力。
- 3. 方便導(dǎo)航和瀏覽:通用分頁提供了直觀的導(dǎo)航和瀏覽方式,用戶可以通過上一頁和下一頁按鈕或頁碼導(dǎo)航快速切換頁面,瀏覽不同頁的內(nèi)容,方便數(shù)據(jù)的導(dǎo)航和查找。
- 4. 可配置性強(qiáng):通用分頁通常支持配置每頁顯示的數(shù)據(jù)量、排序規(guī)則等參數(shù),可以根據(jù)具體需求進(jìn)行個(gè)性化配置,滿足不同用戶的需求。
- 5. 可復(fù)用性高:Java通用分頁的實(shí)現(xiàn)一般是基于模塊化和可擴(kuò)展的原則,通過封裝和抽象,可以將通用分頁的功能模塊復(fù)用于不同的應(yīng)用場景。
Java通用分頁的缺點(diǎn):
- 1. 數(shù)據(jù)一致性:當(dāng)數(shù)據(jù)在分頁過程中發(fā)生變化時(shí),例如新增或刪除了一部分?jǐn)?shù)據(jù),會(huì)導(dǎo)致分頁結(jié)果的數(shù)據(jù)不一致性,需要注意及時(shí)更新分頁數(shù)據(jù)以保持一致性。
- 2. 數(shù)據(jù)查詢效率:在某些場景下,特別是在數(shù)據(jù)量非常大的情況下,分頁查詢可能會(huì)對數(shù)據(jù)庫性能產(chǎn)生較大的影響,因?yàn)槊看尾樵冎环祷夭糠謹(jǐn)?shù)據(jù),可能需要多次查詢才能得到完整的結(jié)果。
- 3. 分頁參數(shù)管理:在應(yīng)用中需要合理管理分頁的參數(shù),特別是上一頁、下一頁的狀態(tài)和頁碼等信息,這需要一定的編碼和邏輯控制,否則可能導(dǎo)致分頁顯示混亂或錯(cuò)誤。
需要根據(jù)具體應(yīng)用場景和需求綜合考慮這些優(yōu)缺點(diǎn),并選擇合適的實(shí)現(xiàn)方式以達(dá)到最佳的效果和用戶體驗(yàn)。
4.通用分頁的核心思想
Java通用分頁的核心思想是將大量數(shù)據(jù)進(jìn)行分割,每次只返回部分?jǐn)?shù)據(jù),以便更好地展示和處理數(shù)據(jù)。
其主要的核心思想包括:
- 1. 數(shù)據(jù)切片:將大量數(shù)據(jù)劃分為多個(gè)較小的數(shù)據(jù)塊或頁,每頁包含固定數(shù)量的數(shù)據(jù)。這樣可以減少一次性加載所有數(shù)據(jù)的壓力,提高數(shù)據(jù)的檢索和加載性能。
- 2. 分頁參數(shù):定義和管理分頁的參數(shù),例如當(dāng)前頁碼、每頁顯示的數(shù)據(jù)量等。通過這些參數(shù),可以精確控制要返回的數(shù)據(jù)范圍。
- 3. 數(shù)據(jù)導(dǎo)航:提供導(dǎo)航和切換不同頁的功能,讓用戶能夠方便地瀏覽和導(dǎo)航數(shù)據(jù)。通常會(huì)包括上一頁和下一頁按鈕、頁碼導(dǎo)航等控件,用于切換不同頁的數(shù)據(jù)。
- 4. 數(shù)據(jù)查詢和過濾:根據(jù)分頁參數(shù),對數(shù)據(jù)進(jìn)行查詢和篩選,只返回當(dāng)前頁的數(shù)據(jù)。這可以通過數(shù)據(jù)庫查詢語句的limit和offset等關(guān)鍵字來實(shí)現(xiàn),限制返回的數(shù)據(jù)量和數(shù)據(jù)起始位置。
- 5. 數(shù)據(jù)展示和渲染:將查詢到的分頁數(shù)據(jù)進(jìn)行呈現(xiàn)和展示,可以使用Java的模板引擎或前端框架來實(shí)現(xiàn)數(shù)據(jù)的渲染和展示。
通過這些核心思想,Java通用分頁可以更好地控制數(shù)據(jù)的加載和展示,提高用戶體驗(yàn)和數(shù)據(jù)處理的效率。它允許大數(shù)據(jù)集的分頁展示,并提供了靈活的導(dǎo)航和配置選項(xiàng),滿足不同用戶對數(shù)據(jù)瀏覽需求的需求。
5.通用分頁實(shí)例
書籍實(shí)體類:
package com.liao.enity; public class Book { private int bid; private String bname; private float price; @Override public String toString() { return "Book [bid=" + bid + ", bname=" + bname + ", price=" + price + "]"; } public int getBid() { return bid; } public void setBid(int bid) { this.bid = bid; } public String getBname() { return bname; } public void setBname(String bname) { this.bname = bname; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } }
封裝pageBean類:
package com.liao.utils; /** * 分頁工具類 * */ public class PageBean { private int page = 1;// 頁碼 private int rows = 10;// 頁大小 private int total = 0;// 總記錄數(shù) private boolean pagination = true;// 是否分頁 public PageBean() { super(); } public int getPage() { return page; } public void setPage(int page) { this.page = page; } public int getRows() { return rows; } public void setRows(int rows) { this.rows = rows; } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public void setTotal(String total) { this.total = Integer.parseInt(total); } public boolean isPagination() { return pagination; } public void setPagination(boolean pagination) { this.pagination = pagination; } /** * 獲得起始記錄的下標(biāo) * * @return */ public int getStartIndex() { return (this.page - 1) * this.rows; } @Override public String toString() { return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]"; } }
書籍“分頁模糊查詢所有”方法
package com.liao.Dao; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.junit.Test; import com.liao.enity.Book; import com.liao.utils.DBAccess; import com.liao.utils.PageBean; import com.liao.utils.StringUtils; /** * 傳統(tǒng)dao方法 * 重復(fù)代碼: * Connection conn = DBAccess.getConnection(); * CallableStatement ps = conn.prepareCall(sql); ResultSet rs = ps.executeQuery(); * * 流程重復(fù): * 1.需要?jiǎng)?chuàng)建數(shù)據(jù)庫表對應(yīng)的實(shí)體類對象 * 2.將查詢出來的結(jié)果集添加到實(shí)例化對象屬性中 * 3.已經(jīng)被填充的實(shí)體對象,加入集合中 * while(rs.next()) { Book b = new Book(); b.setBid(rs.getInt("bid")); b.setBname(rs.getString("bname")); b.setPrice(rs.getFloat("price")); list.add(b); } * * * * @author Administrator * */ public class BookDao extends BaseDoa<Book>{ /** * 查詢Dao方法 優(yōu)化前 * @param book * @param pagebean * @return * @throws Exception */ public List<Book> list1(Book book,PageBean pagebean) throws Exception{ List<Book> list = new ArrayList<Book>(); //獲取連接 Connection conn = DBAccess.getConnection(); //查詢sql語句 String sql ="select * from t_mvc_book where 1=1 "; String bname = book.getBname(); if(StringUtils.isNotBlank(bname)) { sql += "and bname like '%"+bname+"%'"; } CallableStatement ps = conn.prepareCall(sql); ResultSet rs = ps.executeQuery(); while(rs.next()) { Book b = new Book(); b.setBid(rs.getInt("bid")); b.setBname(rs.getString("bname")); b.setPrice(rs.getFloat("price")); list.add(b); } return list; } /** * 優(yōu)化后 * @param book * @param pagebean * @return * @throws Exception */ public List<Book> list2(Book book,PageBean pagebean) throws Exception{ //查詢sql語句 String sql ="select * from t_mvc_book where 1=1 "; String bname = book.getBname(); if(StringUtils.isNotBlank(bname)) { sql += "and bname like '%"+bname+"%'"; } return super.executeQuery(sql, Book.class, pagebean); } public static void main(String[] args) throws Exception { BookDao bookDao = new BookDao(); Book book = new Book(); book.setBname("圣墟"); PageBean pagebean = new PageBean(); List<Book> list = bookDao.list2(book, pagebean); //查詢第二頁 pagebean.setPage(2); for (Book b : list) { System.out.println(b); } // bookDao.list2(book, pagebean); // 查詢總記錄數(shù) System.out.println(pagebean); } }
封裝baseDao通用分頁模糊查詢的方法
package com.liao.Dao; import java.lang.reflect.Field; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import com.liao.enity.Book; import com.liao.utils.DBAccess; import com.liao.utils.PageBean; import com.liao.utils.StringUtils; /** */ public class BaseDoa<T> { /** * 通用Dao 利用反射機(jī)制 * @param sql * @param cls * @param pagebean * @return * @throws Exception */ public List<T> executeQuery(String sql,Class cls,PageBean pagebean) throws Exception{ List<T> list = new ArrayList<T>(); Connection conn = null; CallableStatement ps = null; ResultSet rs = null; // select * from t_mvc_book where bname LIKE '%圣墟%' // SELECT count(1) as n from (SELECT * FROM t_mvc_book WHERE bname LIKE '%圣墟%') t // select * from t_mvc_book where bname LIKE '%圣墟%' LIMIT 0,10 if(pagebean !=null && pagebean.isPagination()) { String countSQL = getcount(sql); conn = DBAccess.getConnection(); ps = conn.prepareCall(countSQL); rs = ps.executeQuery(); if(rs.next()){ pagebean.setTotal(rs.getObject("n").toString()); } String pageSQL = getpage(sql,pagebean); conn = DBAccess.getConnection(); ps = conn.prepareCall(pageSQL); rs = ps.executeQuery(); }else { conn = DBAccess.getConnection(); ps = conn.prepareCall(sql); rs = ps.executeQuery(); } while(rs.next()) { T t =(T) cls.newInstance(); Field[] fields = cls.getDeclaredFields(); for (Field f : fields) { f.setAccessible(true); f.set(t, rs.getObject(f.getName())); } list.add(t); } return list; } /** * 拼接最終展示數(shù)據(jù) * @param sql 原生態(tài)sql語句 * @param pagebean * @return */ private String getpage(String sql, PageBean pagebean) { return sql+"LIMIT "+pagebean.getStartIndex()+","+pagebean.getRows(); } /** * 拼接出查詢符合條件的總記錄數(shù)sql * @param sql * @return */ private String getcount(String sql) { // TODO Auto-generated method stub return "SELECT count(1) as n from ("+sql+") t"; } }
運(yùn)行結(jié)果:
使用工具: MySQL數(shù)據(jù)庫,eclipse
6.單元測試框架JUnit4
JUnit是一個(gè)廣泛使用的Java單元測試框架,其最新版本為JUnit 5。
JUnit 4提供了一組基于注解的API來編寫和運(yùn)行單元測試。以下是JUnit 4的一些主要特點(diǎn)和用法:
- 1. 定義測試方法:通過在測試方法上添加@Test注解,可以將普通的Java方法標(biāo)記為測試方法,JUnit會(huì)自動(dòng)執(zhí)行這些測試方法并驗(yàn)證預(yù)期的行為和結(jié)果。
- 2. 設(shè)置測試前置條件:@Before和@BeforeClass注解用于在每個(gè)測試方法和測試類之前執(zhí)行指定的方法,可以用來初始化測試環(huán)境或加載測試數(shù)據(jù)。
- 3. 設(shè)置測試后置條件:@After和@AfterClass注解用于在每個(gè)測試方法和測試類之后執(zhí)行指定的方法,可以用來清理臨時(shí)數(shù)據(jù)或資源。
- 4. 斷言和驗(yàn)證:JUnit提供了一組斷言方法(如assertEquals、assertTrue、assertFalse等)來驗(yàn)證實(shí)際結(jié)果與預(yù)期結(jié)果是否一致。如果斷言失敗,測試將會(huì)被標(biāo)記為失敗。
- 5. 異常測試:通過在測試方法上添加@Test注解,并指定期望拋出的異常類型,可以對拋出異常的情況進(jìn)行測試,確保代碼在異常條件下能夠正確處理。
- 6. 參數(shù)化測試:通過使用@RunWith(Parameterized.class)注解和@Parameters注解,可以支持參數(shù)化測試,即對同一個(gè)測試方法進(jìn)行多組參數(shù)的測試。
- 7. 忽略測試:通過在測試方法上添加@Ignore注解,可以標(biāo)記某個(gè)測試方法為忽略,JUnit將不會(huì)執(zhí)行該測試方法。
除了以上的功能,JUnit 4還支持測試套件(@RunWith(Suite.class))、超時(shí)設(shè)置(@Test(timeout = xxx))、測試規(guī)則(@Rule)等高級(jí)特性,可以進(jìn)行更靈活、高效的單元測試。
下面是一個(gè)簡單的JUnit 4測試類的示例:
import org.junit.Test; import static org.junit.Assert.*; public class MyTest { @Test public void testAddition() { int result = 2 + 2; assertEquals(4, result); } } ```
在這個(gè)示例中,我們使用@Test注解將方法testAddition標(biāo)記為測試方法,并使用assertEquals斷言來驗(yàn)證加法的結(jié)果。
以上是一些JUnit 4的主要特點(diǎn)和用法,JUnit 4是Java開發(fā)中非常常用的單元測試框架,它可以幫助開發(fā)者編寫可靠的、自動(dòng)化的測試代碼來驗(yàn)證程序的正確性,提高代碼質(zhì)量和可維護(hù)性。
eclipse中使用JUnit4
第一步:選擇并且需要添加JUnit4的項(xiàng)目
操作步驟如下:
第二步:
第三步:
保存并且關(guān)閉即可完成
為什么是JUnit4不是JUnit5?
以下是JUnit 4和JUnit 5的一些主要對比:
- 編程模型:JUnit 4使用基于注解的編程模型,而JUnit 5引入了基于注解與基于擴(kuò)展模型的組合。JUnit 5引入了新的注解和接口,如@Test、@BeforeAll、@AfterAll 等注解,以及TestInstance.Lifecycle等接口,幫助開發(fā)者更靈活地編寫測試代碼。
- 擴(kuò)展性:JUnit 5提供了更靈活的擴(kuò)展機(jī)制,支持自定義擴(kuò)展,編寫測試擴(kuò)展可以實(shí)現(xiàn)更強(qiáng)大的測試功能,如參數(shù)化測試、條件執(zhí)行等。
- 參數(shù)化測試:JUnit 4中參數(shù)化測試是通過使用特定的庫來實(shí)現(xiàn),而JUnit 5內(nèi)置了參數(shù)化測試的支持,提供了更簡潔、易讀的語法。JUnit 5的參數(shù)化測試使用@ParameterizedTest、@ValueSource等注解,更方便地進(jìn)行參數(shù)化測試。
- 條件執(zhí)行:JUnit 5引入了@EnabledXxx與@DisabledXxx注解,可以根據(jù)條件更靈活地決定是否執(zhí)行某個(gè)測試方法或整個(gè)測試類。
- 斷言庫:JUnit 5支持使用不同的斷言庫,不再限定于JUnit 4的斷言方法。JUnit 5內(nèi)置的斷言方法更加靈活、易于使用,并提供了額外的功能,如展示自定義失敗消息、懶加載、對比器等。
- 兼容性 :JUnit 4和JUnit 5的測試代碼在語法上是不兼容的。JUnit 5是作為獨(dú)立的框架,并且允許與JUnit 4的測試代碼共存,但需要使用適配器或運(yùn)行器來運(yùn)行JUnit 4的測試。
- 并行執(zhí)行:JUnit 5支持并行執(zhí)行測試。可以通過在測試類上添加@Execution注解來指定并行執(zhí)行的策略。
總的來說,JUnit 5在擴(kuò)展性、參數(shù)化測試和條件執(zhí)行等方面改進(jìn)了JUnit 4,提供了更多的靈活性和功能。它還提供了更簡潔、易用的斷言方法和更好的兼容性。無論使用JUnit 4還是JUnit 5,都能夠有效地進(jìn)行Java單元測試,具體選擇取決于項(xiàng)目需求和個(gè)人喜好。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Springboot 限制IP訪問指定的網(wǎng)址實(shí)現(xiàn)
本文主要介紹了Springboot 限制IP訪問指定的網(wǎng)址實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05Mybatis Properties 配置優(yōu)先級(jí)詳解
這篇文章主要介紹了Mybatis Properties 配置優(yōu)先級(jí),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07解決SpringMVC項(xiàng)目連接RabbitMQ出錯(cuò)的問題
這篇文章主要介紹了解決SpringMVC項(xiàng)目連接RabbitMQ出錯(cuò)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01SpringBoot整合SSO(single sign on)單點(diǎn)登錄
這篇文章主要介紹了SpringBoot整合SSO(single sign on)單點(diǎn)登錄,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06SpringBoot實(shí)現(xiàn)返回值數(shù)據(jù)脫敏的步驟詳解
這篇文章主要給大家介紹一下SpringBoot實(shí)現(xiàn)返回值數(shù)據(jù)脫敏的步驟,文章通過代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2023-07-07SpringMVC中controller接收json數(shù)據(jù)的方法
這篇文章主要為大家詳細(xì)介紹了SpringMVC中controller接收json數(shù)據(jù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09Springboot+WebSocket實(shí)現(xiàn)在線聊天功能
WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議。這篇文章主要為大家介紹了如何利用Springboot和WebSocket實(shí)現(xiàn)在線聊天功能,感興趣的小伙伴可以了解一下2023-02-02