用jasperreports在applet中实现打印功能开发总结

关于Jasperreport部分
1.假如表格需要一行total之类的总结行,可以在select语句中使用union把这行total内容作为表格的数据显示出来,当然涉及到排序,可以再加一列数字列
2.为了开发方便,可以设定一个parameter默认值,并设定为不提示输入的方式,示例代码:
<parameter name="poNo" class="java.lang.String" isForPrompting="false">
<defaultValueExpression><![CDATA["4500198874"]]></defaultValueExpression>
</parameter>
3.发现一个问题,在主报表中detail与column footer总是存在一条空白,由于我的这个报表的表头与页尾之类的内容都用线包裹起来的,所以这条空白格太难看了。经过非常多的测试后,发现在子报表中就不存在这条空白,所以必须要用子报表实现这个功能。
4.对于一些重复的代码,可以使用variable来定义变量,然后就可以在其他地方使用了,比如:
定义:
<variable name="COMPANY_ADDRESS" class="java.lang.String">
<variableExpression><![CDATA[( $F{COMPANY_CODE}.equalsIgnoreCase("sh") ?
"公司上海地址"
:
"其它地方地址"
)]]></variableExpression>
使用:
<textField>
<reportElement x="276" y="101" width="526" height="57"/>
<textElement markup="html">
<font fontName="宋体" size="8"/>
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[$P{COMPANY_ADDRESS}]]></textFieldExpression>
</textField>
5.对于需要换行的动态内容,可以把markup设置为html,然后在内容添加<br>标签,比如:
<textField pattern="">
<reportElement x="459" y="104" width="51" height="23"/>
<textElement textAlignment="Center" markup="html">
<font fontName="宋体" size="8"/>
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA["单价"+$P{CURRENCY}+"<br>Unit Price"]]></textFieldExpression>
</textField>
6.用一些变量来区分开发与生产环境,比如:子报表的位置在开发与生产环境是不一样的,在开发环境中我们用文件系统的绝对位置,在生产环境中使用URL地址,那我们就可以使用一些变量来区分,这样就不会每次开发好了需要修改子报表地址,比如:
( $P{MODE}.equals("test") ?
"C://reports//order.jasper"
:
$P{URL}+"/reports/order.jasper"
)
7.关于图片的显示,可以用两种方式来显示图片:
A.假如直接从数据库查出Blob字段图片,则直接可以在报表中把Field类型改为java.awt.Image类型,然后把这个变量付给报表的Image标签,比如:
SIGNATURE是Blob字段
<field name="SIGNATURE" class="java.awt.Image"/>
<image>
<reportElement x="599" y="47" width="34" height="35"/>
<imageExpression class="java.awt.Image"><![CDATA[$P{SIGNATURE}]]></imageExpression>
</image>
B.显示文件系统图片,或者通过URL访问的
<variable name="LOGO_URL" class="java.lang.String">
<variableExpression><![CDATA[( $P{MODE}.equals("test") ?
"C://images//logo.jpg"
:
$P{URL}+"/images/logo.jpg"
)]]></variableExpression>
<image>
<reportElement x="101" y="98" width="35" height="31"/>
<imageExpression class="java.lang.String"><![CDATA[$P{LOGO_URL}]]></imageExpression>
</image>
8.关于划线技巧,在iReport里想选中一条线是非常困难的,但是我们可以用左面的Report Inspector界面选中,然后直接在属性框中修改位置与长度,假如想让线左对齐的话,可以选中很多条线,一起在属性框中修改Left属性,当然其他对齐方式,可以相应修改Top,Width,Height等属性
9.假如在一个主报表中,有2个子报表(我没测试2个以上子报表),而且我们想让每个子报表的起始页都在独立一页中,而不是紧接着上页的后面显示,那怎么办呢?可以在主报表中拉大detail的band高度,留下的空间,不足以显示第二个子报表的页头或者表头等(当然,要看第二个子报表的页头连贯的长度),具体设置为多长,只能自己摸索了。
10.关于子报表,可以在detail中放置多个子报表,每个子报表放在一个独立band中

关于Applet部分:
1.jasperreports提供了一个用swing实现的具有预览功能的面板JRViewer,这个面板在iReport里面大量使用,applet打印功能也就是再放一个JRViewer
2.applet功能需要依赖的jar包:commons-collections-2.1.1.jar,commons-digester-1.7.jar,commons-logging-1.0.4.jar,jasperreports-3.7.4.jar,jasperreports-applet-3.7.4.jar,jasperreports-fonts-3.7.4.jar
3.开始的时候,可以参考japserreports提供的demo里有关于applet的示例代码。
4.把applet的package与html中applet标签的codebase没有直接关系,codebase是applet标签寻找所有与applet相关资源的根目录,我们jar包,签名证书等都放到codebase目录下,code属性的值必须用Applet类的全名,包括pacakage。
5.由于applet依赖很多jar包,这里我们可以把所有的jar解压缩,然后再与Applet类打包到一个jar,也可以保留现状,单独打包applet,但是需要单独对每个jar进行签名认证,可能比较麻烦一些。但是有些时候,一些第三方jar的license是不允许重新打包的,那就必须要单独放置jar包。记住,必须要对每个jar单独签名,不能只对applet jar包签名。否则还是会显示权限不对
6.jar签名认证流程
(1)生成证书: keytool -genkey -alias printkey -dname "CN=TKE, OU=TKE, O=TKE, L=sh, ST=sh,C=cn" -keystore printstore -keypass tkeportal -storepass tkeportal -validity 3650
默认的签名只有半年的有效期,这里我们用-validity参数设定为10年的有效期
(2)导出证书: keytool -export -keystore printstore -alias printkey -file print.cer -storepass tkeportal
(3)对jar包签名:
jarsigner -keystore printstore reportprint.jar printkey
jarsigner -keystore printstore barbecue-1.5-beta1.jar printkey
jarsigner -keystore printstore commons-collections-2.1.1.jar printkey
jarsigner -keystore printstore commons-digester-1.7.jar printkey
jarsigner -keystore printstore commons-logging-1.0.4.jar printkey
jarsigner -keystore printstore jasperreports-3.7.4.jar printkey
jarsigner -keystore printstore jasperreports-applet-3.7.4.jar printkey
jarsigner -keystore printstore jasperreports-fonts-3.7.4.jar printkey
7.JSP里Applet示例代码:
<APPLET WIDTH="1160" HEIGHT="470">
<PARAM NAME=CODE VALUE="com.tke.applet.EmbeddedViewerApplet.class" >
<PARAM NAME=CODEBASE VALUE="${ctx}/applet" >
<PARAM NAME=ARCHIVE VALUE="reportprint.jar,barbecue-1.5-beta1.jar,commons-collections-2.1.1.jar,commons-digester-1.7.jar,commons-logging-1.0.4.jar,jasperreports-3.7.4.jar,jasperreports-applet-3.7.4.jar,jasperreports-fonts-3.7.4.jar" >
<PARAM NAME="type" VALUE="application/x-java-applet;version=1.5">
<PARAM NAME="scriptable" VALUE="false">
<PARAM NAME="REPORT_URL" VALUE="${ctx}/order/loadJasperPrint.action?poNo=<s:property value='poNo'/>">
</APPLET>
8.codebase最好包括context名称,因为包括applet的代码不一定是在根目录下,我们平时看到好多示例代码都是在根目录来演示的,所以不需要context
9.假如出现如下错误,原因可能是客户端的包括一个同名的旧签名证书,只要删除就可以了。
此发行者无法被验证时可信来源。代码将按未签名处理。
sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: signature check failed
10.每次更新了Applet相关文件,比如jar包与证书,都需要关闭当前浏览器,重新登录系统。
11.假如用到barcode功能,但是applet中未加载barbecue-1.5-beta1.jar,则applet会报一个不相干的错误:
ClientAbortException: java.net.SocketException: Software caused connection abort: socket write error

你可能感兴趣的:(jasperreports)