zxing生成二维码

可以使用zxing库生成二维码,再将二维码图片转化为字节数组,存入数据库中。

下面给出一个简单的示例代码:

  1. 添加依赖

在pom.xml中添加以下依赖:


    com.google.zxing
    core
    3.4.0


    com.google.zxing
    javase
    3.4.0
  1. 编写生成二维码的方法
public static byte[] generateQRCode(String content) throws WriterException, IOException {
    int width = 200; // 二维码图片宽度
    int height = 200; // 二维码图片高度

    // 设置二维码参数
    Map hints = new HashMap<>();
    hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
    hints.put(EncodeHintType.MARGIN, 1);

    // 生成二维码
    BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);

    // 将BitMatrix转换为BufferedImage
    BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);

    // 将BufferedImage转换为字节数组
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    ImageIO.write(image, "png", outputStream);
    byte[] bytes = outputStream.toByteArray();

    return bytes;
}
  1. 在Controller中调用方法并保存到数据库
@Controller
public class QRCodeController {

    @Autowired
    private QRCodeService qrCodeService;

    @RequestMapping("/generateQRCode")
    public String generateQRCode(Model model, @RequestParam String content) {
        try {
            byte[] bytes = QRCodeUtil.generateQRCode(content);
            qrCodeService.saveQRCode(bytes);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "success";
    }
}
@Service
public class QRCodeServiceImpl implements QRCodeService {

    @Autowired
    private QRCodeMapper qrCodeMapper;

    @Override
    public void saveQRCode(byte[] bytes) {
        QRCode qrCode = new QRCode();
        qrCode.setBytes(bytes);
        qrCodeMapper.insert(qrCode);
    }
}
  1. 在页面中显示二维码

在页面中使用img标签,并将src属性设置为一个servlet或controller的路径,通过读取数据库中的二维码字节数组生成二维码图片并显示。

@Controller
public class QRCodeController {

    @Autowired
    private QRCodeService qrCodeService;

    @GetMapping("/showQRCode")
    public void showQRCode(HttpServletRequest request, HttpServletResponse response, Long id) {
        try {
            QRCode qrCode = qrCodeService.getQRCodeById(id);
            byte[] bytes = qrCode.getBytes();
            response.setContentType("image/png");
            ServletOutputStream outputStream = response.getOutputStream();
            outputStream.write(bytes);
            outputStream.flush();
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
public interface QRCodeMapper {
    void insert(QRCode qrCode);

    QRCode selectById(Long id);
}
public class QRCode {
    private Long id;
    private byte[] bytes;

    // getter/setter方法
}

  • 首先,你需要引入以下依赖:

    
        com.google.zxing
        core
        3.3.0
    
    
        com.google.zxing
        javase
        3.3.0
    

    然后,在mapper.xml中定义一个插入二维码图片信息的SQL语句:

    
        insert into qrcode (content, image) values (#{content}, #{image})
    

    在mapper接口中定义该方法:

    void insertQRCode(String content, byte[] image);

    在mapper对应的service接口中定义该方法:

    void generateAndSaveQRCode(String content);

    在service实现类中实现该方法:

    @Override
    public void generateAndSaveQRCode(String content) {
        try {
            // 生成二维码
            BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, 200, 200);
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            MatrixToImageWriter.writeToStream(bitMatrix, "png", byteArrayOutputStream);
            byte[] image = byteArrayOutputStream.toByteArray();
            // 保存到数据库
            mapper.insertQRCode(content, image);
        } catch (Exception e) {
            throw new RuntimeException("Failed to generate and save QR code.", e);
        }
    }

    最后,在controller中调用该方法即可:

    @RestController
    @RequestMapping("/qrcode")
    public class QRCodeController {
        @Autowired
        private QRCodeService qrCodeService;
    
        @PostMapping
        public void generateAndSaveQRCode(@RequestParam String content) {
            qrCodeService.generateAndSaveQRCode(content);
        }
    }

    当你向 /qrcode 发送POST请求时,该接口将会生成并保存相应的二维码图片信息到数据库。

  • 生成二维码可以使用第三方库,例如zxing,可以通过Maven引入:

     

    在jsp页面中,可以通过以下代码生成二维码:

    <%@ page import="com.google.zxing.BarcodeFormat" %>
    <%@ page import="com.google.zxing.EncodeHintType" %>
    <%@ page import="com.google.zxing.MultiFormatWriter" %>
    <%@ page import="com.google.zxing.common.BitMatrix" %>
    <%@ page import="com.google.zxing.qrcode.decoder.ErrorCorrectionLevel" %>
    <%
        String content = "https://www.example.com"; // 二维码内容
        int width = 300; // 二维码图片宽度
        int height = 300; // 二维码图片高度
        String format = "png"; // 二维码图片格式
    
        // 设置二维码参数
        Map hints = new HashMap<>();
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        hints.put(EncodeHintType.MARGIN, 2);
    
        // 生成二维码
        BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
    
        // 输出二维码图片
        response.setContentType("image/" + format);
        OutputStream out = response.getOutputStream();
        MatrixToImageWriter.writeToStream(bitMatrix, format, out);
        out.flush();
        out.close();
    %>

    将生成的二维码保存到数据库,可以在mapper.xml文件中定义一个insert语句:

    
        insert into qrcode (content, image) values (#{content}, #{image})
    

    其中,com.example.QRCode是一个JavaBean,包含二维码内容和图片的字节数组。

    在serviceimpl中,可以调用mapper的insertQRCode方法将二维码保存到数据库:

    @Service
    public class QRCodeServiceImpl implements QRCodeService {
        @Autowired
        private QRCodeMapper qrCodeMapper;
    
        @Override
        public void saveQRCode(String content, byte[] image) {
            QRCode qrCode = new QRCode();
            qrCode.setContent(content);
            qrCode.setImage(image);
            qrCodeMapper.insertQRCode(qrCode);
        }
    }

    最后,在controller中调用serviceimpl的saveQRCode方法生成二维码并保存到数据库:

    @Controller
    public class QRCodeController {
        @Autowired
        private QRCodeService qrCodeService;
    
        @RequestMapping("/generateQRCode")
        public String generateQRCode(HttpServletRequest request) {
            String content = "https://www.example.com"; // 二维码内容
            int width = 300; // 二维码图片宽度
            int height = 300; // 二维码图片高度
            String format = "png"; // 二维码图片格式
    
            // 设置二维码参数
            Map hints = new HashMap<>();
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            hints.put(EncodeHintType.MARGIN, 2);
    
            // 生成二维码
            BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
    
            // 将二维码保存到字节数组
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            MatrixToImageWriter.writeToStream(bitMatrix, format, out);
            byte[] image = out.toByteArray();
    
            // 将二维码保存到数据库
            qrCodeService.saveQRCode(content, image);
    
            return "success";
        }
    }

以下是一个SSM生成二维码图片并将地址保存到数据库的代码示例:

  1. 首先在pom.xml文件中添加以下依赖:


    com.google.zxing
    core
    3.4.0


    com.google.zxing
    javase
    3.4.0

  1. 编写一个QrCodeUtil工具类,用于生成二维码图片:

public class QrCodeUtil {
    /**
     * 生成二维码图片
     *
     * @param content 内容
     * @param width   宽度
     * @param height  高度
     * @param format  图片格式
     * @return 图片流
     * @throws WriterException       生成二维码异常
     * @throws IOException           IO异常
     * @throws IllegalArgumentException 无法创建图片文件
     */
    public static BufferedImage createQrCode(String content, int width, int height, String format) throws WriterException, IOException {
        // 二维码参数
        Map hints = new HashMap<>(16);
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
        hints.put(EncodeHintType.MARGIN, 0);

        BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        for (int x = 0; x < bitMatrix.getWidth(); x++) {
            for (int y = 0; y < bitMatrix.getHeight(); y++) {
                image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
            }
        }
        return image;
    }
}
  1. 编写一个Controller方法,用于生成二维码并保存到数据库中:

@Controller
@RequestMapping("/qrcode")
public class QrCodeController {
    @Autowired
    private QrCodeMapper qrCodeMapper;

    /**
     * 生成二维码,并将图片地址保存到数据库
     *
     * @param content 二维码内容
     * @return 结果
     */
    @RequestMapping("/generate")
    @ResponseBody
    public ReturnDTO generateQrCode(String content) {
        try {
            // 文件存储路径
            String filePath = "D://qrcode/" + UUID.randomUUID().toString() + ".jpg";
            // 生成二维码图片
            BufferedImage image = QrCodeUtil.createQrCode(content, 300, 300, "jpg");
            // 保存图片到指定路径
            ImageIO.write(image, "jpg", new File(filePath));
            
            // 将图片地址保存到数据库中
            QrCode qrCode = new QrCode();
            qrCode.setContent(content);
            qrCode.setFilePath(filePath);
            qrCodeMapper.insert(qrCode);
            
            return ReturnDTO.ok(qrCode.getFilePath());
        } catch (Exception e) {
            return ReturnDTO.error("生成二维码失败");
        }
    }
}
  1. 编写一个QrCodeMapper接口和QrCode实体类,用于操作数据库中的二维码信息:

public interface QrCodeMapper {
    /**
     * 保存二维码信息到数据库中
     *
     * @param qrCode 二维码实体类
     */
    void insert(QrCode qrCode);
}

public class QrCode {
    private Integer id;
    private String content;
    private String filePath;
    // 省略getter和setter方法
}

这样,就可以通过调用QrCodeController中的generateQrCode方法,生成二维码图片并将图片地址保存到数据库中了。

五Controller Mapper Mapper.xml Service Services JSP SSM二维码生成图片并将地址放入数据库

这是一个比较完整的场景,包含了JSP、SSM框架、Controller、Mapper、Mapper.xml、Service、Services等相关技术,以及二维码生成和数据库操作。

首先,我们需要在JSP页面上添加一个按钮或链接,点击后触发生成二维码的操作。可以使用第三方库比如zxing来生成二维码图片。

在SSM框架中,我们需要定义一个Controller来接收请求,然后调用Service层的方法。在Service层中,我们需要使用mapper来操作数据库,将二维码图片的地址存入数据库。

具体实现步骤如下:

  1. 在JSP页面上添加一个按钮或链接,点击后触发生成二维码的操作。可以使用第三方库比如zxing来生成二维码图片。

  2. 定义一个Controller来接收请求,并调用Service层的方法。例如:

@Controller
@RequestMapping("/qrcode")
public class QRCodeController {
    
    @Autowired
    private QRCodeService qrCodeService;

    @RequestMapping("/generate")
    public String generateQRCode(Model model) {
        // 调用Service层生成二维码,并将二维码地址存入数据库
        String qrCodeUrl = qrCodeService.generateQRCode();
        model.addAttribute("qrCodeUrl", qrCodeUrl);
        return "qrcode";
    }
}
  1. 在Service层中,生成二维码,并将二维码图片的地址存入数据库。例如:
@Service
public class QRCodeServiceImpl implements QRCodeService {
    
    @Autowired
    private QRCodeMapper qrCodeMapper;

    @Override
    public String generateQRCode() {
        // 生成二维码图片,并返回图片地址
        String qrCodeUrl = "http://example.com/qrcode.png";
        // 将二维码图片的地址存入数据库
        qrCodeMapper.insert(qrCodeUrl);
        return qrCodeUrl;
    }
}
  1. 在Mapper.xml文件中定义插入数据的SQL语句。例如:

    insert into qrcode(qr_code_url) values(#{qrCodeUrl})
  1. 定义一个Mapper接口,并注入到Service层中。例如:
public interface QRCodeMapper {
    
    void insert(String qrCodeUrl);
}
  1. 在JSP页面上展示生成的二维码。例如:
QR Code

这样,就完成了一个简单的二维码生成并将地址存入数据库的操作。

六JSP SSM二维码生成图片并将地址放入数据库

要实现在JSP SSM中生成二维码图片,并将其地址存入数据库中,你可以按照以下步骤进行操作:

  1. 引入QRCode生成库

在项目中引入QRCode生成库,例如zxing,可以在Maven中添加以下依赖:

复制
    com.google.zxing
    core
    3.4.0


    com.google.zxing
    javase
    3.4.0
  1. 创建QRCodeUtil工具类

创建一个QRCodeUtil工具类,使用该工具类生成二维码图片。代码示例:

public class QRCodeUtil {
    private static final int WIDTH = 300;
    private static final int HEIGHT = 300;
    private static final String FORMAT = "png";

    /**
     * 生成二维码图片
     * @param content 二维码内容
     * @param logoPath 二维码中间的logo图片路径
     * @return 二维码图片的字节数组
     * @throws Exception
     */
    public static byte[] generateQRCode(String content, String logoPath) throws Exception {
        BufferedImage image = createImage(content, logoPath);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(image, FORMAT, baos);
        return baos.toByteArray();
    }

    /**
     * 创建二维码图片
     * @param content 二维码内容
     * @param logoPath 二维码中间的logo图片路径
     * @return 二维码图片
     * @throws Exception
     */
    private static BufferedImage createImage(String content, String logoPath) throws Exception {
        MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
        Map hints = new HashMap<>();
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, WIDTH, HEIGHT, hints);
        BufferedImage image = toBufferedImage(bitMatrix);
        if (logoPath != null && !"".equals(logoPath.trim())) {
            addLogo(image, logoPath);
        }
        return image;
    }

    /**
     * 将二维码图片转换成字节数组
     * @param matrix 二维码矩阵信息
     * @return 二维码图片的字节数组
     */
    private static BufferedImage toBufferedImage(BitMatrix matrix) {
        int width = matrix.getWidth();
        int height = matrix.getHeight();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                image.setRGB(x, y, matrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
            }
        }
        return image;
    }

    /**
     * 添加logo图片到二维码中间
     * @param image 二维码图片
     * @param logoPath logo图片路径
     * @throws Exception
     */
    private static void addLogo(BufferedImage image, String logoPath) throws Exception {
        Graphics2D g2 = image.createGraphics();
        BufferedImage logo = ImageIO.read(new File(logoPath));
        int logoWidth = logo.getWidth();
        int logoHeight = logo.getHeight();
        int x = (image.getWidth() - logoWidth) / 2;
        int y = (image.getHeight() - logoHeight) / 2;
        g2.drawImage(logo, x, y, logoWidth, logoHeight, null);
        g2.dispose();
    }
}
  1. 在Controller中使用QRCodeUtil生成二维码图片

在Controller中使用QRCodeUtil生成二维码图片,并将生成的图片保存到服务器中,并将图片的地址存入数据库中。代码示例:

@Controller
public class QRCodeController {
    @Autowired
    private QRCodeService qRCodeService;

    @RequestMapping("/generateQRCode")
    public String generateQRCode(String content, String logoPath) throws Exception {
        byte[] bytes = QRCodeUtil.generateQRCode(content, logoPath);
        String path = saveQRCodeImage(bytes);
        qRCodeService.saveQRCode(path);
        return "success";
    }

    /**
     * 保存二维码图片到服务器
     * @param bytes 二维码图片的字节数组
     * @return 二维码图片在服务器中的地址
     * @throws Exception
     */
    private String saveQRCodeImage(byte[] bytes) throws Exception {
        String path = "D:/qrcode/" + UUID.randomUUID().toString() + ".png";
        File file = new File(path);
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(bytes);
        fos.flush();
        fos.close();
        return path;
    }
}
  1. 创建QRCodeService服务

创建QRCodeService服务,用于将生成的二维码图片地址存入数据库中。代码示例:

@Service
public class QRCodeService {
    @Autowired
    private QRCodeMapper qrCodeMapper;

    /**
     * 将二维码图片地址存入数据库中
     * @param path 二维码图片地址
     */
    public void saveQRCode(String path) {
        QRCode qrCode = new QRCode();
        qrCode.setPath(path);
        qrCodeMapper.saveQRCode(qrCode);
    }
}
  1. 创建QRCodeMapper接口

创建QRCodeMapper接口,用于定义将二维码图片地址存入数据库的方法。代码示例:

public interface QRCodeMapper {
    /**
     * 将二维码图片地址存入数据库中
     * @param qrCode 二维码实体类
     */
    void saveQRCode(QRCode qrCode);
}
  1. 创建QRCode实体类

创建QRCode实体类,用于存储二维码图片地址。代码示例:

public class QRCode {
    private Integer id;
    private String path;

    // getter and setter
}
  1. 创建数据库表

创建数据库表,用于存储二维码图片地址。代码示例:

CREATE TABLE `qrcode` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `path` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

以上就是在JSP SSM中生成二维码图片,并将其地址存入数据库的完整流程。

你可能感兴趣的:(数据库,java,服务器)