2019-05-21 SpringBoot集成UReport2

2019-05-21 SpringBoot集成UReport2

1. 引入依赖

<dependency>
    <groupId>com.bstek.ureport</groupId>
    <artifactId>ureport2-console</artifactId>
    <version>2.2.9</version>
</dependency>

2. 配置Servlet

1 @Bean
2 public ServletRegistrationBean<Servlet> ureport2Servlet(){
3   return new ServletRegistrationBean<Servlet>(new UReportServlet(), "/ureport/*");
4 }

注意:”/ureport/*” 是固定的

3. 配置自己的报表存储方式(我的是数据库存储)

  1    /**
  2      *    配置报表存储
  3      * @return
  4      */
  5     @Bean
  6     public ReportProvider reportProvider() {
  7         final String NAME = "数据库存储";
  8         final boolean DISABLED = false;
  9         final String PREFIX = "DB:"; // 不能为空,否则报表存取不了
 10         
 11         return new ReportProvider() {
 12 
 13             @Override
 14             public InputStream loadReport(String file) {
 15             
 16 
 17                 Template one = templateService.getOne(new QueryWrapper<Template>().eq(false, "name", file));//("fName", file));
 18             
 19                 if(one!=null) {
 20                     return new ByteArrayInputStream(one.getTemplate()); 
 21                 }
 22             
 23                 return null;
 24             }
 25 
 26             @Override
 27             public void deleteReport(String file) {                
 28                 
 29                 templateService.remove(new QueryWrapper<Template>().eq(false,"name", file));
 30                 
 31             }
 32 
 33             @Override
 34             public List<ReportFile> getReportFiles() {
 35                 List<Template> list = templateService.list();
 36                 List<ReportFile> reportList = new ArrayList<>();
 37                 
 38                 for (Template template : list) {
 39                     reportList.add(new ReportFile(getCorrectName(template.getName()), 
                          Date.from(template.getCreateTime().atZone(ZoneId.systemDefault()).toInstant())));
40 } 41 return reportList ; 42 } 43 44 @Override 45 public void saveReport(String file, String content){ 46 47 Template one = templateService.getOne(new QueryWrapper<Template>().eq(false,"name", file)); 48 49 if(one == null){ 50 51 one = new Template(); 52 one.setName(file); 53 54 one.setTemplate(content.getBytes()); 55 56 one.setCreateTime(LocalDateTime.now()); 57 58 User user = (User) SecurityUtils.getSubject().getPrincipal(); 59 one.setCreator(user.getUsername()); 60 one.setCreatorID(user.getUserId()+""); 61 62 templateService.save(one); 63 }else{ 64 one.setTemplate(content.getBytes()); 65 one.setCreateTime(LocalDateTime.now()); 66 templateService.updateById(one); 67 } 68 69 70 } 71 72 /** 73 * 报表存储命名 74 */ 75 @Override 76 public String getName() { 77 78 return NAME; 79 } 80 81 @Override 82 public boolean disabled() { 83 return DISABLED; 84 } 85 86 @Override 87 public String getPrefix() { 88 89 return PREFIX; 90 } 91 92 private String getCorrectName(String name){ 93 if(name.startsWith(PREFIX)){ 94 name = name.substring(PREFIX.length(), name.length()); 95 } 96 return name; 97 } 98 99 100 }; 101 }

注意:① 前缀不能为空;② 获得模板列表时需要把前缀去掉;因为删除和加载模板时会自动加上前缀,假如原本前缀是DB:,那么进行加载和删除时,报表前缀则会变成 DB:DB:

4. 隐藏系统自带的保存配置

从UReport2核心包中取出ureport.properties放到类根路径下,修改配置

1 ## UReport2 配置文件
2 
3 ureport.disableHttpSessionReportCache=true
4 
5 #UReport2默认报表存储
6 ureport.disableFileProvider=true
7 ureport.fileStoreDir=d:/ureportfiles
8 
9 ureport.debug=true

5. 配置内置数据源

 1     /**
 2      *     配置数据源
 3      * @param dataSource
 4      * @return
 5      */
 6     @Bean
 7     public BuildinDatasource buildinSystemDatasource(@Qualifier("systemDataSource")DataSource dataSource) {
 8         return new BuildinDatasource() {
 9 
10             @Override
11             public String name() {
12                 return "System";
13             }
14 
15             @Override
16             public Connection getConnection() {
17                 try {
18                     return dataSource.getConnection();
19                 } catch (SQLException e) {
20                     
21                     e.printStackTrace();
22                 }
23                 return null;
24 
25             }
26             
27         };
28     }
29     
30     /**
31      *     配置数据源
32      * @param dataSource
33      * @return
34      */
35     @Bean
36     public BuildinDatasource buildinDemo1Datasource(@Qualifier("demo1DataSource")DataSource dataSource) {
37         return new BuildinDatasource() {
38             
39             @Override
40             public String name() {
41                 return "Demo1";
42             }
43             
44             @Override
45             public Connection getConnection() {
46                 try {
47                     return dataSource.getConnection();
48                 } catch (SQLException e) {
49                     
50                     e.printStackTrace();
51                 }
52                 return null;
53                 
54             }
55             
56         };
57     }

6. UReport2的使用可以参考

网页文档:https://www.w3cschool.cn/ureport/?

视频教程:http://pan.baidu.com/s/1boWTxF5,密码:98hj

转载于:https://www.cnblogs.com/WongHugh/p/10903195.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100905.html原文链接:https://javaforall.net

(0)
上一篇 2021年7月7日 下午3:00
下一篇 2021年7月7日 下午4:00


相关推荐

  • ThoughtWorks 结对编程

    ThoughtWorks 结对编程起因技术博客写多了 不会起名字的说 可能写多了 最后写出来的东西偏向于冷冰冰吧 正经的起因可能就是某个懒散的下午 打开电脑 不知道做什么 打开牛客看了看 随即看到结对编程 不知道是做什么的 点开看了看 页面很好 不想中国人写的 鬼使神差的就报名了 点进去看了看 居然还有题 而且第一道题还是 intellijidea 的快捷键 很感兴趣 就做了 其实当时应该好好学习一下的 因为现在视频点不进

    2026年3月19日
    2
  • DynDNS免费动态域名解析

    DynDNS免费动态域名解析转载自以下网址 http hi baidu com ahong1288 blog item 80af3b12bd37 html nbsp 你大概有一个家庭网络 它有固定的宽带连接 可以让你七天 24 小时任意访问外部的网络世界 但是 如果要想从公共互联网上访问家里的网络 你又该怎么做呢 如果你想为你的宽带帐号多付 2 到 4 倍钱的话 那么你就可以拿到一个固定 IP 地址 一个永远不会再

    2026年3月19日
    1
  • Anus:公开整活!完全用 Manus 复刻 Manus 功能的开源 AI 智能体项目

    Anus:公开整活!完全用 Manus 复刻 Manus 功能的开源 AI 智能体项目

    2026年3月15日
    2
  • 数据库三大范式是什么?(3NF详解)

    数据库三大范式是什么?(3NF详解)什么是范式 范式是数据库设计时遵循的一种规范 不同的规范要求遵循不同的范式 最常用的三大范式第一范式 1NF 属性不可分割 即每个属性都是不可分割的原子项 实体的属性即表中的列 第二范式 2NF 满足第一范式 且不存在部分依赖 即非主属性必须完全依赖于主属性 主属性即主键 完全依赖是针对于联合主键的情况 非主键列不能只依赖于主键的一部分 第三范式 3NF 满足第二范式 且不存在传递依赖 即非主属性不能与非主属性之间有依赖关系 非主属性必须直接依赖于主属性 不能间接依赖主属性 A amp g

    2026年3月19日
    2
  • 关于求负数补码

    关于求负数补码负数在计算机中是用补码的形式存储的 正数在计算机中是用原码的形式存储的 正数求原码直接将十进制转二进制即可 负数的补码是在原码的基础上除符号位外其余位取反后 1 但是用这种方式求负数补码用编程实现不太方便 下面介绍一种用编程实现起来较简便的求负数补码的方法 1 求出负数绝对值的原码 2 从原码的最后一位数码位往前数 当遇到第一个 1 时停在此位置 3 将第一个 1 前面的数码全部求反

    2026年3月18日
    2
  • 特征金字塔池化

    特征金字塔池化1 特征金字塔池化如上图所示 将特征图的所有像素划分为 n nn timesnn n 个网格 并将其经过核为 n nn timesnn n 步长为 n n n n n n 的池化 可以选择最大池化或者平均池化 经过较为密集的池化 4 times4 形成 形成 形成 N timesC timesn timesn 的特征图 将其串联形成的特征图 将其串联形成的特征图 将其串联形成 C times 的格式 之后 在第 2 个步骤池化得到的特征图的基础上 取不同的 nnn 值 进行下一个池

    2025年10月28日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号