发新话题
打印

详解"打不开指定模板"错误

详解"打不开指定模板"错误

这个问题,经常被问起,今天我好好帮大家捋捋。

要彻底回答这个问题,必须先了解一下如何让jor报表服务器,查询一个报表。默认的 jor报表服务器针对报表查询,提供两个入口:reportviewer,jatoolsreport,示例如下:
复制内容到剪贴板
代码:
1. http://localhost:8080/jor/reportviewer?file=d:/abc.xml
2. http://localhost:8080/jor/jatoolsreport?file=d:/abc.xml&as=xls
这两个入口,在jor/WEB-INF/web.xml 都有定义,先来看第一个 reportviewer入口:
复制内容到剪贴板
代码:
<servlet>
<!-- 带工具栏的报表浏览器,jsp实现 -->
<servlet-name>reportviewer</servlet-name>
<jsp-file>/tools/reportviewer.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>reportviewer</servlet-name>
<url-pattern>/reportviewer</url-pattern>
</servlet-mapping>
由上可见,入口  http://localhost:8080/jor/reportviewer 被重定向到一个 jor/jatools/reportviewer.jsp文件,
那reportviewr.jsp又是啥东西? 来看看代码:
复制内容到剪贴板
代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/tlds/jatools.tld" prefix="jatools" %>
<% request.setCharacterEncoding("UTF-8");
String viewer = request.getParameter("viewer");
String forward = "defaultviewer.jsp";
request.getRequestDispatcher("tools/"+forward).forward(request, response);
%>
很简单吧,被重定向到 jor/tools/defaultviewer.jsp ? 呵,轮到 defaultviewer.jsp出场了,贴上代码:
复制内容到剪贴板
代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.io.*"%>
<%@ taglib uri="/WEB-INF/tlds/jatools.tld" prefix="jatools" %>
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>简表 5.0</title>
<script src="js/jquery.js"></script>
<script src="js/toolsbar.js"></script>
</head>
<body style='overflow:hidden;margin:0;padding:30px 0 5px 0;'>
<%
String file = request.getParameter("file");
if(file != null && file.startsWith("contextRoot:"))
{
   // 如果以 reportviewer?file=contextRoot:abc.xml,则会在jor应用的路径下,开始查找 abc.xml报表模板文件

String tplRoot=getServletConfig().getServletContext().getRealPath("/");
  
if(!tplRoot.endsWith(File.separator))
{
  tplRoot+= File.separator;
}

tplRoot+=file.substring(file.indexOf(":")+1);
file = tplRoot.replace('\\','/');
}


%>
<jatools:report id="_report1" template="<%=file%>" >
<%@ include file='toolsbar.jsp'%>
</jatools:report>
</body>
</html>
上面代码,最重要部分是  <jatools:report id="_report1" template="<%=file%>" > 这一句,<jatools:report> 是jor系统提供的jsp tag,它接受一个template属性,告诉报表引擎报表模板文件在哪里,然后在标签出现的地方输出报表,注意,这里的 template必须是绝对路径。

经常有朋友问,"打不开指定模板"错误原因是什么,原因,就是 template指出的报表模板文件不存在,也就是file变量值不对!

由上面的代码可知,为了从应用路径下取报表模板,你可以以"contextRoot:"开始指定报表模板.
为了查找模板方便,我们的示例报表模板,都采用中文文件名和中文的路径,为了处理中文问题,示例中的tomcat经过设置,如果设置不正确,也会出现"打不开指定模板"的错误,因此,为了避免此类问题,你的报表模板路径及文件名,请保持英文.

为了调试file参数是否正确,你可以在标签前的java代码段内,在后台打印出file值,以观察是否正确,如下所示:
复制内容到剪贴板
代码:
...
System.out.println(file);

%>
<jatools:report id="_report1" template="<%=file%>" >
...
看到这里,有朋友,会问,为什么要在 web.xml, 配置,还要jsp之间重定向,多麻烦,直接一点行嘛,比如:
http://localhost:8080/jor/tools/defaultviewer.jsp?file=d:/abc.xml

这样当然可以了,但现在报表页面的位置在tools下面,所以,这样做的前提是,确保报表页面指定的 .js,.css能引用到。

如果你不喜欢defaultviewer.jsp,你自己已经有jsp了,只不过,想加进报表,那很简单,象 defaultviewer.jsp一样,在你的jsp里,加一个<jatools:report>标签,并设置template属性,就可以了。

那报表有参数,怎么办呢?比如在报表模板里,你定义了一个查询:
select * from 工资表 where 月份=${mymonth}

你只需要加入一个mymonth参数就行了,如下所示:
http://localhost:8080/jor/tools/defaultviewer.jsp?file=d:/abc.xml&mymonth=12

浏览<jatools:report>的源码,ReportTag.java, 不难发现,该标签会自动获取任何通过get或post传入的参数值到报表引擎。

TOP

入口二 jatoolsreport,使用的很少,以下是其web.xml中的设置,被转到 jatools.server.JatoolsReportServlet 类中处理
复制内容到剪贴板
代码:
<servlet>
<!-- 不带工具栏的报表浏览器,servlet实现 -->
<servlet-name>jatoolsreport</servlet-name>
<servlet-class>jatools.server.JatoolsReportServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jatoolsreport</servlet-name>
<url-pattern>/jatoolsreport</url-pattern>
<load-on-startup>1</load-on-startup>
</servlet-mapping>
该servlet接受一个报表模板路径参数,也可以用as参数指定输出格式,如下所示
as可取的值有:
xls,xlsn,pdf,dhtml,rtf

TOP

本帖实际也回答了,如何在 jsp 中集成简表的问题。

TOP

发新话题