Struts2 JasperReport如何编译子报表

javaors 2009-11-17 08:41:51
我现在已经能将JasperReport的单纯的父报表以PDF的形式打印显示,用ireport工具生成子报表的,在工具里面是显示的,但是放到Web工程里面老是报无法加载子报表,错误如下:
Stacktraces
javax.servlet.ServletException: Could not load object from location : .\testsub_subreport0.jasper
org.apache.struts2.views.jasperreports.JasperReportsResult.doExecute(JasperReportsResult.java:304)
org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186)
com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:361)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:265)
com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:163)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:249)
org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:148)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:93)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:128)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:104)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:148)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:128)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:468)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
java.lang.Thread.run(Unknown Source)

我的父报表名称是testsub.jrxml,子报表名称是testsub_subreport0.jrxml,其中
testsub.jrxml为:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Created with iReport - A designer for JasperReports -->
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport
name="testsub"
columnCount="1"
printOrder="Vertical"
orientation="Portrait"
pageWidth="595"
pageHeight="842"
columnWidth="535"
columnSpacing="0"
leftMargin="30"
rightMargin="30"
topMargin="20"
bottomMargin="20"
whenNoDataType="NoPages"
isTitleNewPage="false"
isSummaryNewPage="false">
<property name="ireport.scriptlethandling" value="2" />
<property name="ireport.encoding" value="UTF-8" />
<import value="java.util.*" />
<import value="net.sf.jasperreports.engine.*" />
<import value="net.sf.jasperreports.engine.data.*" />

<parameter name="SUBREPORT_DIR" isForPrompting="true" class="java.lang.String">
<defaultValueExpression ><![CDATA[".\\"]]></defaultValueExpression>
</parameter>

<background>
<band height="0" isSplitAllowed="true" >
</band>
</background>
<title>
<band height="50" isSplitAllowed="true" >
</band>
</title>
<pageHeader>
<band height="50" isSplitAllowed="true" >
</band>
</pageHeader>
<columnHeader>
<band height="30" isSplitAllowed="true" >
</band>
</columnHeader>
<detail>
<band height="100" isSplitAllowed="true" >
<subreport isUsingCache="true">
<reportElement
x="113"
y="13"
width="343"
height="68"
key="subreport-1"/>
<subreportExpression class="java.lang.String"><![CDATA[$P{SUBREPORT_DIR} + "testsub_subreport0.jasper"]]></subreportExpression> </subreport>
</band>
</detail>
<columnFooter>
<band height="30" isSplitAllowed="true" >
</band>
</columnFooter>
<pageFooter>
<band height="50" isSplitAllowed="true" >
</band>
</pageFooter>
<lastPageFooter>
<band height="50" isSplitAllowed="true" >
</band>
</lastPageFooter>
<summary>
<band height="50" isSplitAllowed="true" >
</band>
</summary>
</jasperReport>

请教高人,如何编译子报表,在哪个编译,是ACTION层吗?目前ACTION的代码为:
String reportSource;
reportSource = ServletActionContext.getServletContext()
.getRealPath("/jasper/testsub.jrxml");
File parent = new File(reportSource).getParentFile();
System.out.println(parent);
File compiled = new File(parent, "compiled_testsub.jasper");
JasperCompileManager.compileReportToFile(reportSource, new File(
parent, "compiled_testsub.jasper")
.getAbsolutePath());
这个是用来编译父报表的。
还有如何解决上面的报道错误。
...全文
418 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ay2860 2010-09-08
  • 打赏
  • 举报
回复
我也在为这个问题纠结,今天要交任务了...
javaors 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 youjianbo_han_87 的回复:]
引用 17 楼 javaors 的回复:



实在不行,就换个工具把,我知道一个产生PDF报表的框架,直接可以根据html生成pdf,意思就是说,你只要做好html(这个要做多好就能做多好吧),然后用这个框架转换成pdf即可。不过还不成熟。
[/Quote]



什么工具?
youjianbo_han_87 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 javaors 的回复:]

[/Quote]

实在不行,就换个工具把,我知道一个产生PDF报表的框架,直接可以根据html生成pdf,意思就是说,你只要做好html(这个要做多好就能做多好吧),然后用这个框架转换成pdf即可。不过还不成熟。
youjianbo_han_87 2009-11-17
  • 打赏
  • 举报
回复
jasperReprot我一般都是用 ireport工具来编译,只要把相应的jar包加入就可以了。楼主是不是struts jar包没加对。
海A天空 2009-11-17
  • 打赏
  • 举报
回复
顶lz了,接分..
javaors 2009-11-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jcheator 的回复:]
估计是你父报表中写的子报表的路径有问题,加载错误。另外父子报表都要正确编译,LZ关注这2个方面就差不多了
[/Quote]

现在父类的是没有问题,就是不知道子类该如何编译,何时编译
Jcheator 2009-11-17
  • 打赏
  • 举报
回复
估计是你父报表中写的子报表的路径有问题,加载错误。另外父子报表都要正确编译,LZ关注这2个方面就差不多了
liuchyx2007 2009-11-17
  • 打赏
  • 举报
回复
看错误提示,加载的路径不对,关注,帮顶
javaors 2009-11-17
  • 打赏
  • 举报
回复
javaors 2009-11-17
  • 打赏
  • 举报
回复
子报表没有显示,不知道是加载没加上,还是加上了没显示。


等待报表达人来解决
javaors 2009-11-17
  • 打赏
  • 举报
回复
我在action里面将子报表先编译,生成了子报表的testsub_subreport0.jasper,然后在testsub.jrxml
把路径的绝对路径写死了,倒是不报上面无法加载的错误,可是子报表里面的静态文本在父报表根本没有显示
不知道各位用这个做子报表的时候有没有遇到类似的问题,而且这路径要是都写死了,移植性很差的。
tian_xuezhi 2009-11-17
  • 打赏
  • 举报
回复
关注中
youjianbo_han_87 2009-11-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 javaors 的回复:]
引用 7 楼 sangshusen_1988 的回复:
子报表的文件放到路径下了吗?编译主报表的时候会自己找子的去编译的



放了啊,和父表是同一级目录
[/Quote]

额? 有这种事情? 我子报表也做过的,没有碰到过这种问题,我也不是很经常用这个产生pdf。看看是不是有楼上他们说的什么路径问题。
owen_008 2009-11-17
  • 打赏
  • 举报
回复
非常好~~~~~~~~~~~~~~~~顶一个~~~~~~~~~~~~~~~~~~~~~
javaors 2009-11-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zl3450341 的回复:]
Could not load object from location : .\testsub_subreport0.jasper

看报错信息是无法加载  路径错误?
[/Quote]

这个路径是iReport生成给我的,我试过改了好多方式,还是加载不上。应该不能写死了吧
javaors 2009-11-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sangshusen_1988 的回复:]
子报表的文件放到路径下了吗?编译主报表的时候会自己找子的去编译的
[/Quote]


放了啊,和父表是同一级目录
javaors 2009-11-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 youjianbo_han_87 的回复:]
jasperReprot我一般都是用 ireport工具来编译,只要把相应的jar包加入就可以了。楼主是不是struts jar包没加对。
[/Quote]

用iReport编译还是报同样的错误
zl3450341 2009-11-17
  • 打赏
  • 举报
回复
Could not load object from location : .\testsub_subreport0.jasper

看报错信息是无法加载 路径错误?
sangshusen_1988 2009-11-17
  • 打赏
  • 举报
回复
子报表的文件放到路径下了吗?编译主报表的时候会自己找子的去编译的
javaors 2009-11-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 youjianbo_han_87 的回复:]
jasperReprot我一般都是用 ireport工具来编译,只要把相应的jar包加入就可以了。楼主是不是struts jar包没加对。
[/Quote]

主要加了一个struts2-jasperreports-plugin-2.1.6.jar和jasperreports-3.1.0.jar
用IREPORT会产生额外的附加文件吗?

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧