#
摘要: FineReport设计器有自动的消息推送功能,可设置报表定时推送和常规的日报周报推送。官方有自己的消息推送的接口,不过有些用户旺旺希望自己开发,符合自己需求的推送界面。
下面这个方案就从逻辑层面简单阐述一个通讯类应该怎么实现。
废话不多说直接上代码,为了保证新手能够看懂,这个代码基本上只需要了解JS和JQ的常规写法就行。
Code highlighting produced by Ac...
阅读全文
环境准备
Tomcat服务器集群中需要进行环境准备:
- Apache:Apache是http服务器,利用其对Tomcat进行负载均衡,这里使用的版本是Apache HTTP Server2.0.64;
- Tmocat:Tmocat7.0.6;
- JK:JK是Tmocat提供给http服务器的插件,这里使用的版本是tmocat-connectors-1.2.37-windows-i386-httpd-2.0.x;
- 系统:win7。
软件安装
Apache
下载完成之后,直接安装apache,安装完成之后,在浏览器中输入http://localhost/,能够看到下图则说明安装成功:
Tomcat
解压下载好的tomcat缩包,复制三份解压好的tomcat文件夹,分别重命名为tomcat1,tomcat2,tomcat3。
配置过程
Apache配置修改
修改httpd.conf,找到conf目录下的httpd.cof,在文件的最后一行添加:
include "C:\Program Files (x86)\Apache Group\Apache2\conf\mod_jk.conf"
新建mod_jk.conf文件,在conf目录下新建mod_jk.conf文件,内容如下:
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkMount /*.jsp controller
解压下载的jk文件,将里面的so文件复制到Apache安装目录的modules目录下,这里下载的jk文件名为mod-jk.so。新建并编辑workers.properties文件。在conf文件夹下新建worker.properties,内容如下:
#server
worker.list = controller
#========tomcat1========
worker.tomcat1.port=11009
worker.tomcat1.host=localhost
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = 1
#========tomcat2========
worker.tomcat2.port=12009
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1
#========tomcat3========
worker.tomcat3.port=13009
worker.tomcat3.host=localhost
worker.tomcat3.type=ajp13
worker.tomcat3.lbfactor = 1
#========controller,负载均衡控制器========
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2,tomcat3
worker.controller.sticky_session=false
worker.controller.sticky_session_force=1
#worker.controller.sticky_session=1
如果需要配置远程的tomcat服务器的话,只需要将worker.tomcat3.host=localhost中的localhost改为远程服务器的IP地址即可。本次配置都是本地的tomcat,并且在一台机器上,所以端口号都不相同,如果在不同服务器上,端口号则不需要更改。
Tomcat配置
修改之前复制好的三份tmocat中的server.xml配置,打开conf/server.xml文件,修改如下图:
tomcat1:
Tomcat2:
Tomcat3:
结果测试
在tomcat下面的项目文件夹中修改web.xml,如这里使用test项目,则修改三个tomcat下面的test项目中的web.xml,在每个web.xml的<display-name>节点后添加新的节点<distributable/>。在每个test项目文件夹下新建test.jsp,内容如下:
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="Java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
// 如果有新的 Session 属性设置
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.println("<b>Session 列表</b><br>");
System.out.println("============================");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="test.jsp" method="POST">
名称:<input type=text size=20 name="dataName">
<br>
值:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>
Session测试
项目部署好之后,启动三个tomcat以及Apache,启动顺序随意,然后再浏览器中输入http://localhost/test/test.jsp,结果如下图:
刷新页面,如下图:
再次刷新,如下图:
多次刷新页面的sessionID看是同一个ID,说明session是复制成功了。那么session中的存储的东西呢,在输入框中分别输入1、1,2、2,3、3后,显示结果如下图:
节点插拔测试
关闭Tomcat
关闭tomcat3,刷新页面,可以不断访问tomcat1和tomcat2,再关闭tomcat2,只能够访问tomcat1,说明节点关闭时运行正常。
启动Tomcat
如果重启Tomcat2,无论怎么刷新,始终访问Tomcat3,无法访问tomcat2,这时利用另外台机器访问页面,发现Tomcat2正常,然后在刷本地页面,又可以访问Tomcat2了。对于每个新来的session,Apache按照节点配置中的lbfactor比重选择访问节点,如果某节点node1不能访问,则寻找下一可访问节点,并且将此node1就在该访问session的访问黑名单中,以后该session的访问直接不考虑node1,即使node1又可以访问了。而新来的session是无黑名单的,如果新的session能够访问到node1了,则会将node1在其他所有session访问的黑名单删除,这样其他session就又能访问node1节点了。经过以上测试,说明Tomcat集群和负载均衡已经实现了。
摘要: 如今,随着信息技术的不断发展,很多公司采用微信企业号来进行企业与员工之间的联系。其实微信企业号中右很多独立的应用。
那么如何可以将报表系统集成到微信中呢?这里分享一下在微信企业号中创建独立的报表应用,并且将微信账号单点登录到帆软报表软件FineReport的权限对接。
报表服务器环境准备
1、报表服务器环境要求
报表服务器必须是能够访问外网,并且如果是http协议则访问端口不限,如果是ht...
阅读全文
相信动态列的实现困扰了很多人,大数据量,多字段的加载将会非常耗时,数据又做不到真正的动态灵活。现有的方式都是通过变向的隐藏等方式来实现。
那该如何解决呢?这里分享帆软报表设计器FineReport的实现方案,结合实际工作中遇到的的相关内容。
我本地常用数据库是MYSQL,所以比较了解一点,所以实现方式也是基于mysql的。首先了解一下MySQL自带的information_schema数据库使用。
大家在安装或使用MYSQL时,会发现除了自己安装的数据库以外,还有一个 information_schema数据库。information_schema数据库是做什么用的呢,使用WordPress博客的朋友可能会想,是不是安装模板添加的数据库呀?看完本片文章后,你就会对information_schema数据库有所了解。
information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式。什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。
在 MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。在INFORMATION_SCHEMA中,有数个只读表。它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。
information_schema数据库表说明:
- SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
- TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
- COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
- STATISTICS表:提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。
- USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。
- SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。
- TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。
- COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。
- CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。
- COLLATIONS表:提供了关于各字符集的对照信息。
- COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。这些列等效于SHOWCOLLATION的前两个显示字段。
- TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。
- KEY_COLUMN_USAGE表:描述了具有约束的键列。
- ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。
- VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。
- TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表
扩展的应用
selecttable_schema,table_name,table_rows from tables where TABLE_SCHEMA = '数据库名称' order by table_rowsdesc;
selectconcat(round(sum(data_length/1024/1024),2),'MB') as data_length_MB,
concat(round(sum(index_length/1024/1024),2),'MB')as index_length_MB
frominformation_schema.tables where
table_schema='数据库名';
selectconcat(truncate(sum(data_length)/1024/1024,2),'MB') as data_size,
concat(truncate(sum(max_data_length)/1024/1024,2),'MB')as max_data_size,
concat(truncate(sum(data_free)/1024/1024,2),'MB')as data_free,
concat(truncate(sum(index_length)/1024/1024,2),'MB')as index_size
frominformation_schema.tables where TABLE_NAME = '表名';
看完之后相信可能还是有点疑惑。就是说mysql中有一个系统库information_schema。这个库中存放着mysql数据库的数据库实例名,表名称,表注释,字段名称,字段注释等等等等。而这个库的存在为我们动态列的实现就提供了一个基础。(其余的数据库oracle、sqlserver、db2等也有类似的存在。)
然后我们继续回到主题。我在本地建立了一个测试库reporttest,测试表report。在mysql库中新建一个库reporttest(或者使用已经存在的库,但是如果使用已经存在的,那么报表内部sql内容就需要更改。所以最好新建一个),然后用类似navicat的工具运行我提供的reporttest.sql文件,即可建表并且导入数据,然后刷新即可,此时数据准备完成。
设计器创建数据连接test,填写对应的数据库信息,测试成功即OK。
此时,库名称为reporttest,表名称为report,数据连接test。这时直接预览动态列实现方案.cpt。
可以很清晰的看到效果,选择哪个列,它就只查询那个列,只展示哪个列的数据,这就是动态列的实现方案。大家可以依据我的逻辑,替换成自己的数据连接库、表数据进行测试使用体验!
何为NAS?
简单说就是连接在网络上,具备资料存储功能的装置因此也称为“网络存储器”。它是一种专用数据存储服务器。他以数据为中心,将存储设备与服务器彻底分离,集中管理数据,从而释放带宽、提高性能、降低总拥有成本、保护投资。其成本远远低于使用服务器存储,而效率却远远高于后者。
为何选择群辉NAS
我所看重的是群辉的DSM操作系统,基于linux内核简单而且功能丰富的操作系统,群辉NAS就是一台功能丰富的电脑设备,可以娱乐,可以办公,可以视频监控等等。
仔细的小伙伴看到标题应该会有联想到何为用普通计算机假设NAS?
正是由于DSM系统的易用和高效性,决定了群辉的NAS是硬软件一体机,硬件的选择余地及可扩展性(CPU、内存)差也成为了它的硬伤。所以作为屌丝把它装在普通电脑上是在是个绝妙的主意!
好了,以上只是引言。下面我们言归正传,正式讲解在NAS-DSM系统(为了表示方面一下简称DSM)上部署Finereport数据决策系统。
安装篇
首先:我们需要在DSM系统上安装JAVA和Tomcat7.0,点开DSM的套件中心选择安装JAVAmanager及Tomcat7插件。在安装好这两个插件后,DSM会自动生成一个Tomcat文件夹并且会自动设置成共享方式。我们通过windows连接共享的方式就能方便的访问到这个文件,当然前提是你要以admin这个DSM管理员账户登录,如下图:
接下来就是进入到Tomcat\ROOT目录把里面的文件全部删除,然后把FineReport工程目录WebReport下的所有文件全部复制过来(注意:不包含WebReport目录是它下面的所有目录和文件)然后重启Tomcat,啥?你不知道如何重启?哈哈,你只是没找到而已,在DSM里一切都显得如此简单!请看下图:
还是在套件中心里找到左侧选择栏<已安装菜单>点击,然后在右侧窗口里找到安装好的tomcat。
其实到这里,FR已经能用http://你的IP地址:7070/ReportServer?op=fs访问了。但是到这里就够了么?NO,还不够方便、tomcat的内存还需要调整,我们还要进行优化!GO!GO!
优化篇:
1、URL访问带着端口不爽!后面还要输入一堆E文字符不爽!但是DSM系统出于安全考虑,简单的通过页面访问,你根本就找不到它的系统文件(哪怕是用管理员帐号)!而大家都知道要调整这些个属性必须要找到并编辑Tomcat的server.xml。那么我们这里只能通过linux窗口命令来处理,为此我们要开启DSM系统的Telnet功能,然后通过工具来修改。
A、开启DSM系统的Telnet功能:
勾选后保存
B、用SecureCRT连接DSM系统,账户名:root密码就是你admin的密码(root密码初始是和admin密码相同的)
切换到server.xml文件所在的目录,命令用小写
cd/var/packages/Tomcat7/target/src/conf
接下来打开编辑:
viserver.xml
通过键盘方向键找到此处,按键盘上的i字母键进入编辑模式,修改为80端口(因为我80端口用掉了,所以用的是8080),修改好后按ESC键退出编辑模式,按:键进入命令行模式输入W回车。至此端口修改完毕,重启Tomcat就能不带端口访问了!
C、tomcat下访问ip直接进入op=fs界面:
小伙伴们可以参考帮助文档的那篇文章,自行设置http://help.finereport.com/doc-view-806.html
需要补充说明的是:
1、如果标题出现乱码,可以打开a.jsp将编码改为GBK
2、给出DSM系统的web.xml的位置:/var/packages/Tomcat7/target/src/conf
3、由于前面我让大家把文件复制到ROOT目录的所以帮助文档的这部分就不用再做了
2、修改Tomcat内存,提高系统运行效率。修改catalina.sh文件方法同上,限于篇幅我只给出DSM系统的位置:/var/packages/Tomcat7/target/src/bin/,添加代码部位如下图:
经过以上的设置,基本已经达到我们的要求了短URL访问:只需输入IP地址就能直接跳到登录界面了、服务器内存也修改到了我们需要的大小。
摘要: 报表打印是报表使用和开发过程中经常碰到的问题,这里汇总了关于Web报表开发打印功能的一些典型应用案例,以应用最广泛的FineReport为例。
案例一:java直接调用报表打印
当java后台定义定时打印的功能,同时又需要直接调用报表的打印的时候,由于打印机型号和纸张不同,需要指定打印机,从而打印是否成功并设置返回值。那么怎么样可以实现这一过程呢?
实现过程
1、定义报表运行环境
C...
阅读全文
在对数据字段进行分类管理时,利用动态树折叠数据是一个很好的方法,也就是点击数据前面的加号才展开对应下面的数据,如下图。那这样的效果在制作报表时该如何实现呢? 下面以报表工具FineReport为例介绍。
思路:
通过将模版设置为组织树报表,然后通过设置树节点按钮,最好通过数据分析预览或者form表单预览即可查看效果。
步骤:
1、 初步建立模板
建立模板就相当于建立一个excel的sheet,只不过是cpt的形式。把相应的字段拖到单元格内。
2、 增加树节点按钮
通过设置树节点按钮来实现折叠树,分别右击单元格A1、A2、A3,选择空间设置>按钮,按钮类型选择“树节点按钮”,设置如下:
1、 保存与预览
保存模板,点击设计器中的数据分析,在网页上的预览效果即如上述所示。
动态效果展示:
用户设置了折叠树按钮后,预览报表时没有动态树效果,可能是预览模式错误。
我们是通过按钮控件实现该功能的,而普通的分页预览是不会将控件显示出来,如下图所示:
因此需要在op=view状态即数据分析下才能预览显示出效果。
折叠树延伸
需要在双向折叠树中显示对应的图表,以便查看,如下图所示:
具体步骤如下所示:
1、建立双向折叠树:
首先建立一个双向折叠树,双向折叠树需要注意折叠树数据列不可位于同一行或者同意列
2、设定节点点击事件
为了实现双向折叠树与图标的交互,需要设置树节点的点击事件,通过点击事件将树节点的值作为参数传递给图表。
下面以效果图中食品节点为例来说明控件点击事件的设置。
食品节点事件效果图如下所示
摘要: 在实际应用中,可能需要根据表名动态地改变数据源,比如在程序数据集中,通过传进的表名参数,到数据库取出对应的表作为数据源。例如,FineReport是通过AbstractTableData抽象类来读取数据源的,而上述所有的数据来源都继承实现其抽象方法,因此用户只要实现了AbstractTableData抽象类,也就可以用自定义类型的数据源了(程序数据集),这是带参程序数据集连接的方法。
FineR...
阅读全文