归功于智能手机,qr码逐渐成为主流,它们正变得越来越有用。从候车亭、产品包装、家装卖场、汽车到很多网站,都在自己的网页集成qr码,让人们快速找到它们。随着智能手机的用户量日益增长,二维码的使用正在呈指数上升。
让我们来看看qr码的简要概述,以及如何在java中生成它们。
qr码(quick response 快速响应码)是矩阵条形码(或二维码)的一种类型,最先为于汽车行业而设计。得益于其快速读取性和较大的存储容量,qr码开始在汽车行业以外流行。图案是在白色背景上由有序排列的黑色方块组成。被编码是的数据可以是四种标准数据(数字、字母数字、字节/二进制、汉字)中的一种,但也可以通过扩展来实现更多数据。

丰田子公司denso wave在1994年发明了qr码,用来追踪生产线上的车辆。从此,qr码成为了最受欢迎的二维条形码直译。qr码的设计支持对内容进行高速解码。
在zxing的下载页面中你会找不到jar文件。必须要通过源代码自己编译,我帮你生成好了,链接在这里。
<a target="_blank" href="http://viralpatel.net/blogs/download/jar/zxing-core-1.7.jar">zxing-core-1.7.jar (346 kb)</a>
<a target="_blank" href="http://viralpatel.net/blogs/download/jar/zxing-j2se-1.7.jar">zxing-javase-1.7.jar (21 kb)</a>
把他们导入到classpath中,然后执行以下java代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<code>package</code>
<code>net.viralpatel.qrcode;</code>
<code>import</code>
<code>java.io.bytearrayoutputstream;</code>
<code>java.io.file;</code>
<code>java.io.filenotfoundexception;</code>
<code>java.io.fileoutputstream;</code>
<code>java.io.ioexception;</code>
<code>net.glxn.qrgen.qrcode;</code>
<code>net.glxn.qrgen.image.imagetype;</code>
<code>public</code>
<code>class</code> <code>main {</code>
<code> </code><code>public</code>
<code>static</code> <code>void</code> <code>main(string[] args) {</code>
<code> </code><code>bytearrayoutputstream out = qrcode.from(</code><code>"hello world"</code><code>).to(imagetype.png).stream();</code>
<code> </code><code>try</code>
<code>{</code>
<code> </code><code>fileoutputstream fout =</code><code>new</code>
<code>fileoutputstream(</code><code>new</code>
<code>file(</code>
<code> </code><code>"c:qr_code.jpg"</code><code>));</code>
<code> </code><code>fout.write(out.tobytearray());</code>
<code> </code><code>fout.flush();</code>
<code> </code><code>fout.close();</code>
<code> </code><code>}</code><code>catch</code>
<code>(filenotfoundexception e) {</code>
<code> </code><code>// do logging</code>
<code>(ioexception e) {</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code>}</code>
这些代码非常直观。我们用qrcode类来生成qr码流,并通过字节流写入到文件c:\qr_code.jpg中。
<a target="_blank" href="http://viralpatel-net-tutorials.googlecode.com/files/qr_code_java.zip">qr_code_java.zip (339 kb)</a>
如果你打开这个jpeg文件,并用你的iphone或android二维码工具来扫一扫,你会看到一个很酷的“hello world” :)
除了使用qrgen的api来生成数据流,我们还可以使用下面的api来创建qr码:
<code>// get qr file from text using defaults</code>
<code>file file = qrcode.from(</code><code>"hello world"</code><code>).file();</code>
<code>// get qr stream from text using defaults</code>
<code>bytearrayoutputstream stream = qrcode.from(</code><code>"hello world"</code><code>).stream();</code>
<code>// override the image type to be jpg</code>
<code>qrcode.from(</code><code>"hello world"</code><code>).to(imagetype.jpg).file();</code>
<code>qrcode.from(</code><code>"hello world"</code><code>).to(imagetype.jpg).stream();</code>
<code>// override image size to be 250x250</code>
<code>qrcode.from(</code><code>"hello world"</code><code>).withsize(</code><code>250</code><code>,</code><code>250</code><code>).file();</code>
<code>qrcode.from(</code><code>"hello world"</code><code>).withsize(</code><code>250</code><code>,</code><code>250</code><code>).stream();</code>
<code>// override size and image type</code>
<code>qrcode.from(</code><code>"hello world"</code><code>).to(imagetype.gif).withsize(</code><code>250</code><code>,</code><code>250</code><code>).file();</code>
<code>qrcode.from(</code><code>"hello world"</code><code>).to(imagetype.gif).withsize(</code><code>250</code><code>,</code><code>250</code><code>).stream();</code>
qr 码最常见的应用便是为网站中一个特定的网页或下载页带来流量。因此,qr码常常会编码url或网站地址,用户可以通过手机摄像头扫描,并在其浏览器中打开。url可以直接编码在qr码中。在上面的的hello world示例中,只需把“hello world”这个字符串替换为需要编码的url。下面是代码片段:
<code>bytearrayoutputstream out = qrcode.from(</code><code>"http://viralpatel.net"</code><code>).to(imagetype.png).stream();</code>
大多数时候,你需要在网站上动态的生成一些qr码。我们已经看到java中生成qr码是多么的容易。现在,我们看看如何把生成qr码集成到java servlet中。
下面是使用qrgen和zxing库来创建qr码的一个简单的http servlet的。qr码的内容可以由用户提供。
该index.jsp文件包含一个简单的html表单,其中有输入框和一个提交按钮。用户可以输入他希望用于编码的的文本并提交。
index.jsp
<code><</code><code>form</code>
<code>action</code><code>=</code><code>"qrservlet"</code>
<code>method</code><code>=</code><code>"get"</code><code>></code>
<code> </code><code><</code><code>p</code><code>>enter text to create qr code</</code><code>p</code><code>></code>
<code> </code><code><</code><code>input</code>
<code>name</code><code>=</code><code>"qrtext"</code>
<code>type</code><code>=</code><code>"text"</code><code>></code>
<code>value</code><code>=</code><code>"generate qr code"</code> <code>type</code><code>=</code><code>"submit"</code><code>></code>
<code></</code><code>form</code><code>></code>
秘密就在qrcodeservlet.java里。在这里,我们使用qrgen和zxing从request.getparameter得到的文本生成qr码。一旦生成qr码流,我们就写入response中并设置适当的content-type。
qrcodeservlet.java
32
33
34
35
36
37
<code>net.viralpatel.qrcodes;</code>
<code>java.io.outputstream;</code>
<code>javax.servlet.servletexception;</code>
<code>javax.servlet.http.httpservlet;</code>
<code>javax.servlet.http.httpservletrequest;</code>
<code>javax.servlet.http.httpservletresponse;</code>
<code>class</code> <code>qrcodeservlet</code><code>extends</code>
<code>httpservlet {</code>
<code> </code><code>@override</code>
<code> </code><code>protected</code>
<code>void</code> <code>doget(httpservletrequest request,</code>
<code> </code><code>httpservletresponse response)</code><code>throws</code>
<code>servletexception, ioexception {</code>
<code> </code><code>string qrtext = request.getparameter(</code><code>"qrtext"</code><code>);</code>
<code> </code><code>bytearrayoutputstream out = qrcode.from(qrtext).to(imagetype.png).stream();</code>
<code> </code><code>response.setcontenttype(</code><code>"image/png"</code><code>);</code>
<code> </code><code>response.setcontentlength(out.size());</code>
<code> </code><code>outputstream outstream = response.getoutputstream();</code>
<code> </code><code>outstream.write(out.tobytearray());</code>
<code> </code><code>outstream.flush();</code>
<code> </code><code>outstream.close();</code>
使用web.xml将/qrservlet请求映射到qrcodeservlet.java。
web.xml
<code><!--?xml version="1.0" encoding="utf-8"?--></code>
<code><</code><code>web-app</code>
<code>xmlns:xsi</code><code>=</code><code>"http://www.w3.org/2001/xmlschema-instance"</code>
<code>xmlns</code><code>=</code><code>"http://java.sun.com/xml/ns/javaee"</code>
<code>xmlns:web</code><code>=</code><code>"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"</code>
<code>xsi:schemalocation</code><code>=</code><code>"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"</code> <code>id</code><code>=</code><code>"webapp_id"</code>
<code>version</code><code>=</code><code>"2.5"</code><code>></code>
<code> </code><code><</code><code>display-name</code><code>>qr_code_servlet</</code><code>display-name</code><code>></code>
<code> </code><code><</code><code>welcome-file-list</code><code>></code>
<code> </code><code><</code><code>welcome-file</code><code>>index.jsp</</code><code>welcome-file</code><code>></code>
<code> </code><code></</code><code>welcome-file-list</code><code>></code>
<code> </code><code><</code><code>servlet</code><code>></code>
<code> </code><code><</code><code>servlet-name</code><code>>qrcodeservlet</</code><code>servlet-name</code><code>></code>
<code> </code><code><</code><code>servlet-class</code><code>>net.viralpatel.qrcodes.qrcodeservlet</</code><code>servlet-class</code><code>></code>
<code> </code><code></</code><code>servlet</code><code>></code>
<code> </code><code><</code><code>servlet-mapping</code><code>></code>
<code> </code><code><</code><code>url-pattern</code><code>>/qrservlet</</code><code>url-pattern</code><code>></code>
<code> </code><code></</code><code>servlet-mapping</code><code>></code>
<code></</code><code>web-app</code><code>></code>
<a target="_blank" href="http://viralpatel-net-tutorials.googlecode.com/files/qr_code_servlet.zip">qr_code_servlet.zip (340 kb)</a>
在java中生成qr码不仅十分容易,还非常方便。将这一功能集成到任何现有的java的应用中简直是小菜一碟!在本教程中,我们学习了如何在java和servlet中生成qr码。