步骤一:
引入我们需要的工具类,当然,这里我们需要引入谷歌的一个jar包:core-3.3.0.jar
链接:https://pan.baidu.com/s/1-pCh4LM77VqiG1Dd9yplBQ
提取码:hvt7
package com.guanzhuo.util;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Component;
/**
* 二维码工具类
*类名称:QRCodeUtil
*类描述:
*创建人:dengkai
*创建时间:2019年6月11日 上午9:41:23
* @version
*/
@Component("qRCodeUtil")
public class QRCodeUtil {
private static final int width = 300;// 宽度
private static final int height = 300;// 高度
private static final String format = "png";// 图片格式
private static final Map hints = new HashMap();//二维码参数
static {
hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 内容所使用字符集编码
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);//容错等级L/M/Q/H其中L为最低
hints.put(EncodeHintType.MARGIN, 2);//二维码与图片边距
}
/**
* 生成指定内容指定大小的二维码
* @param content
* @param width
* @param height
* @return
* @throws WriterException
* @throws IOException
*/
public BufferedImage toBufferedImage(String content, int width, int height) throws WriterException, IOException {
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
return MatrixToImageWriter.toBufferedImage(bitMatrix);
}
public void writeToStream(String content, OutputStream stream, int width, int height) throws WriterException, IOException {
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
MatrixToImageWriter.writeToStream(bitMatrix, format, stream);
}
/**
* 生成指定内容指定指定路径的二维码
* @param content
* @param path
* @param width
* @param height
* @throws WriterException
* @throws IOException
*/
public void createQRCode(String content, String path, int width, int height) throws WriterException, IOException {
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
//jdk1.7版本以上才能调用
MatrixToImageWriter.writeToPath(bitMatrix, format, new File(path).toPath());
}
}
步骤二:
使用工具类即刻,这边由于项目需求,我使用的是ssh框架整合,具体代码写于action内:
!! 这里我分为了两个action,一个用于生成二维码显示到页面,另一个用于一个传递值的操作
createQrode.action
在你需要显示二维码的页面利用img标签直接访问这个action地址即可显示二维码,在BufferedImage 的括号了吗可以填写一个字符串,也可以是一个网络地址,字符串扫出来则是一串字符,链接地址则会跳转到该链接地址,从前台带过来的值也可以一并以地址栏传值的形式带过去
/**
* 生成二维码
* @throws Exception
*/
@Action("createQrode")
public void createQrode() throws Exception{
//获取id
String fid = request.getParameter("fid");
try {
//采用输出流的方式
//调用二维码生成的工具类
BufferedImage bufferImage = qRCodeUtil.toBufferedImage("http://127.0.0.1:8080/thm/templets/meeting/sign.html?fid='"+fid+"'", 400, 400);
ByteArrayOutputStream out = new ByteArrayOutputStream();
boolean flag = ImageIO.write(bufferImage, "gif", out);
byte[] bytes = out.toByteArray();
OutputStream stream = response.getOutputStream();
stream.write(bytes);
} catch (WriterException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
meetFindQrode.action
这个action的存在实际上是用来传值用的,因为两个页面间的传值相对复杂,甚至再有的框架中不支持两个页面的跳转以及直接访问。
/**
* 二维码页面
* @throws Exception
*/
@Action(value ="meetFindQrode",results = {@Result(name="mfind",location="/templets/meeting/attendance.jsp")})
public String meetFindQrode() throws Exception{
String fid = request.getParameter("fid");
return "mfind";
}
最后总结一下大概的一个思路:
首先我们在页面上可能有一个入口,比如有一个按钮,叫做生成二维码,点击的时候我们跳转到后台findaction,action拿到前台传过来的fid值,跳转到另一个实现二维码的页面。在这个新的页面有一个img便签,src的地址是我们创建二维码的action地址,action返回一个图片到页面的img,就是我们看到的二维码了,这个时候扫码就会有东西了,具体东西还要看你写的什么东西了。可以在括号内写入www.baidu.com进行测试,微信、qq都可以扫码测试!