水晶报表 jar包版本过低_工具类学习-UReport报表设计器整合

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/

be3f341e1e6c81dc9499d348cbb489f6.png

整合过程分析

1.在pom.xml文件中引入相关依赖

1cfb1356f22c51929b1d463a494b1cc4.png
<dependency>

完整pom.xml参考配置:

ae9238b22749f4df075455ba65ab2c0d.png
<project 

2.在web.xml文件中配置UReport的Servlet

<servlet>

3.引入UReport相关的配置文件

有三种方式实现配置文件引入:根据实际工程搭建的情况灵活选择引入的方式

方式1:直接在web.xml中加载ureport-console-context.xml文件(针对普通的Maven工程配置,没有采用spring文件)

41a1b20220ff7e9b46808bf8db6762ae.png
<listener>

方式2:在已有的spring配置文件中导入数据

<import 

方式3:如果没有spring配置文件,直接创建一个context.xml中

20f2936848a61ffbd061d2fe42cd99d6.png
<?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下加载了属性文件,添加属性忽略掉没有定义的属性查找),报错内容如下所示

4284f363ca420a84e25533b411810526.png

针对spring配置文件处理:

721313fc2f2aeb8a033c0724ae475819.png

针对普通maven工程处理:

d8069cecc5eed5d1a733b661c269879b.png

配置属性说明:Ureport有自定义的配置属性,这些配置属性是与报表存储、设计相关的,具体内容需要根据实际的业务需求去自行配置,如果不需要则在代码逻辑层对业务流转进行控制即可

问题2:404或指定designer设计器不存在

在整合的ssm中配置ureport出错,通过链接访问数据的时候无法找到指定的页面,初步考虑路径配置,之后查看web.xml配置,发现在之前的前端控制器配置中,默认拦截了所有的请求,因此在请求的时候直接被dada-report这个前端控制器拦截,但dada-report这个控制器下并没有指定的ureport相关的内容存在,因此会报404访问路径错误或者是designer报表设计器不存在的问题,此处需要对dada-report拦截的内容做限制,参考前端控制器拦截(拦截说明、拦截顺序、执行顺序)

ee26253aaeac648dae2da382fc52af29.png

原始配置:

c80e41cef17d8718381e2f776578004a.png

4ecab09f8b8da0a40e81ad2e3793b6c0.png

直接配置如下所示,但如果出现designer视图不存在,考虑是相应的文件没有加载进去,因为在springmvc.xml中加载了有关的ureport2配置文件,因此要在初始化加载spring容器的时候将对应的springmvl.xml配置文件进行加载,否则无法找到相应内容,出现如下所示错误

905a83378507aba8df8b32e34fad6218.png

93d4c6af1ee15141fae47dedc37917a6.png

要么就设置Servlet默认启动的时候加载配置文件

8417bfb8bb8c59b46f4fa4524a13fc87.png

实际SSM整合说明如下:

依赖配置:添加ureport相关的依赖jar包

为了避免配置文件混乱,也避免改动原有ssm配置,此处单独在resources目录下创建一个文件夹ureport存放ureport-custom-context.xml配置文件以编辑相关的ureport配置,并在web.xml中配置相应的全局参数(必须在context-param中配置加载文件

56b43591252978dd63faf60710578872.png

2dfe0b697aea7018434325558e0b4e4a.png

8b4c84bab6a4fa46089029fc12811b2f.png

配置完成,启动项目,访问链接:http://localhost:8084/ureport/designer

Ureport报表设计器显示如下:

160392d619a37f06366996dbf814bf67.png

可以适当了解web.xml各个参数配置的含义:

e065b0caadbb8297378fc0aac547ad81.png

完成配置,根据W3CSchoool等相关教程完成业务和报表工具的整合,以下简单根据教程完成业务流程简单实现

https://www.w3cschool.cn/ureport/ureport-y4op2han.html

测试的时候如果出现按钮点击无反应,则可能是弹出式窗口被浏览器拦截,只需要允许弹出即可,或可直接通过url直接访问

通用报表设计整合

无论是机构、还是平台报表存储器,此处操作的表字段都是统一的,因此此处做一个调整,设置通用的方法将重复的内容统一起来,用不同的字段标识进行划分,由前台页面传入数据限定相应的标准,不需要重复操作代码

7a4d59333ceceaabf98b699efb3115e5.png

a.创建指定数据表结构(字段需保持一致)

存储报表文件、数据源配置文件(概念上区分,实际内容基本一致)

机构相关存储器:ureport_file、ureport_data_source_file、

平台公共存储器:ureport_backup、ureport_data_source_backup

保持数据字段相应一致,主要包括file_id(主键)、file_name(文件名称)、file_content(文件内容)三个基本字段,具体其余字段的设计则根据实际工程需求进行扩展。

表字段:

a2f164266e70c37bbea313c856f8daf2.png

b.创建通用的实体类UreportFileManager

UreportFileManager类作为通用的实体类,使得在dao层只需要指定需要操作的表名tableName便可实现对不同的数据表进行操作,UreportFileManager基本结构定义需要与相应数据表的属性一一对应。

Model实体:

a207351f0fc7ac5d77b0f864f2d0e5cf.png

Mapper层查找参数设置:

a440251e387173c7656a04025b9f5197.png

c.通用mapper方法实现

为了实现mapper方法操作的通用性,引入UreportFileSearchParam类用于封装操作参数,其主要包括操作表名tableName、操作实体ureportFileManager以及与报表文件数据库实体相对应筛选参数。

b1a25ce683770157535b3b4d5a632f10.png

UreportFileManagerMapper接口通过接收searchParam指定的参数组合,操作指定的报表文件存储器,实现以参数配置去访问不同的数据库并与UReport报表引擎进行数据交互,从而间接减少代码设计的冗余量,并便于报表存储器的不限量扩展。针对报表的管理与权限的控制则考虑在同一个数据库中划分不同的区域用以区分不同的机构、不同的部门所访问的存储空间不同,在mapper层借助searchParam指定筛选条件,提供相应的接口供相应的Serivce层、存储器Provider进行调用

对应mapper层配置:

dea8ea3637028fda71a6048ae3aa80cb.png

对应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”目录

8587a135973fcee0b5122b4a1066527e.png

运行搭建好的项目,打开报表设计器,点击工具栏的保存按钮,弹出如下所示窗口:

3ea924fbaed16d056acb5c2ebbee3fd2.png

完成数据保存,刷新工程目录则可看到对应生成的数据信息

b.自定义报表存储目录配置

在项目对应配置文件(参考整合过程,此处ureport独立的spring配置文件在resource/ureport/ureport-custom-context.xml),相应在其ureport目录下创建一个ureport-custom.properties配置文件存放有关ureport配置的基本属性

a833708324903668130bc529989e1645.png

c58abf01e5a4fbf224a0a087eb607723.png

上面的Bean配置,实际上就是一个标准的

org.springframework.beans.factory.config.PropertyPlaceholderConfigurer类配置,通过配置PropertyPlaceholderConfigurer,可以实现加载Spring外部properties的作用,所以项目中已配置了PropertyPlaceholderConfigurer类,那么直接在这个类对应的properties文件中添加对应的UReport2属性即可,而不需要额外配置config.properties文件

完成文件加载配置,在相应的配置文件中配置属性即可:

f4d5c7d2c4bad66a3e3b3156076abc93.png

表示在E盘根下名为ureportfiles的目录中存储报表文件,需要注意的是,这里指定特定目录时,一定要保证这个目录已存在,否则将不会被采用,比如上面的E盘下名为ureportfiles的目录,就需要预先创建好。(指定文件目录不存在,则提示如下)

fa4cc296246c0c49a4845b46b14826f3.png

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报表存储器用于测试,可结合实际业务球球完成数据表设计,在基础属性的基础上添加其他字段用于业务的逻辑扩展

基本设计:(仅供参考)

b8a9a8d0619ed24993e5dbc2f8df846b.png
/** 建表 sql  - 基本参考 */

为契合业务需求,初步考虑数据表设计如下,具体的内容根据实际需求做调整

bb11bb4feb9d63213c26f9cbefeedefd.png

<2>dao层/Mapper实现方法(基本的增删改查)

此处提供一个通用的接口模板,具体实现的逻辑则需要根据实际的业务需求去设计

例如整合报表平台的时候需要考虑实际报表权限的问题,因此需要考虑根据当前用户登录的权限,所属的机构等进行条件筛选

PS:由于报表存储器的数据库设计基本保持一致,由此可考虑创建一个通用的dao、service进行控制,只需要通过前端页面调用接口传入数据表名tableName即可控制要操作的存储器,由此可间接实现多租户报表管理的概念(不同的租户可访问不同的报表存储器)

-- 此处为简单配置简单演示单表操作

@Mapper

具体的mapper.xml文件则需要参考实际表设计完成相应配置,需要注意的是name、content这两个属性,这两个属性是报表设计的必要属性,以下提供基本模板,实际内容参考实际需求进行调整

<?xml version="1.0" encoding="UTF-8" ?>

报表内容存储的类型:

Mysql数据库中表字段设置为‘mediumblob’类型

在mapper配置的数据类型为‘BLOB’、‘LONGARBINARY’

113a5bafe3d0d2d40309517d090da98d.png

两种类型在数据库中存储的形式:

9f427ffe9c7d470c83c4806cd1476a9f.png

报表存储器设计

基于springboot的参考

import 

基于SSM的设计参考

public 

测试问题分析

创建xxxProvider继承ureport的ReportProvider方法,完成报表存储相关的操作

测试:数据能够正常保存,但是却无法正常访问

分析,在保存报表文件信息,或者是打开报表文件的时候请求接口,报错。

理想结果:自动封装相应存储的数据信息

实际结果:只封装了第一个定义的存储器,随后报如下错误

(查看数据库mapper配置!!)

f1fb8a7c15bd5817b9fa2006d13a09ad.png

一开始考虑是多个报表存储器冲突导致的问题,之后测试无论是启用或禁用服务默认报表存储器还是出现同样的问题,数据库访问也没有看见明显的错误,随后查阅代码发现问题所在,由于一开始考虑机构报表存储器和平台备份报表存储器是类似的,直接复制粘贴代码,后期改动没有注意到一些细节性的问题,设置断点也无法找到明显的错误点(点击的时候加载就报错,无法通过设置断点查找出错问题),仔细查看报错信息,发现问题所在

351be25d79bd6324a94afc91034aafa2.png

可以看到保存信息显示两条sql语句查询的结果不同,前者正常查找数据,而后者查找数据到“Parameters:”(参数没有正常传递)则异常结束关闭数据库连接,并没有正常的返回,网上查阅输出流格式冲突,具体原因并不明确,考虑是报表内容存储格式问题,由mybatis逆向工程生成的mediumblob对应的是LONGVARBINARY,而网上参考是BLOB,修正后再次测试数据方能正常显示!!由此考虑报表内容存储格式导致出错!!(具体可以参考相关链接了解LONGVARBINARY与BLOB的区别)

fa81546a68d471da98523782125e8623.png

以上描述的问题均为mapper配置文件出现问题导致,在配置mapper文件时需要注意mapper层接口和相应配置文件的名称、方法名意义对应,需要注意方法的定义(入参、出参),需要注意参数定义的类型(文本型字符串需要考虑数据定义的类型要相对应)

自定义报表存储器(ftp-待定)

参考链接:https://blog.csdn.net/qq_35170213/article/details/80290797

2.数据源配置

打开UReport2的报表设计器,可以看到UReport2提供了三种类型的报表数据源,如下图所示:三种类型的数据源分别是直接连接数据库,Spring Bean以及通过实现com.bstek.ureport.definition.datasource.BuildinDatasource接口提供的内置数据源。

bddd413d9fcddeaaa2c1b9682b5de49b.png

配置1:直连数据库

直接连接数据库比较简单,就是在项目的classpath中添加好相应数据库的驱动Jar包后,在弹出的窗口中配置数据源连接信息即可,如下图所示:在页面用数据源配置链接数据库注意,不要刷新浏览器,刷新之后链接会清空

79d2d770b39ac17653ec9f3758dfadf1.png

点击测试连接,可以看到对应目录下生成了相应的数据源,右键选择需要操作的数据源可进行“添加数据集、编辑、删除操作”

50ccf86342da80eccb4d7887bc32efc9.png

根据相应的数据集配置相关的数据:

5fcd0fec6b9e13042d25d0461ee79b30.png

如果连接测试失败:查看失败原因,依次进行查找

3403681008db3e8a82785163f0d20881.png

Maven引入Oracle驱动依赖

(在pom.xml文件中添加oracle驱动maven依赖存在一定的问题,可参考链接了解相关内容https://blog.csdn.net/erlian1992/article/details/74279106)

8642c0b09e71b4a50126b6f56c5e6191.png

由于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

d408d296f1e7de2ccbd2e95880c3f15d.png

执行完成之后可以看到对应的mvn安装仓库有相应的资源生成:

7822e8998a288797914be0128b0f5abf.png

完成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来作为数据源,点击

37ce190eb4be0ceec77df124b2feb1eb.png

图标,在弹出的窗口中输入数据源名称及要采用的Bean的ID,如下图所示:

b152b2096c95ef57e9673378cd4695f6.png

保存后,就可以在这个数据源下添加具体的数据集,添加方法就是在这个数据源下右键,在弹出的菜单中选择添加数据集,在弹出的窗口中定义数据集名称、对应的方法名以及返回对象类型,如下图所示:

b952a3764d236184e4625b75ca58bed4.png

(如果springBean中没有指定id的bean兑现个,此处在添加数据集,选择方法的时候相应报错-空指针异常,指定的bean对象不存在)

在Spring bean数据集配置中,方法名我们可以点击右侧的“选择方法”按钮来选择当前Bean对应的类中定义的方法,但这里对方法的要求是:方法必须要有三个参数,依次是String,String,Map,比如我们上面定义的testBean里就包含两个合法的方法,如下所示:

a6098911ffccbbbf474a2bf70cc8cb13.png

对于一个合法的Bean数据集方法要有三个参数,分别是String,String,Map,依次对应数据源名称、数据集名称以及外部传入的参数Map,Bean的方法只有是这种结构才可以进行选择。对于数据集方法的返回值,目前来说可以支持两种类型,一种是我们TestBean中返回的Map<String,Object>类型的List集合;另一种就是返回一个POJO类型的List集合,比如像下面的方法: 在上面的示例方法中,返回的就是User对象集合,这里的User对象,就是一个普通的POJO对象。(提供示例可以通过SpringBean自定义相关数据实现)

f8b759a48a5220f674206af99d913e6f.png

参考上述介绍,设置了如下数据配置:

在dada-report下创建com.dada.report.datasource包,创建相应的xxxBean类,并在指定的ureport配置文件中配置bean对象(或者是直接通过@Component注解进行定义)

eb9e153d4f05926202b7d11a8000d61d.png

b768282bbdc0d620975a61d1509de7d9.png
package 

配置完成,启动项目,再次填写数据并点击保存按钮,能够看到相应的SpringBean数据配置完成,相应的会返回相关的方法

73fb811a423f1b25c93f4fb3ae7b3994.png

选择相应数据源配置,返回相应为数据类型(如果不配置则需要手动添加字段

ec7380fc3ed3a2185139386a78d1aeb4.png

配置3:内置数据源

内置数据源要求实现BuildinDatasource接口,同时将BuildinDatasource接口实现类配置到Spring即可,BuildinDatasource接口源码如下:

aca947573ad00b40d02fadb3770b7254.png

此处测试参考代码如下:

方式1:借助JDBCUtils工具类(自定义)获取数据源

package 

}

4c425a1be456bb9f0ba9b2ed7a52fd65.png

在ureport配置文件中配置dataSource对象:

41245634ff580b984919c5d15016b809.png

方式2:通过spring管理DataSource数据源(以注解方式获取数据源连接)

package 

在ureport配置文件中配置dataSource对象:

19200a3f67b8dd24cdb53b09d6caea07.png

多数据源配置问题:

在通过xml配置文件配置的时候,使用@Autowired注解,其按住奥byType自动植入,但如果文中配置两个相同类型的dataSource,则在项目启动加载spring自动注入的时候会报错

org

因此在配置注解的时候需要明确注入的是哪个对象(可以参考spring注解说明,了解每个注解之间的异同,参考链接:https://www.cnblogs.com/think-in-java/p/5474740.html)

@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入

a035fb1154d69a4be6f6bca8ffe677d5.png

77e7c0b99fd614eb739244b40b4a3d85.png

BuildinDatasource接口实现类配置到Spring中后,UReport2会自动检测到,完成配置启动测试,在报表设计器中,点击数据源页签中的

67a94b208d65fe8bde988a3a8e8ef936.png

按钮,在弹出的窗口中就可以选择定义好的内置数据源,如下图所示:

4360af98789eb38910e912c329fa95de.png

查看配置是否正确,可通过右键选择添加数据集,如果数据正常显示则连接正常,但如果出现“数据源不存在”或“后台空指针异常”则说明数据源配置存在问题,需要进行修改调整

efcac9bc8a43e2ef4493b6fa1cfa46c3.png

数据源配置方法说明

在数据源中有三个选择:

服务器启动期间数据源配置是有效,当服务器重启后数据源配置并不保存,除却在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会在点击设计器工具栏

458bc77710e0ee25f01656112cee9274.png

图标时,将设计中的报表模版信息提交到服务器,存放于当前用户的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等。

c017039ddbd8cdf8e8b1fe45ea72c372.png

0b92390586bcc6bdbac1fdad394b7472.png

e6897cc31f680ce3c802432a3f1a91a2.png

在线打印:在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源码如下:

ac86e721fe93da86dea1b79aa210c9a7.png

预览:http://localhost:8084/ureport/preview?_u=file:hhhhh.ureport.xml

在SSM配置基础上添加相应的jsp文件,完成配置启动服务器访问测试:

http://localhost:8084/custom/report/page/other?url=report/testReport

87c44e5b2fd367d82ca124372363de23.png

考虑实际业务整合问题:

数据源配置问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1844. 将所有数字用字符替换

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的字符串 s &#xff0c;它的 偶数 下标处为小写英文字母&#xff0c;奇数 下标处为数字。 定义一个函数 shift(c, x) &#xff0c;其中 c 是一个字符且 x 是一个数字&#xff0c;函数返回字母表中 c 后面第 x 个字符。 …

LeetCode 1845. 座位预约管理系统(set)

文章目录1. 题目2. 解题1. 题目 请你设计一个管理 n 个座位预约的系统&#xff0c;座位编号从 1 到 n 。 请你实现 SeatManager 类&#xff1a; SeatManager(int n) 初始化一个 SeatManager 对象&#xff0c;它管理从 1 到 n 编号的 n 个座位。所有座位初始都是可预约的。in…

unity game和scene效果不一样_不同的真石漆装饰效果也是不一样的

外墙真石漆真的是一件很好的产品&#xff0c;具有防火性、防水性、安全且环保、粘力强、永不褪色等特点&#xff0c;无疑是人们较好的选择&#xff0c;在很早之前就已经逐渐的取代了瓷砖和其他石材在人们心中的位置。真石漆的品种不止一种&#xff0c;按照装饰效果我们可以分为…

噪声产生原因_空调噪声大?啄木鸟家庭维修,看看属于哪一个问题

夏天终于要结束了&#xff0c;我只想安静的睡一个好觉。这个夏天中&#xff0c;楼上的空调每夜不休不眠的工作着&#xff0c;可这个空调为什么运作时的声音这么“巨大”。“轰轰轰……”&#xff0c;楼层都似乎和它产生了共振。而每晚的我&#xff0c;反反复复努力入睡&#xf…

05-按钮的基本使用-开发步骤

从Xcode5开始&#xff0c;图片资源都放到Images.xcassets中进行管理先添加必须的图片到Images.xcassets中调整界面尺寸 由于模拟器的默认尺寸是3.5inch&#xff0c;为了避免出现不必要的麻烦&#xff0c;最好将storyboard中的UI界面尺寸也调整为3.5inch添加4个方向按钮和2个缩放…

【机器学习】sklearn数据特征预处理:归一化和标准化

归一化处理 特点&#xff1a;通过对原始数据进行变换把数据映射到(默认为[0,1])之间 from sklearn.preprocessing import MinMaxScaler def mm():"""归一化处理:return: NOne"""mm MinMaxScaler(feature_range(2,3))data mm.fit_transform(…

LeetCode 1848. 到目标元素的最小距离

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums &#xff08;下标 从 0 开始 计数&#xff09;以及两个整数 target 和 start &#xff0c;请你找出一个下标 i &#xff0c;满足 nums[i] target 且 abs(i - start) 最小化 。注意&#xff1a;abs(x) 表示 x 的绝对值。…

【机器学习】sklearn数据集获取、分割、分类和回归

sklearn数据集1、数据集划分1.1 获取数据1.2 获取数据返回的类型举个栗子&#xff1a;1.3 对数据集进行分割举个栗子&#xff1a;2、 sklearn分类数据集3、 sklearn回归数据集1、数据集划分 机器学习一般的数据集会划分为两个部分&#xff1a; 训练数据&#xff1a;用于训练&a…

LeetCode 1846. 减小和重新排列数组后的最大元素

文章目录1. 题目2. 解题1. 题目 给你一个正整数数组 arr 。请你对 arr 执行一些操作&#xff08;也可以不进行任何操作&#xff09;&#xff0c;使得数组满足以下条件&#xff1a; arr 中 第一个 元素必须为 1 。任意相邻两个元素的差的绝对值 小于等于 1 &#xff0c;也就是…

ftp可以传输什么类型文件_FTP文件传输工具-ForkLift for Mac

orklift mac版是一款运行在Mac平台上的FTP文件传输工具。ForkLift拥有经典的两栏界面布局&#xff0c;简洁小巧。且支持FTP&#xff0c;SFTP&#xff0c;WebDAV&#xff0c;S3&#xff0c;iDisk&#xff0c;SMB&#xff0c;AFP和NIS协议&#xff0c;可以方便用户对本地以及远程…

1过程流程图 3 apqp_为什么过程开发的平面布置图要遵循精益原则?

今日话题为什么过程开发的平面布置图要遵循精益原则&#xff1f;问为什么过程开发的平面布置图要遵循精益原则&#xff1f;答工艺工程师根据过程流程图制定平面布置图&#xff0c;采用精益制造的原则&#xff0c;对加工与装配工位、物流路线、存储位置进行规划&#xff0c;以确…

LeetCode 1847. 最近的房间(排序离线计算 + 二分查找)

文章目录1. 题目2. 解题1. 题目 一个酒店里有 n 个房间&#xff0c;这些房间用二维整数数组 rooms 表示&#xff0c;其中 rooms[i] [roomIdi, sizei] 表示有一个房间号为 roomIdi 的房间且它的面积为 sizei 。每一个房间号 roomIdi 保证是 独一无二 的。 同时给你 k 个查询&…

【机器学习】sklearn k-近邻算法

sklearn k-近邻算法1. sklearn k-近邻算法API2. k近邻算法实例-预测入住位置核心思想&#xff1a;你的“邻居”来推断出你的类别定义&#xff1a;如果一个样本在特征空间中的 k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别&#xff0c;则该样本也属于这个类别。…

LeetCode 1849. 将字符串拆分为递减的连续值(回溯)

文章目录1. 题目2. 解题1. 题目 给你一个仅由数字组成的字符串 s 。 请你判断能否将 s 拆分成两个或者多个 非空子 字符串 &#xff0c;使子字符串的 数值 按 降序 排列&#xff0c;且每两个 相邻子字符串 的数值之 差 等于 1 。 例如&#xff0c;字符串 s "0090089&q…

flutter text 最大长度_Flutter小技巧之TextField换行自适应

无论哪种界面框架输入文本框都是非常重要的控件, 但是发现flutter中的输入框TextField介绍的虽然多,但是各个属性怎么组合满足需要很多文章却说不清楚, 再加上控件版本变更频繁很多功能的介绍都是比较陈旧的属性.现在就需要一个类似微信的输入文本框, 这样一个非常实用的效果fl…

【机器学习】分类算法sklearn-朴素贝叶斯算法

分类算法-朴素贝叶斯算法1. 概率基础2. 朴素贝叶斯介绍3. sklearn朴素贝叶斯实现API4. 朴素贝叶斯算法案例1. 概率基础 概率定义为一件事情发生的可能性&#xff1a;扔出一个硬币&#xff0c;结果头像朝上&#xff1b;某天是晴天 联合概率和条件概率“”&#xff1a; 联合概率…

LeetCode 1851. 包含每个查询的最小区间(排序 + 离线查询 + 优先队列)

文章目录1. 题目2. 解题1. 题目 给你一个二维整数数组 intervals &#xff0c;其中 intervals[i] [lefti, righti] 表示第 i 个区间开始于 lefti 、结束于 righti&#xff08;包含两侧取值&#xff0c;闭区间&#xff09;。 区间的 长度 定义为区间中包含的整数数目&#xff…

git 查看某些文档的历史版本_Git 教程(二)log 命令的使用

使用 Git 进行版本控制时&#xff0c;要习惯他的工作流程&#xff0c;Git 的工作流程是&#xff0c;先在工作区创建项目并编写代码&#xff0c;然后将写好的文件添加到暂存区&#xff0c;最后将暂存区里的文件提交到历史版本库。如下图所示&#xff1a;每向版本历史库做一次提交…

【机器学习】sclearn分类算法-决策树、随机森林

分类算法-决策树、随机森林1.决策树1.1 认识决策树1.2 信息论基础-银行贷款分析1.3 决策树的生成1.4 决策树的划分依据之一-信息增益1.5 sklearn决策树API1.6 泰坦尼克号乘客生存分类2. 集成学习方法-随机森林1.决策树 1.1 认识决策树 决策树思想的来源非常朴素&#xff0c;程…

【机器学习】回归算法-线性回归分析、回归实例和回归性能评估

回归算法-线性回归分析、回归实例和回归性能评估线性回归损失函数(误差大小)sklearn线性回归正规方程、梯度下降API线性回归实例回归&#xff1a;目标值连续&#xff1b;分类&#xff1a;目标值离散。 预测回归和分类是不一样的。回归问题可以用于预测销售额&#xff0c;比如公…