Oracle EBS JSP实现QRCode二维条码

需求背景

由于客户或公司内部要求,在签标贴纸上打印二维条码。另外,自己架建Tomcat Web服务是PC机,通过JSP也是可以实现打印二维条码,由于PC机不稳定,每隔一段时间PC机会宕机,给我们带比较大的困扰。

业务需求

为了解XML报表或者Oracle Report Builder打印批量打印二维条码,并且JSP必须是部署在Oracle EBS应用服务层中。

前提条件

Ø Java基础知识

Ø JSP基础知识

Ø Linux 常用命令如VI

Ø 二维条码QR Code包,如下:

Ø Oracle EBS服务命令

JSP QR Code开发

 实现原理

利用JSPJava文件流实现动态生成二维条码图片,该图片无需保存。

JSP程序代码

如下代码文件:

<%@ page
  language="java"
  import="java.util.*"
  import = "java.awt.*"
  import = "java.awt.Graphics2D"
  import = "java.awt.image.BufferedImage"
  import = "javax.imageio.*"
  import = "com.swetake.util.Qrcode"
%>
<%
Qrcode qrcode=new Qrcode();
//获得条码字符串参数
String barCode=request.getParameter("BARCODE")==null?"No String,Please check!":request.getParameter("BARCODE");
barCode=new String(barCode.getBytes("iso-8859-1"),"utf-8"); //解决中文乱码问题
qrcode.setQrcodeErrorCorrect('S');//纠错级别(L 7%、M 15%、Q 25%、H 30%)和版本有关  
qrcode.setQrcodeEncodeMode('B'); //N代表数字,A代表a-Z,B代表其它字符 。若条码字符串包含中文,则必须为B
qrcode.setQrcodeVersion(3); //设置Qrcode包的版本  
//
int size=8;
//设置下偏移量,如果不加偏移量,有时会导致出错。  
int pixoff = 2;  
String barString = barCode;
byte[] d =barString.getBytes("UTF-8");
BufferedImage bi = new BufferedImage(size*29+3, size*29+3, BufferedImage.TYPE_BYTE_GRAY);
Graphics2D g = bi.createGraphics();
g.setBackground(Color.WHITE);
g.clearRect(0, 0, size*29+3, size*29+3);
g.setColor(Color.BLACK);
if (d.length>0 && d.length <43){
  boolean[][] b = qrcode.calQrcode(d);
  for (int i=0;i<b.length;i++){
    for (int j=0;j<b.length;j++){
     if (b[j][i]) {
       g.fillRect(j*size+pixoff,i*size+pixoff,size,size);
     }
    }
  }
}
g.dispose();
bi.flush();
out.clear();
ServletOutputStream responseOutputStream=response.getOutputStream();
ImageIO.write(bi,"png",responseOutputStream);//生成图片文件流
responseOutputStream.flush();
responseOutputStream.close();
bi=null;
g=null;
qrcode=null;
d=null;
barString=null;	
%>

程序部署

Qrcode包部署

1. Qrcode.jar文件上传到$JAVA_TOP/gobao目录,注意:Oracle EBS应用层用户上传。

2. 修改$IAS_ORACLE_HOME/Apache/Jserv/etc/目录jserv.properties配置文件。在末尾添加:wrapper.classpath=<QRCode.jar全路径>注意:每次执行AutoConfig以后,必须要重新配置


JSP部署

1. gbqrcode.jsp文件上传至$OA_HTML/gobao目录下,注意:Oracle EBS应用层用户上传

2. Oracle EBS版本比较低或者未启用自动编译,则需要手工编译JSP文件。操作命令如:perl $JTF_TOP/admin/scripts/ojspCompile.pl --compile -s gbqrcode.jsp


同时,对应$COMMON_TOP/_pages/_oa__html/_gobao/目录下也会生成一个类文件_gbqrcode.class,若对应的文件没有生成,则说明jsp文件也没有编译成功!

异常问题处理

JSP执行错误

浏览器地址上输入: http://gbdev.gobao.com:8000/OA_HTML/gobao/gbqrcode.jsp?BARCODE=1234。系统提示如下:

Request URI:/OA_HTML/gobao/gbqrcode.jsp

Exception:

java.lang.InternalError: Can't connect to X11 window server using 'gbdev:0.0' as the value of the DISPLAY variable.

同样XML报表也会用于gbdev:0.0为什么不会报错呢?起初我意为是用root用户上传的Qrcode.jargbqrcode.jsp文件,应用层用户调不到Qrcode.jar中的类,修改这些文件的所属用户和用户组,还是报如上错误。然后,到服务器上手工执行如下命令:

1. Root用户下执行命令+xhost

2. 切换到应用层用户执行: export DISPLAY=gbdev:0.0

3. 重启Oracle EBS应用层所有服务

执行仍然提示如上错误。

最后,修改$APPL_TOP/admin目录下GBDEV_gbdev.xml的环境配置文件(注意:记得先备份该文件哟,有问题还有回头路可以走),如下:

执行AutoConfig使用环境配置文件生效,再一次修改$IAS_ORACLE_HOME/Apache/Jserv/etc/目录jserv.properties配置文件。在末尾添加:wrapper.classpath=<QRCode.jar全路径>。参考:Qrcode.jar包部署

中文参数值问题

开发XML报表时,给该JSP程序传中文参数时,需要对参数值进行转换字符编码,主要方法如下:

1. Oracle数据库标准包:utl_url.escape可以对字符串进行URLEncode

begin
  dbms_output.put_line(utl_url.escape('Oracle EBS QRCode二维条转码',true,'GB2312'));
  dbms_output.put_line(utl_url.escape('Oracle EBS QRCode二维条转码',false,'GB2312'));
  dbms_output.put_line(utl_url.escape('Oracle EBS QRCode二维条转码',true,'UTF8'));
  dbms_output.put_line(utl_url.escape('Oracle EBS QRCode二维条转码',false,'UTF8'));
end;

1. Oracle数据库标准包:utl_url.unescape可以对字符串进行URLDecode

begin
 dbms_output.put_line(utl_url.unescape('Oracle%20EBS%20QRCode%E4%BA%8C%E7%BB%B4%E6%9D%A1%E8%BD%AC%E7%A0%81','UTF8'));
end;

猜你喜欢

转载自blog.csdn.net/chenxianping/article/details/80632179