dada-report报表整合UReport报表设计器工具
结合日常工作和学习实践,针对传统报表子站面临的问题,尝试借助UReport报表设计器解决
1.可在现有工程基础上引入Ureport2报表设计器
Ureport报表设计器是一个基于WEB的在线报表设计器,其具有良好的界面设计和强大的报表设计功能,支持报表多种格式导出(分页)、报表通用性设计等,Ureport2支持简单、复杂报表的设计,能够很好地嵌合实际业务需求,其报表设计可通过纯sql或者是配置的方式实现,以此可针对不同的人员进行管理。
2.针对多租户、复杂报表设计
Ureport2可在工程中自定义报表存储器和数据源,在代码逻辑层模拟实现多租户概念(不同的租户访问不同的报表存储器、数据源信息)
3.现存问题
a.学习成本
将UReport报表设计器整合到已有项目并非一件难事,只需要通过简单的配置便可完成,主要的工作量在于后期报表的设计、维护,以及UReport2报表设计器的学习需要耗费一定的时间和精力,需要开发人员了解报表设计的流程、原理,掌握排查报表设计错误的方法,熟练应用。
b.与实际业务整合
现有报表子站中的存量报表数量较多,如果所有的报表都要重新进行设计、维护,将是一个巨大的工作量。
UReport2仅仅是一个报表设计器,如果要结合需求实现多租户概念,相应需要额外对应的维护页面与接口设计
针对大数据量数据处理还存在一定的问题,其中涉及缓存概念,有时候处理特大数据量的时候后台报错,考虑需要深入UReport源码分析或者是相关配置调整;且其提供的图形统计图显示相对EChart而言并不太友好。
从这段时间的学习来看Ureport是比较方便且功能强大的开源插件,其与实际业务的整合、数据的处理还需要时间的验证,毕竟还需要考虑额外诸多因素,在后续的学习中会考虑进一步完善
以下简单提供本人在毕设中使用Ureport的一些学习笔记参考,个人建议可借助网络资源去结合学习会比较好理解:https://www.w3cschool.cn/ureport/
SSM框架整合UReport报表设计器
参考链接:
https://www.w3cschool.cn/ureport/
整合过程分析
1.在pom.xml文件中引入相关依赖
<dependency>
完整pom.xml参考配置:
<project
2.在web.xml文件中配置UReport的Servlet
<servlet>
3.引入UReport相关的配置文件
有三种方式实现配置文件引入:根据实际工程搭建的情况灵活选择引入的方式
方式1:直接在web.xml中加载ureport-console-context.xml文件(针对普通的Maven工程配置,没有采用spring文件)
<listener>
方式2:在已有的spring配置文件中导入数据
<import
方式3:如果没有spring配置文件,直接创建一个context.xml中
<?xml version="1.0" encoding="UTF-8"?>
此处对已有的SSM项目整合做说明:
无论是以上哪种方式实现,必须保证在web.xml需要加载相应的spring配置文件,否则项目在启动的时候就会报视图解析失败,没有相应的designer
在整合启动的过程中可能由于maven相关jar包没有正常导入,导致ureport依赖的相关jar包非正常导入,项目启动报错(删除maven仓库的内容,重新导入jar包)
以下简单对整合过程中可能遇到的问题做简单的说明
问题1:指定属性无法找到(是由于在整合的过程中Ureport报表设计器需要指定的属性并没有在自己搭建的工程中指定,因而报错)
启动的时候如果报找不到指定的属性:则需要在属性配置的时候需要不存在(未配置)的属性(在applicationContext-dao.xml、springmvc.xml下加载了属性文件,添加属性忽略掉没有定义的属性查找),报错内容如下所示
针对spring配置文件处理:
针对普通maven工程处理:
配置属性说明:Ureport有自定义的配置属性,这些配置属性是与报表存储、设计相关的,具体内容需要根据实际的业务需求去自行配置,如果不需要则在代码逻辑层对业务流转进行控制即可
问题2:404或指定designer设计器不存在
在整合的ssm中配置ureport出错,通过链接访问数据的时候无法找到指定的页面,初步考虑路径配置,之后查看web.xml配置,发现在之前的前端控制器配置中,默认拦截了所有的请求,因此在请求的时候直接被dada-report这个前端控制器拦截,但dada-report这个控制器下并没有指定的ureport相关的内容存在,因此会报404访问路径错误或者是designer报表设计器不存在的问题,此处需要对dada-report拦截的内容做限制,参考前端控制器拦截(拦截说明、拦截顺序、执行顺序)
原始配置:
直接配置如下所示,但如果出现designer视图不存在,考虑是相应的文件没有加载进去,因为在springmvc.xml中加载了有关的ureport2配置文件,因此要在初始化加载spring容器的时候将对应的springmvl.xml配置文件进行加载,否则无法找到相应内容,出现如下所示错误
要么就设置Servlet默认启动的时候加载配置文件
实际SSM整合说明如下:
依赖配置:添加ureport相关的依赖jar包
为了避免配置文件混乱,也避免改动原有ssm配置,此处单独在resources目录下创建一个文件夹ureport存放ureport-custom-context.xml配置文件以编辑相关的ureport配置,并在web.xml中配置相应的全局参数(必须在context-param中配置加载文件)
配置完成,启动项目,访问链接:http://localhost:8084/ureport/designer
Ureport报表设计器显示如下:
可以适当了解web.xml各个参数配置的含义:
完成配置,根据W3CSchoool等相关教程完成业务和报表工具的整合,以下简单根据教程完成业务流程简单实现
https://www.w3cschool.cn/ureport/ureport-y4op2han.html
测试的时候如果出现按钮点击无反应,则可能是弹出式窗口被浏览器拦截,只需要允许弹出即可,或可直接通过url直接访问
通用报表设计整合
无论是机构、还是平台报表存储器,此处操作的表字段都是统一的,因此此处做一个调整,设置通用的方法将重复的内容统一起来,用不同的字段标识进行划分,由前台页面传入数据限定相应的标准,不需要重复操作代码
a.创建指定数据表结构(字段需保持一致)
存储报表文件、数据源配置文件(概念上区分,实际内容基本一致)
机构相关存储器:ureport_file、ureport_data_source_file、
平台公共存储器:ureport_backup、ureport_data_source_backup
保持数据字段相应一致,主要包括file_id(主键)、file_name(文件名称)、file_content(文件内容)三个基本字段,具体其余字段的设计则根据实际工程需求进行扩展。
表字段:
b.创建通用的实体类UreportFileManager
UreportFileManager类作为通用的实体类,使得在dao层只需要指定需要操作的表名tableName便可实现对不同的数据表进行操作,UreportFileManager基本结构定义需要与相应数据表的属性一一对应。
Model实体:
Mapper层查找参数设置:
c.通用mapper方法实现
为了实现mapper方法操作的通用性,引入UreportFileSearchParam类用于封装操作参数,其主要包括操作表名tableName、操作实体ureportFileManager以及与报表文件数据库实体相对应筛选参数。
UreportFileManagerMapper接口通过接收searchParam指定的参数组合,操作指定的报表文件存储器,实现以参数配置去访问不同的数据库并与UReport报表引擎进行数据交互,从而间接减少代码设计的冗余量,并便于报表存储器的不限量扩展。针对报表的管理与权限的控制则考虑在同一个数据库中划分不同的区域用以区分不同的机构、不同的部门所访问的存储空间不同,在mapper层借助searchParam指定筛选条件,提供相应的接口供相应的Serivce层、存储器Provider进行调用
对应mapper层配置:
对应mapper.xml:
<?xml version="1.0" encoding="UTF-8"?>
对应状态概念调整:
public_state:可理解为开发状态(开发中0、已完结1),亦可理解为公开状态(私有0、公开1)
visible_state:可见状态:针对部分已完结的报表,但想对用户隐藏(0.不可见 1.可见)
Ureport报表工具学习
报表设计器访问路径:http://localhost:8084/ureport/designer
http://host[:port][/context-path]/ureport/designer
1.报表存储存储目录配置
a.默认的报表存储目录配置
默认情况下:在项目的WEB-INF目录有会自动生成了一个名为“ureportfiles”目录,这个目录是UReport2提供的默认的报表文件存储目录,也就是说默认情况下,UReport将在项目的WEB-INF/ureportfiles目录下存储设计好的报表文件。
默认报表存储目录
如果项目在Eclipse的开发环境运行时,采用的是jetty(比如run-jetty-run插件),那么就可以在项目的WEB-INF目录下发现一个名为“ureportfiles”目录。
但如果采用tomcat运行项目,那么在WEB-INF目录下就没有一个名为“ureportfiles”目录,原因是在Eclipse中运行tomcat,tomcat需要创建一个临时的工作目录(该目录一般位于workspace.metadata.pluginsorg.eclipse.wst.server.coretmp0wtpwebapps下),所以采用tomcat运行项目,则需要到这个临时的工作目录下找到对应的项目,再到这个项目的WEB-INF目录下找到对应的“ureportfiles”目录
运行搭建好的项目,打开报表设计器,点击工具栏的保存按钮,弹出如下所示窗口:
完成数据保存,刷新工程目录则可看到对应生成的数据信息
b.自定义报表存储目录配置
在项目对应配置文件(参考整合过程,此处ureport独立的spring配置文件在resource/ureport/ureport-custom-context.xml),相应在其ureport目录下创建一个ureport-custom.properties配置文件存放有关ureport配置的基本属性
上面的Bean配置,实际上就是一个标准的
org.springframework.beans.factory.config.PropertyPlaceholderConfigurer类配置,通过配置PropertyPlaceholderConfigurer,可以实现加载Spring外部properties的作用,所以项目中已配置了PropertyPlaceholderConfigurer类,那么直接在这个类对应的properties文件中添加对应的UReport2属性即可,而不需要额外配置config.properties文件
完成文件加载配置,在相应的配置文件中配置属性即可:
表示在E盘根下名为ureportfiles的目录中存储报表文件,需要注意的是,这里指定特定目录时,一定要保证这个目录已存在,否则将不会被采用,比如上面的E盘下名为ureportfiles的目录,就需要预先创建好。(指定文件目录不存在,则提示如下)
c.自定义报表存储器
UReport2默认提供的名为“服务器文件系统”的报表存储机制,实际上是实现了UReport2提供的com.bstek.ureport.provider.report.ReportProvider接口,该接口源码如下:
package
实现了ReportProvider接口后,只需要将实现类配置到Spring中,让其成为一个标准的Spring Bean,这样UReport2就会检测到它而将其加载。下面是UReport2默认提供的名为“服务器文件系统”的报表存储器源码:
package
禁用系统提供的默认报表存储器
如果想使用自定义的报表存储器,同时又不想再使用系统默认提供的”服务器文件系统“的报表存储器,那么只需要在相应的报表配置文件(举例:config.properties)文件中添加一个名为ureport.disableFileProvider属性,将其值设置成true即可。
通过实现ReportProvider接口,可以开发出其它类型的报表存储器,比如开发一个新的报表存储器将报表文件存储到数据库、FTP等。
参考链接:
存储报表至fastdfs:
https://blog.csdn.net/qq_35170213/article/details/80290797
存储报表至数据库:
https://blog.csdn.net/qq_35170213/article/details/80290425
自定义报表存储器(数据库)
<1>创建存储报表信息的数据表
考虑实际需求,此处分别定义了CustomProvider报表存储器用于测试,可结合实际业务球球完成数据表设计,在基础属性的基础上添加其他字段用于业务的逻辑扩展
基本设计:(仅供参考)
/** 建表 sql - 基本参考 */
为契合业务需求,初步考虑数据表设计如下,具体的内容根据实际需求做调整
<2>dao层/Mapper实现方法(基本的增删改查)
此处提供一个通用的接口模板,具体实现的逻辑则需要根据实际的业务需求去设计
例如整合报表平台的时候需要考虑实际报表权限的问题,因此需要考虑根据当前用户登录的权限,所属的机构等进行条件筛选
PS:由于报表存储器的数据库设计基本保持一致,由此可考虑创建一个通用的dao、service进行控制,只需要通过前端页面调用接口传入数据表名tableName即可控制要操作的存储器,由此可间接实现多租户报表管理的概念(不同的租户可访问不同的报表存储器)
-- 此处为简单配置简单演示单表操作
@Mapper
具体的mapper.xml文件则需要参考实际表设计完成相应配置,需要注意的是name、content这两个属性,这两个属性是报表设计的必要属性,以下提供基本模板,实际内容参考实际需求进行调整
<?xml version="1.0" encoding="UTF-8" ?>
报表内容存储的类型:
Mysql数据库中表字段设置为‘mediumblob’类型
在mapper配置的数据类型为‘BLOB’、‘LONGARBINARY’
两种类型在数据库中存储的形式:
报表存储器设计
基于springboot的参考
import
基于SSM的设计参考
public
测试问题分析
创建xxxProvider继承ureport的ReportProvider方法,完成报表存储相关的操作
测试:数据能够正常保存,但是却无法正常访问
分析,在保存报表文件信息,或者是打开报表文件的时候请求接口,报错。
理想结果:自动封装相应存储的数据信息
实际结果:只封装了第一个定义的存储器,随后报如下错误
(查看数据库mapper配置!!)
一开始考虑是多个报表存储器冲突导致的问题,之后测试无论是启用或禁用服务默认报表存储器还是出现同样的问题,数据库访问也没有看见明显的错误,随后查阅代码发现问题所在,由于一开始考虑机构报表存储器和平台备份报表存储器是类似的,直接复制粘贴代码,后期改动没有注意到一些细节性的问题,设置断点也无法找到明显的错误点(点击的时候加载就报错,无法通过设置断点查找出错问题),仔细查看报错信息,发现问题所在
可以看到保存信息显示两条sql语句查询的结果不同,前者正常查找数据,而后者查找数据到“Parameters:”(参数没有正常传递)则异常结束关闭数据库连接,并没有正常的返回,网上查阅输出流格式冲突,具体原因并不明确,考虑是报表内容存储格式问题,由mybatis逆向工程生成的mediumblob对应的是LONGVARBINARY,而网上参考是BLOB,修正后再次测试数据方能正常显示!!由此考虑报表内容存储格式导致出错!!(具体可以参考相关链接了解LONGVARBINARY与BLOB的区别)
以上描述的问题均为mapper配置文件出现问题导致,在配置mapper文件时需要注意mapper层接口和相应配置文件的名称、方法名意义对应,需要注意方法的定义(入参、出参),需要注意参数定义的类型(文本型字符串需要考虑数据定义的类型要相对应)
自定义报表存储器(ftp-待定)
参考链接:https://blog.csdn.net/qq_35170213/article/details/80290797
2.数据源配置
打开UReport2的报表设计器,可以看到UReport2提供了三种类型的报表数据源,如下图所示:三种类型的数据源分别是直接连接数据库,Spring Bean以及通过实现com.bstek.ureport.definition.datasource.BuildinDatasource接口提供的内置数据源。
配置1:直连数据库
直接连接数据库比较简单,就是在项目的classpath中添加好相应数据库的驱动Jar包后,在弹出的窗口中配置数据源连接信息即可,如下图所示:在页面用数据源配置链接数据库注意,不要刷新浏览器,刷新之后链接会清空
点击测试连接,可以看到对应目录下生成了相应的数据源,右键选择需要操作的数据源可进行“添加数据集、编辑、删除操作”
根据相应的数据集配置相关的数据:
如果连接测试失败:查看失败原因,依次进行查找
Maven引入Oracle驱动依赖
(在pom.xml文件中添加oracle驱动maven依赖存在一定的问题,可参考链接了解相关内容https://blog.csdn.net/erlian1992/article/details/74279106)
由于Oracle数据库JDBC驱动包的使用的JDK版本有所区别,一定要下载对应的JDK版本的Oracle数据库JDBC驱动,JDK1.5的选择ojdbc.jar驱动包,如果是JDK1.6及以上版本的选择ojdbc6.jar驱动包,如果JDK环境是JDK1.8,那么选择ojdbc6.jar驱动包。
方式1:可以通过在官网下载相应的jar包:
https://www.oracle.com/technetwork/database/application-development/jdbc/downloads/index.html
方式2:如果本地安装了oracle数据库,则可在指定目录查找到相应的ojdbc6.jar(其路径为对应安装目录)E:OracleappAdministratorproduct11.2.0dbhome_1jdbclibojdbc6.jar)
接下来就是手动向Maven的本地仓库中添加Oracle数据库的JDBC驱动依赖。安装的前提是你的电脑必须安装了Maven,并且配置了Maven环境变量(参考maven配置)通过cmd窗口(或Eclipse的Maven插件、IDEA的Terminal)执行命令(虽然使用的工具不同,但是指定的文件位置和Maven坐标都是一样的)
需要注意的是如果是使用方式2,需要将相关的ojdb6.jar包放到其他文件夹中,不要在oracle安装目录下直接执行指令,可能会出现Oracle拒绝访问的情况
此处用eclipse的maven插件实现(Terminal)
$ mvn install:install -file -Dfile=F:jarojdbc6.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.1.0 -Dpackaging=jar(根据实际调整路径)
进入到指定的目录下直接执行:
$ mvn install:install-file -Dfile=ojdbc6.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.1.0 -Dpackaging=jar
执行完成之后可以看到对应的mvn安装仓库有相应的资源生成:
完成jar导入到本地仓库之后,则可在项目中添加使用oracle相关依赖(添加的依赖版本需要与指定的数据(导入到maven本地仓库时的依赖定义)一致),如果依赖引入失败,查看对应的定义的版本、依赖是否一致
<!-- 添加oracle驱动依赖 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1.0</version>
</dependency>
配置2:SpringBean数据源
Spring Bean类型的数据源可以选择Spring上下文中定义好的一个Bean来作为数据源,点击
图标,在弹出的窗口中输入数据源名称及要采用的Bean的ID,如下图所示:
保存后,就可以在这个数据源下添加具体的数据集,添加方法就是在这个数据源下右键,在弹出的菜单中选择添加数据集,在弹出的窗口中定义数据集名称、对应的方法名以及返回对象类型,如下图所示:
(如果springBean中没有指定id的bean兑现个,此处在添加数据集,选择方法的时候相应报错-空指针异常,指定的bean对象不存在)
在Spring bean数据集配置中,方法名我们可以点击右侧的“选择方法”按钮来选择当前Bean对应的类中定义的方法,但这里对方法的要求是:方法必须要有三个参数,依次是String,String,Map,比如我们上面定义的testBean里就包含两个合法的方法,如下所示:
对于一个合法的Bean数据集方法要有三个参数,分别是String,String,Map,依次对应数据源名称、数据集名称以及外部传入的参数Map,Bean的方法只有是这种结构才可以进行选择。对于数据集方法的返回值,目前来说可以支持两种类型,一种是我们TestBean中返回的Map<String,Object>类型的List集合;另一种就是返回一个POJO类型的List集合,比如像下面的方法: 在上面的示例方法中,返回的就是User对象集合,这里的User对象,就是一个普通的POJO对象。(提供示例可以通过SpringBean自定义相关数据实现)
参考上述介绍,设置了如下数据配置:
在dada-report下创建com.dada.report.datasource包,创建相应的xxxBean类,并在指定的ureport配置文件中配置bean对象(或者是直接通过@Component注解进行定义)
package
配置完成,启动项目,再次填写数据并点击保存按钮,能够看到相应的SpringBean数据配置完成,相应的会返回相关的方法
选择相应数据源配置,返回相应为数据类型(如果不配置则需要手动添加字段)
配置3:内置数据源
内置数据源要求实现BuildinDatasource接口,同时将BuildinDatasource接口实现类配置到Spring即可,BuildinDatasource接口源码如下:
此处测试参考代码如下:
方式1:借助JDBCUtils工具类(自定义)获取数据源
package
}
在ureport配置文件中配置dataSource对象:
方式2:通过spring管理DataSource数据源(以注解方式获取数据源连接)
package
在ureport配置文件中配置dataSource对象:
多数据源配置问题:
在通过xml配置文件配置的时候,使用@Autowired注解,其按住奥byType自动植入,但如果文中配置两个相同类型的dataSource,则在项目启动加载spring自动注入的时候会报错
org
因此在配置注解的时候需要明确注入的是哪个对象(可以参考spring注解说明,了解每个注解之间的异同,参考链接:https://www.cnblogs.com/think-in-java/p/5474740.html)
@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入
BuildinDatasource接口实现类配置到Spring中后,UReport2会自动检测到,完成配置启动测试,在报表设计器中,点击数据源页签中的
按钮,在弹出的窗口中就可以选择定义好的内置数据源,如下图所示:
查看配置是否正确,可通过右键选择添加数据集,如果数据正常显示则连接正常,但如果出现“数据源不存在”或“后台空指针异常”则说明数据源配置存在问题,需要进行修改调整
数据源配置方法说明
在数据源中有三个选择:
服务器启动期间数据源配置是有效,当服务器重启后数据源配置并不保存,除却在spring配置完成的springBean、内置数据源数据是在服务器启动的时候便加载,直接连接数据源信息不会保存,三种不同的数据源连接方式创建数据保存到指定的xml,重启服务器后再次加载该模板数据也不会丢失(基本的配置在xml文件中已做存储)
数据源直接连接:在报表数据多的情况下如果环境替换则难以维护
spring bean数据源:需要指定spring 中 datasource的bean Id,其会在IOC容器中获取!
内置数据源:在spring配置该数据源对象,即需要创建一个类,其实现
com.bstek.ureport.definition.datasource.BuildinDatasource接口,封装数据源信息
3.报表的基本使用
参考链接:
https://www.w3cschool.cn/ureport/
UReport2教学视频:http://pan.baidu.com/s/1boWTxF5,密码:98hj
4.报表设计器与业务结合
在项目中整合报表设计器之后,便可通过相关url完成报表数据的引用,将其与实际业务进行整合,以下简单说明ureport相关报表设计器的url说明
报表相关url介绍
报表设计器:http://host[:port][/context-path]/ureport/designer
报表预览:http://host[:port][/context-path]/ureport/preview?_u=报表名称
预览正在设计中的报表注意事项:在预览正在设计器中设计的报表时(也就是_u=p),UReport2会在点击设计器工具栏
图标时,将设计中的报表模版信息提交到服务器,存放于当前用户的session中(用户会话中),所以一旦用户session失效,如果我们再次直接预览_u=p类型报表时,会看到“com.bstek.ureport.console.exception.ReportDesignException: Report data has expired,can not do preview.”这样的错误提示,表示存放于session中的正在设计器中设计的报表模版已经失效,不能预览。但如果_u的值是一个具体的报表名称,则不存在这种问题,只有正在设计器中设计的报表模版在预览中采用了这种机制,这点需要注意。
如果预览的不是正在设计器中设计的模版,那么只需要给出具体的报表名称即可,需要注意的是,这里的报表名称要以其ReportProvider中要求的前缀开始,比如http://localhost:8080/ureport2-demo/ureport/preview?_u=file:test.ureport.xml等。
在线打印:在UReport2的报表预览页面中,可以看到UReport2提供了三种在线打印方式,分别是直接HTML打印、直接PDF打印以及PDF在线预览打印。这其中直接HTML打印是利用浏览器的HTML打印功能实现,能用于普通的A4纸类型报表页面的打印,同时它不能打印出报表中定义的页眉页脚,如果有定义的话。对于直接PDF打印以及PDF在线预览打印是服务端向浏览器中写入PDF流,利用Chrome、Firefox、Edge这些浏览器可以在线显示PDF功能实现的打印,这种是直接打印的PDF,所以可以应付各种复杂报表纸张类型的打印输出。
Firefox预览PDF:在预览PDF时,Firefox不允许当前frame外通过javascript调用其打印功能(目前来看可能是Firefox的Bug),所以我们需要手工点击其frame内部自带的打印按钮实现打印。
在代码中使用报表
在UReport2当中,我们可以使用ExportManager实现在业务代码中导出各种类型的报表,ExportManager接口源码如下:
package
因为ExportManager接口实现是配置在Spring当中,所以要使用ExportManager接口,我们需要首先通过Spring的ApplicationContext取到ExportManager实例对象,我们可以通过ExportManager.BEAN_ID来取到对应的Bean实例。
以下测试如何采用ExportManager导出HTML报表,并将报表内容嵌入到一个JSP中。 首先需要采用报表设计器设计好一个报表模版文件,将其保存,比如报表模版保存后的文件名为demo.ureport.xml,然后在项目中创建一个JSP(这里之所以选择JSP,是因为它最为简单,可以保证所有的J2EE开发者都能看懂,实际使用时可能是MVC框架、Ajax等,但如果了解了在JSP中用法,其它的就简单了),在JSP中输入相应代码,导出Html报表,并将其写入到JSP中,完整的JSP源码如下:
预览:http://localhost:8084/ureport/preview?_u=file:hhhhh.ureport.xml
在SSM配置基础上添加相应的jsp文件,完成配置启动服务器访问测试:
http://localhost:8084/custom/report/page/other?url=report/testReport