歸功于智能手機,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碼。