Action接口:QRAction.java
import java.io.FileInputStream;
import org.apache.struts2.ServletActionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.opensymphony.xwork2.ActionSupport;
public class QRCodeAction extends ActionSupport{
private static final long serialVersionUID = 2345787210526965802L;
private static Logger log = LoggerFactory.getLogger(QRCodeAction.class);
private String url;
public String produce(){
try{
QRCode qr = new QRCode();
String imgPath = "/tmp/" + System.currentTimeMillis() + ".png";
qr.encoderQRCode(url.replaceAll("\\*", "\\&"), imgPath);
FileInputStream is = new FileInputStream(imgPath);
ServletActionContext.getContext().put("imageStream", is);
//删除缓存的二维码图片
deleteFile(imgPath);
}catch(Exception e){
log.error("生成二维码错误", e);
}
return "produce";
}
public static boolean deleteFile(String fileName) {
File file = new File(fileName);
if (file.isFile() && file.exists()) {
file.delete();
return true;
} else {
return false;
}
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
二维码工具类QRCode.java:
import net.glxn.qrgen.javase.QRCode;
import java.io.File;
import java.io.OutputStream;
public class QRCode {
/**
* 生成二维码(QRCode)图片
* @param content 存储内容
* @param imgPath 图片路径
*/
public void encoderQRCode(String content, String imgPath) {
this.encoderQRCode(content, imgPath, "png", 7);
}
/**
* 生成二维码(QRCode)图片
* @param content 存储内容
* @param imgPath 图片路径
* @param imgType 图片类型
* @param size 二维码尺寸
*/
public void encoderQRCode(String content, String imgPath, String imgType, int size) {
try {
File imgFile = new File(imgPath);
// 生成二维码QRCode图片
int imgSize = 0;
imgSize = 67 + 12 * (size - 1);
File file = QRCode.from(new String(content.getBytes("utf-8"))).withSize(imgSize, imgSize).file();
file.renameTo(imgFile);
} catch (Exception e) {
e.printStackTrace();
}
}
}
struts配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="qrcode" namespace="/qrcode" extends="demo">
<global-results>
<result name="jsonResult" type="json">
<param name="root">queryJson</param>
</result>
</global-results>
<action name="*QRCode" class="qRCode" method="{1}" >
<result name="produce" type="stream">
<param name="contentType">image/png</param>
<param name="inputName">imageStream</param>
</result>
<interceptor-ref name="defaultStack" />
</action>
</package>
</struts>
jsp页面:
图片标签的src属性值为后台接口地址
<img src="" id="code">
<script>
jQuery(document).ready(function() {
//图片标签的src属性值为后台接口地址,页面初始化就会掉后台接口,或者手动控制js在合适时机调接口
$("#code").attr('src','${web.context.path}/qrcode/produceQRCode?url='+previewUrl);
//previewUrl为要转成二维码的页面url,或者单纯的文字字符串
}
</script>