JAVA-EE uses Google's ZXing implementation to generate QR Code------Computer Network Classic

package com.powernode.qrcode.servlet;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@WebServlet("/generate")
public class GenerateQrCode extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
//        获取文本内容
        String url = request.getParameter("url");
        try{
//        使用谷歌提供的ZXING
//        需要创建一个Map集合存储二维码相关的属性
            Map map = new HashMap();
//        设置二维码的误差校正级别
//        可选值如下L(7%),M(15%),Q(25%),H(30%)
//        容错率越高消耗资源越多
            map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
//        设置二维码的字符集
            map.put(EncodeHintType.CHARACTER_SET,"UTF-8");
//        设置二维码的四周留白
            map.put(EncodeHintType.MARGIN,1);
//        创建ZXING核心对象
//        通过这个对象来生成二维码
            MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
//        需要的参数如下,内容,什么格式的二维码,二维码宽度,二维码高度,二维码参数
//        BarcodeFormat翻译为条形码格式,通过这个对象来设置格式
//        如QrCode二维码,具有数据密度高可靠性强的特点
//        AztecCode高密度可靠性强低容错率更小的尺寸,更高的效率(常用于个人信息账号信息,个人密码)
//        PDF417是一种储存大量信息的二维码格式(用于航空机票,运输配送,法律文件等)
//        DataMatrix是一种小巧的二维码格式,编码方式类似于QrCode二维码,但是可靠性识别率扫描速度都更优秀,尺寸小,可靠性高,因此多用于嵌入简单的产品标签
//        医疗图像监测数据等方面
            BitMatrix bitMatrix = multiFormatWriter.encode(url, BarcodeFormat.QR_CODE, 300, 300, map);
//        返回一个位矩阵对象(对象内部其实是一个二维数组,二维数组中每一个元素是Boolean类型,true代表黑色,false代表白色)
//            获取矩阵的宽度
            int width = bitMatrix.getWidth();
//            获取矩阵的高度
            int height = bitMatrix.getHeight();
//            生成二维码图片
//            这个对象是awt.image包下的专门用来生成图片的缓冲对象
            BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//            编写一个嵌套循环,遍历二维数组的循环,遍历这个位矩阵对象
            for (int x = 0; x < width; x++) {
//                按这个矩阵的高度和宽度遍历一遍
                for (int y = 0; y < height; y++) {
//                    0xFF000000是黑色,0xFFFFFFFF是白色
                    image.setRGB(x,y,bitMatrix.get(x,y) ? 0xFF000000 : 0xFFFFFFFF);
                }
            }
//            将图片响应回到客户端
            ServletOutputStream outputStream = response.getOutputStream();
            ImageIO.write(image,"PNG",outputStream);
//            用完这个流要关闭这个流
            outputStream.flush();
            outputStream.close();
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}
package com.powernode.qrcode.servlet;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@WebServlet("/generate")
public class GenerateQrCode extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
//        获取文本内容
        String url = request.getParameter("url");
        try{
//        使用谷歌提供的ZXING
//        需要创建一个Map集合存储二维码相关的属性
            Map map = new HashMap();
//        设置二维码的误差校正级别
//        可选值如下L(7%),M(15%),Q(25%),H(30%)
//        容错率越高消耗资源越多
            map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
//        设置二维码的字符集
            map.put(EncodeHintType.CHARACTER_SET,"UTF-8");
//        设置二维码的四周留白
            map.put(EncodeHintType.MARGIN,1);
//        创建ZXING核心对象
//        通过这个对象来生成二维码
            MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
//        需要的参数如下,内容,什么格式的二维码,二维码宽度,二维码高度,二维码参数
//        BarcodeFormat翻译为条形码格式,通过这个对象来设置格式
//        如QrCode二维码,具有数据密度高可靠性强的特点
//        AztecCode高密度可靠性强低容错率更小的尺寸,更高的效率(常用于个人信息账号信息,个人密码)
//        PDF417是一种储存大量信息的二维码格式(用于航空机票,运输配送,法律文件等)
//        DataMatrix是一种小巧的二维码格式,编码方式类似于QrCode二维码,但是可靠性识别率扫描速度都更优秀,尺寸小,可靠性高,因此多用于嵌入简单的产品标签
//        医疗图像监测数据等方面
            BitMatrix bitMatrix = multiFormatWriter.encode(url, BarcodeFormat.QR_CODE, 300, 300, map);
//        返回一个位矩阵对象(对象内部其实是一个二维数组,二维数组中每一个元素是Boolean类型,true代表黑色,false代表白色)
//            获取矩阵的宽度
            int width = bitMatrix.getWidth();
//            获取矩阵的高度
            int height = bitMatrix.getHeight();
// Generate QR code images 
// This object is a buffer object under the awt.image package specially used to generate images. 
            BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); 
//Write a nested loop and traverse Loop of two-dimensional array, traverse this bit matrix object 
            for (int x = 0; x < width; x++) { 
// Traverse once according to the height and width of this matrix 
                for (int y = 0; y < height; y++) { 
// 0xFF000000 is black, 0xFFFFFFFF is white 
                    image.setRGB(x,y,bitMatrix.get(x,y) ? 0xFF000000 : 0xFFFFFFFF); 
                } 
            } 
// Return the image response to the client 
            ServletOutputStream outputStream = response.getOutputStream() ; 
            ImageIO.write(image,"PNG",outputStream); 
//Close the stream when you are done with it 
            outputStream.flush(); 
            outputStream.close(); 
        } 
        catch(Exception e){ 
            e.printStackTrace(); 
        } 
    } 
}
<?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.powernode</groupId>
    <artifactId>MyQrCode</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencies>
<!--        Servlet依赖-->
        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>6.0.0</version>
            <scope>provided</scope>
        </dependency>
<!--        zxing依赖-->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.1.0</version>
        </dependency>
<!--        core依赖-->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.1.0</version>
        </dependency>
<!--        commons-lang的依赖-->
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
<!--        JSP依赖-->
        <dependency>
            <groupId>jakarta.servlet.jsp</groupId>
            <artifactId>jakarta.servlet.jsp-api</artifactId>
            <version>4.0.0-M1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>
<?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.powernode</groupId>
    <artifactId>MyQrCode</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencies>
<!--        Servlet依赖-->
        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>6.0.0</version>
            <scope>provided</scope>
        </dependency>
<!--        zxing依赖-->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.1.0</version>
        </dependency>
<!--        core依赖-->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.1.0</version>
        </dependency>
<!--        commons-lang的依赖-->
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
<!--        JSP依赖-->
        <dependency>
            <groupId>jakarta.servlet.jsp</groupId>
            <artifactId>jakarta.servlet.jsp-api</artifactId>
            <version>4.0.0-M1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>生成二维码</title>
  </head>
  <body>
    <h1>生成二维码</h1>
    <hr>
<%--    <input type="text" id="url"/>--%>
    <textarea id="url" rows="20" cols="60">
    </textarea>
    <button id="button">点击生成二维码</button>
    <br>
    <img src="" id="img">
  <script type="text/javascript">
    window.onload = function(){
      document.getElementById("button").onclick = function(){
        // 获取url
        var url = document.getElementById("url").value;
        document.getElementById("img").src = "/generate?url="+url;
      }
    }
  </script>
  </body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>生成二维码</title>
  </head>
  <body>
    <h1>生成二维码</h1>
    <hr>
<%--    <input type="text" id="url"/>--%>
    <textarea id="url" rows="20" cols="60">
    </textarea>
    <button id="button">点击生成二维码</button>
    <br>
    <img src="" id="img">
  <script type="text/javascript">
    window.onload = function(){
      document.getElementById("button").onclick = function(){
        // 获取url
        var url = document.getElementById("url").value;
        document.getElementById("img").src = "/generate?url="+url;
      }
    }
  </script>
  </body>
</html>

Guess you like

Origin blog.csdn.net/2201_75960169/article/details/135317108