使用Java Servlet生成動態二維碼

文章目錄

    • 引入ZXing庫
    • 創建QRCodeServlet
    • 部署到Servlet容器
    • 拓展功能
      • 1. 動態生成二維碼內容
      • 2. 調整二維碼尺寸
      • 3. 錯誤修正級別
      • 4. 日志輸出
    • 結語

在這里插入圖片描述

🎉歡迎來到Java學習路線專欄~探索Java中的靜態變量與實例變量


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陳寒🍹
  • ?博客主頁:IT·陳寒的博客
  • 🎈該系列文章專欄:Java學習路線
  • 📜其他專欄:Java學習路線 Java面試技巧 Java實戰項目 AIGC人工智能 數據結構學習
  • 🍹文章作者技術和水平有限,如果文中出現錯誤,希望大家能指正🙏
  • 📜 歡迎大家關注! ??

在現代互聯網時代,二維碼廣泛應用于各個領域,包括支付、認證、信息傳遞等。在Web開發中,通過Java Servlet生成動態二維碼是一個常見的需求。本文將介紹如何使用Java Servlet結合Google的ZXing庫生成動態二維碼,并通過Servlet將生成的二維碼直接返回給瀏覽器。
在這里插入圖片描述

引入ZXing庫

首先,確保你的項目中引入了ZXing庫。你可以通過Maven在pom.xml文件中添加以下依賴:

<dependencies><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.0</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.4.0</version></dependency>
</dependencies>

創建QRCodeServlet

package servlet;import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;import javax.imageio.ImageIO;
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.awt.image.BufferedImage;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;@WebServlet("/qrcode")
public class QRCodeServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 獲取需要生成二維碼的數據,這里可以通過請求參數或其他方式獲取String data = "Hello, QR Code!";System.out.println(data + ".....");// 生成二維碼的 BufferedImageBufferedImage image = generateQRCode(data, 150, 150);// 設置響應的內容類型為圖片response.setContentType("image/png");// 將二維碼寫入 HttpServletResponse 的輸出流assert image != null;ImageIO.write(image, "png", response.getOutputStream());}private BufferedImage generateQRCode(String data, int width, int height) {try {System.out.println("1..........");// 設置二維碼參數Map<EncodeHintType, Object> hintMap = new HashMap<>();hintMap.put(EncodeHintType.CHARACTER_SET, "UTF-8");hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);// 創建位矩陣(BitMatrix)來表示二維碼BitMatrix bitMatrix = new MultiFormatWriter().encode(data, BarcodeFormat.QR_CODE, width, height, hintMap);// 將位矩陣渲染成二維碼圖片BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix);// 返回生成的二維碼圖片return bufferedImage;} catch (Exception e) {System.err.println("Error generating QR Code: " + e.getMessage());return null;}}
}

在上述代碼中,我們創建了一個名為QRCodeServlet的Servlet,用于處理客戶端的請求。當瀏覽器訪問/qrcode路徑時,該Servlet將生成一個包含指定數據的二維碼圖片,并將其以PNG格式寫入HttpServletResponse的輸出流中。

部署到Servlet容器

確保你的Java Web項目已經正確部署到Servlet容器中,例如Tomcat。啟動Tomcat后,你可以通過訪問http://localhost:8080/your_project_context/qrcode來查看生成的二維碼圖片。

拓展功能

1. 動態生成二維碼內容

你可以通過獲取請求參數等方式,使生成的二維碼內容更具動態性。例如,從請求參數中獲取文本信息:

String data = request.getParameter("text");

2. 調整二維碼尺寸

可以根據需要調整生成的二維碼圖片的尺寸,通過修改widthheight參數。

3. 錯誤修正級別

通過修改hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);中的ErrorCorrectionLevel,可以調整二維碼的錯誤修正級別,包括LMQH。級別越高,二維碼越復雜,但對損壞的容忍度也越高。

在這里插入圖片描述

4. 日志輸出

在實際項目中,建議使用日志框架輸出日志,而不是直接在控制臺打印。你可以集成類似Log4j或SLF4J的日志框架,以便更好地管理和監控日志信息。

結語

通過上述步驟,你可以輕松在Java Web項目中生成動態二維碼,并在瀏覽器中顯示。這為諸如會員卡、活動邀請等場景提供了便捷的解決方案。希望這篇文章對你理解和應用Java生成二維碼有所幫助。


🧸結尾 ?? 感謝您的支持和鼓勵! 😊🙏
📜您可能感興趣的內容:

  • 【Java面試技巧】Java面試八股文 - 掌握面試必備知識(目錄篇)
  • 【Java學習路線】2023年完整版Java學習路線圖
  • 【AIGC人工智能】Chat GPT是什么,初學者怎么使用Chat GPT,需要注意些什么
  • 【Java實戰項目】SpringBoot+SSM實戰:打造高效便捷的企業級Java外賣訂購系統
  • 【數據結構學習】從零起步:學習數據結構的完整路徑

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161081.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161081.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161081.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【追求卓越04】數據結構--棧與隊列

引導 今天我們開始學習棧與隊列的內容&#xff0c;我覺得棧并不難&#xff0c;所以篇幅也就不會那么多了。在虛擬空間中&#xff0c;棧是用戶空間中的一種數據結構&#xff0c;它主要用于保存局部變量。那么問題來了&#xff0c;為什么用棧來保存局部變量&#xff0c;不用別的數…

Spring Boot 3 集成 Knife4j

基礎環境 SpringBoot : 3.0.6 Java: jdk-17.0.5 Maven: 3.6.1依賴 <?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"xs…

Go 語言函數、參數和返回值詳解

函數是一組語句&#xff0c;可以在程序中重復使用。函數不會在頁面加載時自動執行。函數將通過調用函數來執行。 創建函數 要創建&#xff08;通常稱為聲明&#xff09;一個函數&#xff0c;請執行以下操作&#xff1a; 使用 func 關鍵字。指定函數的名稱&#xff0c;后跟括…

Java編程技巧:if-else優化實踐總結歸納

文/朱季謙 說實話&#xff0c;其實我很討厭在代碼里大量使用if-else&#xff0c;一是因為該類代碼執行方式屬于面向過程的&#xff0c;二嘛&#xff0c;則是會顯得代碼過于冗余。這篇筆記&#xff0c;主要記錄一些自己在工作實踐當中針對if-else的優化心得&#xff0c;將會不定…

10年開發工程師總結,8大主流程序員兼職平臺,月入30k不是夢!

今年互聯網行業陸續裁員減薪&#xff0c;許多人怨聲載道的同時也開始另謀出路。而對于程序員更是應該提早做好準備&#xff0c;活躍在兼職接單的最前沿。 我們程序員是一門技術工種&#xff0c;與互聯網其他行業相比薪水會相對高一點&#xff0c;不過錢也不是那么好賺的&#…

C++中類和動態內存分配

new關鍵字 在C中&#xff0c;內存分為棧和堆。棧中的對象生命周期較短&#xff0c;往往在作用域結束后就會銷毀&#xff0c;而堆中的對象生命周期較長&#xff0c;只有當使用delete或者程序結束時才會銷毀。而new則是將我們創建的對象分配到堆中&#xff0c;使對象可以跨作用域…

2023年【廣東省安全員B證第四批(項目負責人)】報名考試及廣東省安全員B證第四批(項目負責人)復審考試

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 廣東省安全員B證第四批&#xff08;項目負責人&#xff09;報名考試是安全生產模擬考試一點通總題庫中生成的一套廣東省安全員B證第四批&#xff08;項目負責人&#xff09;復審考試&#xff0c;安全生產模擬考試一點…

json_to_mask

修改后的json_to_dataset文件&#xff0c;直接復制替換你自己原始的json_to_dataset&#xff0c;建議保存一下原版import argparse import base64 import json import os import os.path as ospimport imgviz import PIL.Imagefrom labelme.logger import logger from labelme …

java:springboot單元測試spring-boot-starter-test

背景 Java的單元測試可以使用多個框架&#xff0c;其中比較流行的包括&#xff1a; JUnit&#xff1a;JUnit是Java單元測試最常用的框架&#xff0c;它提供了一套豐富的API&#xff0c;可以方便地編寫測試用例和測試套件。JUnit 5是JUnit的最新版本&#xff0c;引入了許多新功…

ElMessageBox中的子組件回調關閉函數

父組件中&#xff1a; const closeMessageBox () > {ElMessageBox.close();getList(); };const open () > {ElMessageBox({title: 添加商品,message: h(AddTaxExemption, { onClose: closeMessageBox }),customClass: custom-message-box, showConfirmButton: false,d…

各大電商平臺雙十一“狂飆”,如何選擇商城系統?

今年是“雙十一”的第十五年。作為各大平臺和品牌的全年最重要的營銷節點&#xff0c;品牌們可謂是來勢洶洶&#xff0c;各種促銷活動和優惠力度讓人眼花繚亂。 淘天數據顯示&#xff0c;天貓促銷活動開售當晚&#xff0c;155個品牌開賣成交額突破1億元&#xff1b;首小時內7.1…

str轉wstr的三種方法和從網站獲取json數據到數據隨機提取,返回拼接字符串和動態數組

庫的設置 hv庫 外部包含目錄&#xff1a;…\include\libhv_new\hv; 庫目錄&#xff1a;…\include\libhv_new\lib\x86\Release; 附加依賴項&#xff1a;hv.lib; //Get請求 獲取json數據&#xff0c;然后提取符合 條件的&#xff0c;time值大于自定義變量的值&#xff0c;然后取…

【UE】用樣條線實現測距功能(上)

目錄 效果 步驟 一、創建樣條網格體組件3D模型 二、實現點擊連線功能 三、實現顯示兩點間距離功能 效果 步驟 一、創建樣條網格體組件3D模型 創建一個圓柱模型&#xff0c;這里底面半徑設置為10mm&#xff0c;高度設置為1000mm 注意該模型的坐標軸在如下位置&#xff1…

基于pytest的服務端http請求的自動化測試框架?

1、引言 我有一個朋友是做 Python 自動化測試的。前幾天他告訴我去參加一個大廠面試被刷了。 我問他是有沒有總結被刷下來的原因。他說面試官問了一些 pytest 單元測試框架相關的知識&#xff0c;包括什么插件系統和用力篩選。但是他所在的公司用的技術是基于 unittest 的&am…

Sentinel與SpringBoot整合

好的&#xff0c;以下是一個簡單的Spring Cloud整合Sentinel的代碼示例&#xff1a; 首先&#xff0c;在pom.xml中添加以下依賴&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel&l…

swift-基礎

print區別 print(1,2,3, separator: "-", terminator: "\n")//表示用-來分割//1-2-3 //terminator表示用\n作為終止符 var a "a",b "b" print(a b) //ab print("\(a)前面是a變量\(b)后面是b變量")變量 var name "…

Win10系統無法登錄Xbox live的四種解決方法

在Win10系統中&#xff0c;用戶可以登錄Xbox live平臺&#xff0c;暢玩自己喜歡的游戲。但是&#xff0c;有用戶卻遇到了無法登錄Xbox live的問題。接下來小編給大家詳細介紹四種簡單的解決方法&#xff0c;解決后用戶在Win10電腦上就能成功登錄上Xbox live平臺。 Win10系統無法…

Linux編程 文件操作 creat open

文件描述符 文件描述符在形式上是一個非負整數。實際上&#xff0c;它是一個索引值&#xff0c;指向內核為每一個進程所維護的該進程打開文件的記錄表。當程序打開一個現有文件或者創建一個新文件時&#xff0c;內核向進程返回一個文件描述符。 啟動一個進程之后&#xff0c;…

SquareCTF-2023 Web Writeups

官方wp&#xff1a;CTFtime.org / Square CTF 2023 tasks and writeups sandbox Description&#xff1a; I “made” “a” “python” “sandbox” “”“” nc 184.72.87.9 8008 先nc連上看看&#xff0c;只允許一個單詞&#xff0c;空格之后的直接無效了。 flag就在當…

(C)一些題2

1.在 C 語言中&#xff08;以 16位 PC 機為例&#xff09;,5種基本數據類型的存儲空間長度的順序為&#xff08;&#xff09; A . char < int < long int <float < double B . char int < long int<float <double C . char < int < long int …