Java進階之JSP生成條形碼知識點總結
阿新 • • 發佈:2019-01-25
JSP生成條形碼 例項說明 條形碼是用於區分產品的一組編號,但是以條碼形式呈現給使用者,例如圖書上的ISBN編碼、超市商品的條形碼、各種電子產品和保修憑證上的條形碼等等。本例項在JSP頁面實現了條形碼的線上生成功能使用者在如圖1所示的頁面中可以輸入要生成條形碼的產品編號,也可以包含英文字母,單擊“生成條形碼”按鈕,在圖2所示的頁面中會生成各種編碼格式的條形碼圖片。
圖一 輸入產品編號
圖二 打印出的條形碼
技術要點 本例項使用了開源的JBarcodeBean元件。該主頁的下載網址為http://jbarcodebean.sourceforge.net/。它是一個JFC Swing相容的JavaBean元件,主要用來產生條形碼。JBarcodeBean支援當前一些流行的條形碼格式,例如Code 128,Code 39,ExtendedCode 39,Codabar Interleaved Code 25 ,MSI ,EAN-13,EAN-8等。 本例項使用的JBarcodeBean元件版本為1.1.5。下面分別介紹例項中應用到該元件的關鍵技術。 (1)設定條形碼顯示文字 條形碼都是根據產品編號生成的,那麼這個產品編號就是條形碼的文字,通過JBarcodeBean類的setShowText()方法可以設定生成的條形碼圖片是否包含這個文字資訊。其語法格式如下:setShowText(Boolean show) show:如果需要顯示條形碼文字,設定該引數為true,否則設定為。 (2)輸出條形碼 JBarcodeBean類的gifEncode()方法用於輸出GIF格式的條形碼圖片,輸出方式可以是任何的Java輸出流。其語法格式如下: gifEncode(OutputStream out) out:任何型別的Java輸出流物件。 本例項使用gifEncode()方法將條形碼輸出到應答物件的輸出流,客戶端會直接顯示GIF格式的條形碼圖片。關鍵程式碼如下。
barcode.setCodeType(codeType); //設定指定編碼型別barcode.setCode(request.getParameter("code")); // 設定條形碼數值 barcode.setBarcodeHeight(70); //設定條形碼的高度 barcode.setCheckDigit(false); barcode.setFont(barcode.getFont().deriveFont(14)); //設定文字字型 barcode.gifEncode(out); //輸出條形碼 開發步驟 (1)編寫index.jsp首頁面,在首頁面中定義接收產品編號的文字框和執行條碼生成的提交按鈕。程式關鍵程式碼如下。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP生成條形碼</title>
</head>
<body>
<form method="get" action="result.jsp">
請輸入產品編號:
<input name="code" type="text">
<input type="submit" value="生成條形碼">
</form>
</body>
</html>
(2)編寫result.jsp頁面,這個頁面將接收首頁中使用者輸入的產品編號,然後把將產品編號傳遞給ServletTest類,並指定不同的編碼格式,在頁面中顯示各種編碼的條形碼。關鍵程式碼如下。
<body>
<table border="1" width="300">
<tr align="center" bgcolor="#8AC52D">
<td>Code 11編碼</td>
<td>Code 128編碼</td>
<td>Code 39 3:1編碼</td>
<td>Code 39_2:1編碼</td>
</tr>
<tr align="center">
<td><img src="ServletTest?code=${param.code }&type=<%=CodeType.Code_11%>"></td>
<td><img src="ServletTest?code=${param.code }&type=<%=CodeType.Code_128%>"></td>
<td><img src="ServletTest?code=${param.code }&type=<%=CodeType.Code_39_3_1%>"></td>
<td><img src="ServletTest?code=${param.code }&type=<%=CodeType.Code_39_2_1%>"></td>
</tr>
<tr align="center" bgcolor="#8AC52D">
<td>Code 93編碼</td>
<td>Code 93 Extended編碼</td>
<td>Ext Code 39 3:1編碼</td>
<td>Ext Code 39 2:1編碼</td>
</tr>
<tr align="center">
<td><img src="ServletTest?code=${param.code }&type=<%=CodeType.Code_93%>"></td>
<td><img src="ServletTest?code=${param.code }&type=<%=CodeType.Code_93_Extended%>"></td>
<td><img src="ServletTest?code=${param.code }&type=<%=CodeType.Ext_Code_39_3_1%>"></td>
<td><img src="ServletTest?code=${param.code }&type=<%=CodeType.Ext_Code_39_2_1%>"></td>
</tr>
<tr align="center" bgcolor="#8AC52D">
<td>InterLeaved 25 3:1編碼</td>
<td>InterLeaved 25 2:1編碼</td>
<td>MSI model10 check編碼</td>
<td>Codabar 3:1編碼</td>
</tr>
<tr align="center">
<td><img src="ServletTest?code=${param.code }&type=<%=CodeType.InterLeaved_25_3_1%>"></td>
<td><img src="ServletTest?code=${param.code }&type=<%=CodeType.InterLeaved_25_2_1%>"></td>
<td><img src="ServletTest?code=${param.code }&type=<%=CodeType.MSI_model10_check%>"></td>
<td><img src="ServletTest?code=${param.code }&type=<%=CodeType.Codabar_3_1%>"></td>
</tr>
<tr align="center" bgcolor="#8AC52D">
<td>Codabar_2_1編碼</td>
<td>EAN_13編碼</td>
<td>EAN_8編碼</td>
<td> </td>
</tr>
<tr align="center">
<td><img src="ServletTest?code=${param.code }&type=<%=CodeType.Codabar_2_1%>"></td>
<td><img src="ServletTest?code=${param.code }&type=<%=CodeType.EAN_13%>"></td>
<td><img src="ServletTest?code=${param.code }&type=<%=CodeType.EAN_8%>"></td>
<td> </td>
</tr>
</table>
</body>
(3)編寫CodeType介面,在該介面中定義靜態的常量,使用這些常量分別是代表不同的編碼格式,關鍵程式碼如下。
<span style="font-family:Microsoft YaHei;"><span style="font-size: 14px;">public interface CodeType {
public static int Code_11=0x1;
public static int Code_128=0x2;
public static int Code_39_3_1=0x3;
public static int Code_39_2_1=0x4;
public static int Ext_Code_39_3_1=0x5;
public static int Ext_Code_39_2_1=0x6;
public static int Code_93=0x7;
public static int Code_93_Extended=0x8;
public static int InterLeaved_25_3_1=0x9;
public static int InterLeaved_25_2_1=0x10;
public static int MSI_model10_check=0x11;
public static int Codabar_3_1=0x12;
public static int Codabar_2_1=0x13;
public static int EAN_13=0x14;
public static int EAN_8=0x15;
(4)編寫ServletTest類,它是處理條碼生成請求的Servlet。在給類中建立JBarcodeBean類的全域性成員變數barcode,它將被其他方法呼叫。關鍵程式碼如下。
public class ServletTestextends HttpServlet { JBarcodeBean barcode;
編寫Servlet的初始化方法init(),在該方法中初始化JBarcodeBean類的物件,並設定該物件在生成條形碼時,顯示條形碼的文字資訊。關鍵程式碼如下。 public void init(ServletConfig conf) throwsServletException { super.init(conf); barcode = new JBarcodeBean(); // 初始化條形碼工具類 barcode.setShowText(true); //設定生成的條形碼顯示文字資訊 } 編寫processRequest()方法,在本例項中該方法處理處理GET方法和POST方法的頁面請求,它通過matchType()方法確定生成條形碼的編碼型別,然後生成生成條形碼的其他引數資訊,例如生成條形碼的產品編號、條形碼的高度、編碼型別等。最後,將生成的條形碼輸出到客戶端的輸出流。關鍵程式碼如下。
protected synchronized void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.setContentType("image/gif"); // 設定響應物件的資料型別為GIF圖片
OutputStream out = response.getOutputStream(); // 獲取響應物件的輸出流
BarcodeStrategy codeType = null; // 建立條形碼型別物件
String typeStr = request.getParameter("type");
int type = 0;
if (typeStr == null || typeStr.isEmpty()) {
type = Code_11;
} else {
type = Integer.parseInt(typeStr);
}
codeType = matchType(type); // 匹配指定編碼型別
barcode.setCodeType(codeType); // 設定指定編碼型別
barcode.setCode(request.getParameter("code"));// 設定條形碼數值
barcode.setBarcodeHeight(70); // 設定條形碼的高度
barcode.setCheckDigit(false);
barcode.setFont(barcode.getFont().deriveFont(14)); // 設定文字字型
barcode.gifEncode(out); // 輸出條形碼影象資料
}
編寫matchType()方法,該方法用於生成和頁面請求的編碼格式相匹配的條形編碼物件。關鍵程式碼如下。
private BarcodeStrategy matchType(int type) {
BarcodeStrategy codeType = null;
switch (type) {
// 設定條形碼的編碼型別
case Code_128:
codeType = new Code128();
break;
case Code_39_3_1:
codeType = new Code39();
break;
case Code_39_2_1:
codeType = new Code39_2to1();
break;
case Ext_Code_39_3_1:
codeType = new ExtendedCode39();
break;
case Ext_Code_39_2_1:
codeType = new ExtendedCode39_2to1();
break;
case Code_93:
codeType = new Code93();
break;
case Code_93_Extended:
codeType = new Code93Extended();
break;
case InterLeaved_25_3_1:
codeType = new Interleaved25();
break;
case InterLeaved_25_2_1:
codeType = new Interleaved25_2to1();
break;
case MSI_model10_check:
codeType = new MSI();
break;
case Codabar_3_1:
codeType = new Codabar();
break;
case Codabar_2_1:
codeType = new Codabar_2to1();
break;
case EAN_13:
codeType = new Ean13();
break;
case EAN_8:
codeType = new Ean8();
break;
default:
codeType = new Code11();
}
return codeType;
}
……// 省略部分程式碼
}