歸功於智能手機,QR碼逐漸成爲主流,它們正變得愈來愈有用。從候車亭、產品包裝、家裝賣場、汽車到不少網站,都在本身的網頁集成QR碼,讓人們快速找到它們。隨着智能手機的用戶量日益增加,二維碼的使用正在呈指數上升。html
讓咱們來看看QR碼的簡要概述,以及如何在Java中生成它們。java
QR碼(Quick Response 快速響應碼)是矩陣條形碼(或二維碼)的一種類型,最早爲於汽車行業而設計。得益於其快速讀取性和較大的存儲容量,QR碼開始在汽車行業之外流行。圖案是在白色背景上由有序排列的黑色方塊組成。被編碼是的數據能夠是四種標準數據(數字、字母數字、字節/二進制、漢字)中的一種,但也能夠經過擴展來實現更多數據。git
豐田子公司Denso Wave在1994年發明了QR碼,用來追蹤生產線上的車輛。今後,QR碼成爲了最受歡迎的二維條形碼直譯。QR碼的設計支持對內容進行高速解碼。github
Zebra Crossing(ZXing)是一個很棒的,幾乎能夠在全部平臺(Android、JavaSE、iPhone、RIM、Symbian)中能夠用來生成、解析QR碼的開源庫。可是,若是你只是要生成簡單的QR碼,利用它反而很差實現。web
QRGen在ZXing基礎上開發,這個庫使得利用Java生成QR碼變爲小菜一碟。它須要依賴ZXing,因此生成圖案時你同時須要ZXing和QRGen的jar包。瀏覽器
在ZXing的下載頁面中你會找不到jar文件。必需要經過源代碼本身編譯,我幫你生成好了,連接在這裏。app
QRGen的jar包能夠經過官網下載。jsp
把他們導入到classpath中,而後執行如下Java代碼:ide
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
|
package
net.viralpatel.qrcode;
import
java.io.ByteArrayOutputStream;
import
java.io.File;
import
java.io.FileNotFoundException;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
net.glxn.qrgen.QRCode;
import
net.glxn.qrgen.image.ImageType;
public
class
Main {
public
static
void
main(String[] args) {
ByteArrayOutputStream out = QRCode.from(
"Hello World"
).to(ImageType.PNG).stream();
try
{
FileOutputStream fout =
new
FileOutputStream(
new
File(
"C:QR_Code.JPG"
));
fout.write(out.toByteArray());
fout.flush();
fout.close();
}
catch
(FileNotFoundException e) {
// Do Logging
}
catch
(IOException e) {
// Do Logging
}
}
}
|
這些代碼很是直觀。咱們用QRCode類來生成QR碼流,並經過字節流寫入到文件C:\QR_Code.jpg中。工具
若是你打開這個JPEG文件,並用你的iPhone或Android二維碼工具來掃一掃,你會看到一個很酷的「Hello World」 :)
除了使用QRGen的API來生成數據流,咱們還可使用下面的API來建立QR碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// get QR file from text using defaults
File file = QRCode.from(
"Hello World"
).file();
// get QR stream from text using defaults
ByteArrayOutputStream stream = QRCode.from(
"Hello World"
).stream();
// override the image type to be JPG
QRCode.from(
"Hello World"
).to(ImageType.JPG).file();
QRCode.from(
"Hello World"
).to(ImageType.JPG).stream();
// override image size to be 250x250
QRCode.from(
"Hello World"
).withSize(
250
,
250
).file();
QRCode.from(
"Hello World"
).withSize(
250
,
250
).stream();
// override size and image type
QRCode.from(
"Hello World"
).to(ImageType.GIF).withSize(
250
,
250
).file();
QRCode.from(
"Hello World"
).to(ImageType.GIF).withSize(
250
,
250
).stream();
|
QR 碼最多見的應用即是爲網站中一個特定的網頁或下載頁帶來流量。所以,QR碼經常會編碼URL或網站地址,用戶能夠經過手機攝像頭掃描,並在其瀏覽器中打開。URL能夠直接編碼在QR碼中。在上面的的Hello World示例中,只需把「Hello World」這個字符串替換爲須要編碼的URL。下面是代碼片斷:
1
|
ByteArrayOutputStream out = QRCode.from(
"http://viralpatel.net"
).to(ImageType.PNG).stream();
|
大多數時候,你須要在網站上動態的生成一些QR碼。咱們已經看到Java中生成QR碼是多麼的容易。如今,咱們看看如何把生成QR碼集成到Java Servlet中。
下面是使用QRGen和ZXing庫來建立QR碼的一個簡單的HTTP Servlet的。QR碼的內容能夠由用戶提供。
該index.jsp文件包含一個簡單的HTML表單,其中有輸入框和一個提交按鈕。用戶能夠輸入他但願用於編碼的的文本並提交。
index.jsp
1
2
3
4
5
|
<
form
action
=
"qrservlet"
method
=
"get"
>
<
p
>Enter Text to create QR Code</
p
>
<
input
name
=
"qrtext"
type
=
"text"
>
<
input
value
=
"Generate QR Code"
type
=
"submit"
>
</
form
>
|
祕密就在QRCodeServlet.java裏。在這裏,咱們使用QRGen和ZXing從request.getParameter獲得的文本生成QR碼。一旦生成QR碼流,咱們就寫入response中並設置適當的content-type。
QRCodeServlet.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
32
33
34
35
36
37
|
package
net.viralpatel.qrcodes;
import
java.io.ByteArrayOutputStream;
import
java.io.File;
import
java.io.FileNotFoundException;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.io.OutputStream;
import
javax.servlet.ServletException;
import
javax.servlet.http.HttpServlet;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
net.glxn.qrgen.QRCode;
import
net.glxn.qrgen.image.ImageType;
public
class
QRCodeServlet
extends
HttpServlet {
@Override
protected
void
doGet(HttpServletRequest request,
HttpServletResponse response)
throws
ServletException, IOException {
String qrtext = request.getParameter(
"qrtext"
);
ByteArrayOutputStream out = QRCode.from(qrtext).to(ImageType.PNG).stream();
response.setContentType(
"image/png"
);
response.setContentLength(out.size());
OutputStream outStream = response.getOutputStream();
outStream.write(out.toByteArray());
outStream.flush();
outStream.close();
}
}
|
使用web.xml將/qrservlet請求映射到QRCodeServlet.java。
web.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<!--?xml version="1.0" encoding="UTF-8"?-->
<
web-app
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns
=
"http://java.sun.com/xml/ns/javaee"
xmlns:web
=
"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemalocation
=
"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id
=
"WebApp_ID"
version
=
"2.5"
>
<
display-name
>QR_Code_Servlet</
display-name
>
<
welcome-file-list
>
<
welcome-file
>index.jsp</
welcome-file
>
</
welcome-file-list
>
<
servlet
>
<
servlet-name
>QRCodeServlet</
servlet-name
>
<
servlet-class
>net.viralpatel.qrcodes.QRCodeServlet</
servlet-class
>
</
servlet
>
<
servlet-mapping
>
<
servlet-name
>QRCodeServlet</
servlet-name
>
<
url-pattern
>/qrservlet</
url-pattern
>
</
servlet-mapping
>
</
web-app
>
|
在Java中生成QR碼不只十分容易,還很是方便。將這一功能集成到任何現有的Java的應用中簡直是小菜一碟!在本教程中,咱們學習瞭如何在Java和Servlet中生成QR碼。