1. 程式人生 > >Java進階之JSP生成條形碼知識點總結

Java進階之JSP生成條形碼知識點總結

                              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;
    }
……// 省略部分程式碼
}