#
摘要: 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...
閱讀全文