最近进行了一系列报表的开发,有HTML、报表、条形码标签打印等等,在开发过程中遇到了一些问题,现在我把这些问题总结下来分享给大家。
HTML图片背景不显示这个问题,网上有很多解决方法。有的是改JAR文件源码、有的则是自己建立一个IMAGE文件夹。 可我觉得,以上方法代价太大,特别是自己增加IMAGE文件夹并放入PX.GIF文件的方法,如果以后开发带图表的报表,IMAGE文件夹里怎么增加图片?所以显然是不可取的。 由于笔者所做项目代码比较繁杂,也没有统一对Action请求加入.action或.do后缀,依靠过滤器来达到目地的解决方案对楼主也是不可取的。
怎么解决这个问题呢? 我们先从原理上分析: 从struts2报的错上可以看出, Struts2是把背景图片PX当做ACTION了。知道这个原理,一般来说能想到3种解决方案:方案一.从struts2的拦截器上下功夫,不再拦截一切, 如web.xml中的 /.*配置。 方案 二.既然struts2把PX图片当成请求,我们就逆向思维, 在生成HTML时,设置export属性禁用图片,这样就不会冲突了。 属性设置关键代码为:
JRHtmlExporter exporter = new JRHtmlExporter();
exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);
方案三:也是我最推崇并使用的方案。 建立一个空ACTION, 做为PX请求的中转, 最后再返回图片地址。 这样做充分利用了JAR的源码,我们只是针对冲突做了个简单的中转而已。代码如下:
在sturts2.xml文件中加入以下代码:
<package name="servlets" extends="struts-default" namespace="/servlets">
<action name="image" class="com.main.action.ServletTempAction" method="jasperreportImg">
<result>/servlets/image</result>
</action>
</package>
<result name="printBillByIreport" type="jasper">
<param name="location">/jasperTemplate/billFormatStyleFive.jasper</param>
<param name="dataSource">printDataList</param>
<param name="format">HTML</param>
<param name="imageServletUrl"><![CDATA[/servlets/image?image=]]></param>
<param name="documentHeader">bill_no2</param>
</result>
增加临时中转action,代码如下:
public class ServletTempAction extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = 6218836747053969789L;
/**
* jasperreport中的图片servlet
* @return
*/
public String jasperreportImg()
{
return SUCCESS;
}
}
在web.xml中加入image的servlet声明:
<servlet-name>ImageServlet</servlet-name>
<servlet-class>net.sf.jasperreports.j2ee.servlets.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ImageServlet</servlet-name>
<url-pattern>/servlets/image</url-pattern>
</servlet-mapping>
如此设置后,就会发现HTML背景图片不显示问题彻底解决了。 希望对大家有用