|
本文檔集中了用戶在使用FineReport報表過程中最常見的一些問題及回答,包含了log輸出級別、session問題集錦,Session賦值并獲取,是否支持C++,.Net等,自定義出錯頁面等。如果您剛剛接觸此款報表軟件,此文檔值得一看。 Log輸出級別分為三種:SERVER,WARNING和INFO,SERVER是導(dǎo)出服務(wù)器的報錯日志,WARNING 輸出執(zhí)行報表時的錯誤或警告信息,INFO則是導(dǎo)出所有報錯信息。設(shè)計器默認(rèn)的服務(wù)器log級別為WARNING。 1. 默認(rèn)log查看 FineReport安裝后會有自己的日志文件生成,不需要手動設(shè)置位置,也不可以改變其位置,可以直接查看相關(guān)信息。主要的兩個就是設(shè)計器log:designer_error.log和服務(wù)器log:server_error.log,分別保存了設(shè)計器的執(zhí)行信息和服務(wù)器的執(zhí)行信息。
![]() 2. 設(shè)計器log配置 點擊菜單欄中的窗口|選項,點擊
![]() 3. 服務(wù)器log配置 打開FR管理平臺,在服務(wù)器配置>基本界面中,有服務(wù)器log級別設(shè)置下拉框,選擇不同級別輸出不同信息。
![]() 服務(wù)器日志輸出的位置就是在默認(rèn)log位置中,輸出到server_error.log中。 4. Log級別輸出分別如下 4.1 設(shè)計器默認(rèn)的服務(wù)器log級別WARNING: 輸出執(zhí)行報表時的錯誤或警告信息
![]() 警告信息(Scheduler 已經(jīng)啟動了,可以直接調(diào)用):
![]() 警告報錯:
![]() 4.2 log級別Info 輸出所有信息如登陸用戶信息、報表執(zhí)行的sql、報表執(zhí)行時間、報表執(zhí)行過程等,如下圖為訪問報表后臺輸出信息
![]() 4.3 log級別Server Server: 只輸出服務(wù)器端的信息,報表相關(guān)的信息都不會顯示出來。
FAQ >> session問題集錦 一般session問題在我們報表里面主要存在于如下幾個方面:參數(shù)傳遞、權(quán)限、并發(fā)、集群。 1. FineReport中創(chuàng)建與關(guān)閉session機(jī)制 正常情況下,當(dāng)客戶端瀏覽器訪問報表服務(wù)器端的某張報表時,便會產(chǎn)生一個session會話,當(dāng)用戶關(guān)閉瀏覽器的時候就會通知報表服務(wù)器關(guān)閉這個session。若用戶的機(jī)器由于某種原因如非正常關(guān)機(jī)等等導(dǎo)致瀏覽器非正常關(guān)閉時,服務(wù)器沒有收到關(guān)閉這個session的信息,會一直保存這個不必要的session。為了解決這個問題,我們軟件中提供了這樣一種機(jī)制,瀏覽器每隔40秒向服務(wù)器發(fā)送一個“i am alive”信息,若服務(wù)器一分鐘沒有收到這個信息便會自動關(guān)閉這個session。當(dāng)瀏覽器遇到非正常停止時,便不會發(fā)送“i am alive”信息,相應(yīng)的session會在一分鐘以內(nèi)被關(guān)閉。 2. 應(yīng)用session與報表session 可能客戶會有一個疑問就是系統(tǒng)應(yīng)用和報表應(yīng)用在一個web服務(wù)器下,那系統(tǒng)session和報表session是不是一個session,如果不是那會不會有沖突呢?答案是:不是一個session也不會起沖突,因為應(yīng)用的session存放的是request請求等一些共享信息,而報表session存放的是訪問報表的相關(guān)信息,比如訪問的是不是同一個模板等,兩者是完全獨立的東西,所以不會沖突。 3. session中傳遞參數(shù) session 中可以保存key-value這樣的屬性對,在同一個session中,可以拿到session中key與其值。如果我們報表中定義了參數(shù)a, 而session中保存了key a ,其值為123,那么在我們報表中使用=$a就能直接在session中獲取到a的值。Session中賦值與取值如下:具體操作可以參考文檔Session賦值并獲取 HttpSession session = request.getSession(); // 獲取Session對象 session.setAttribute(String key, Object value); // 設(shè)置Session中的屬性 session.getAttribute(String key); // 獲取Session屬性 4. 權(quán)限 由于session中能夠保存key對,因此在權(quán)限中如果報表工程與自己的工程在一個應(yīng)用下面,即session相同,此時就能將用戶名與密碼存放于session中,在瀏覽器端將外界輸入的用戶名和密碼保存至session中,報表服務(wù)便可以獲得用戶名與密碼,去相應(yīng)的地址匹配,匹配成功,通過權(quán)限關(guān)卡;匹配失敗,跳轉(zhuǎn)登錄頁面。 5. 并發(fā) 由 1可知,打開一個瀏覽器訪問一張報表就會產(chǎn)生一個session,那么如果訪問的用戶多,每個用戶都產(chǎn)生>=1個session的話,可以看到 session將會很多。如果session設(shè)置的為100個,session保持時間為3分鐘,那么如果3分鐘有105個session,超過的5個session就進(jìn)入等待狀態(tài),若在3分鐘后服務(wù)器還沒有接受請求,這5個訪問報表的頁面就會返回session time out ,在6.5版本中已經(jīng)將session超時時間默認(rèn)設(shè)置為無窮大了。 6. 集群 集群的每臺服務(wù)器間必須創(chuàng)建通信,即session粘滯,否則也會出現(xiàn)session time out。如若有3臺服務(wù)器進(jìn)行集群,用戶發(fā)出一請求被分配至服務(wù)器A,保存了一些信息在session中,該用戶再次發(fā)送請求被分配到服務(wù)器B,要用之前保存的信息,若服務(wù)器A和B之間沒有session粘滯,那么服務(wù)器B就拿不到之前的信息,就返回session time out。 7. session基本概念 session機(jī)制本身并不復(fù)雜,然而其實現(xiàn)和配置上的靈活性卻使得具體情況復(fù)雜多變。這也要求我們不能把僅僅某一次的經(jīng)驗或者某一個瀏覽器,服務(wù)器的經(jīng)驗當(dāng)作普遍適用的經(jīng)驗,而是始終需要具體情況具體分析。 通俗的說:客戶端瀏覽器訪問某個地址,發(fā)送了一個請求,就產(chǎn)生一個session會話,現(xiàn)在的瀏覽器都可以打開多個tab窗口,打開的都屬于一個 session,當(dāng)該瀏覽器關(guān)閉的時候session就關(guān)閉了。若不關(guān)閉該瀏覽器,再次打開一個瀏覽器,會重新創(chuàng)建一個session。 7.1 session在何時被創(chuàng)建 一個常見的誤解是以為session在有客戶端訪問時就被創(chuàng)建,然而事實是直到某server端程序調(diào)用HttpServletRequest.getSession(true)這樣的語句時才被創(chuàng)建,注意如果JSP沒有顯示的使用 關(guān)閉session,則JSP文件在編譯成Servlet時將會自動加上這樣一條語句HttpSession session = HttpServletRequest.getSession(true),這也是JSP中隱含的session對象的來歷。 由于session會消耗內(nèi)存資源,因此,如果不打算使用session,應(yīng)該在所有的JSP中關(guān)閉它。 7.2 session何時被刪除 綜合前面的討論,session在下列情況下被刪除a.程序調(diào)用HttpSession.invalidate();或b.距離上一次收到客戶端發(fā)送的session id時間間隔超過了session的超時設(shè)置;或c.服務(wù)器進(jìn)程被停止(非持久session)。 7.3 如何做到在瀏覽器關(guān)閉時刪除session 嚴(yán)格的講,做不到這一點??梢宰鲆稽c努力的辦法是在所有的客戶端頁面里使用javascript代碼window.oncolose來監(jiān)視瀏覽器的關(guān)閉動作,然后向服務(wù)器發(fā)送一個請求來刪除session。但是對于瀏覽器崩潰或者強(qiáng)行殺死進(jìn)程這些非常規(guī)手段仍然無能為力。 由上一章節(jié)可知,session中可以保存key-value這樣的屬性對,在同一個session中,可以拿到session中的key與其值。如果我們報表中定義了參數(shù)a,而session中保存了key a,其值為123,那么在我們報表中使用=$a就能直接在session中獲取到a的值。Session中賦值與取值如下: HttpSession session = request.getSession(); //獲取Session對象 session.setAttribute(String key, Object value); //設(shè)置Session中的屬性 session.getAttribute(String key); //獲取Session屬性 訪問報表時,若其參數(shù)名稱在session中有對應(yīng)的key而且在同一個應(yīng)用環(huán)境下面,那么就能自動獲取到值。以下我們以一個具體的例子說明如何將值保存在session中及報表如何獲取。 1. 實現(xiàn)步驟 1.1 模板準(zhǔn)備 新建工作薄,定義一個報表參數(shù)country 模板設(shè)計如下,在單元格中引用參數(shù)的值
![]() 保存模板如sessiongetpara.cpt。這邊我們僅作原理說明,故模板制作簡單一些。 在java系統(tǒng)比如某個jsp頁面中,您可以通過session.setAttribute(String key, Object value);來設(shè)置key-value屬性對。如下面這個sessionsetpara.jsp代碼如下: 1. <%@ page language="java" contentType="text/html; charset="gb2312" pageEncoding="gb2312"%> 2. <% 3. session.setAttribute("country","China"); 4. %> 5. <html> 6. <body> 7. <p> 8. 已經(jīng)將country參數(shù)保存進(jìn)session,值為China! 9. </p> 10. </body> 11. </html> 1.3 參數(shù)值的獲取 啟動服務(wù)器(內(nèi)置服務(wù)器無法解析jsp頁面,請使用其他Web服務(wù)器進(jìn)行測試),調(diào)用上述sessionsetpara.jsp頁面時,便會將country的值保存至session中,在同一個瀏覽器中新打開一個窗口(使用的為同一個session),訪問我們之前做的模板sessiongetpara.cpt 您就會發(fā)現(xiàn),模板中自動獲取到了country的值。 1. request對象: 該對象封裝了用戶提交的信息,通過調(diào)用該對象相應(yīng)的方法可以獲取封裝的信息,即使用該對象可以獲取用戶提交信息。 request.getAttribute("key")可得到JSP頁面存入Value。在實際的存儲中,key和value是存放在一個哈希表中的,所以在這里給出String的Key會到哈希表中找出對應(yīng)他的value。 而不同頁面間傳值使用request.setAttribute(key, value)時,只會從a.jsp到b.jsp一次請求,之后如果有第二次請求,這個request就會失去它的作用范圍,再傳就要再設(shè)置一次 request.setAttribute(key,value)或者使用request的forward()方法跳轉(zhuǎn)也可以(因為它是一次請求)。而使用session.setAttribute()會在一個過程中始終保有這個值。 2. response對象: 包含了響應(yīng)客戶請求的有關(guān)信息,但在JSP中很少直接用到它。它是HttpServletResponse類的實例。response對象用于動態(tài)響應(yīng)客戶端請示,控制發(fā)送給用戶的信息,并將動態(tài)生成響應(yīng)。在響應(yīng)客戶端請求之前,一般可以先設(shè)置客戶端響應(yīng)的編碼格式,以防客戶端出現(xiàn)亂碼。response.setCharacterEncoding("GBK"); response既可以在本網(wǎng)站跳轉(zhuǎn),也可以跳轉(zhuǎn)到其他網(wǎng)站中;在跳轉(zhuǎn)過程中,相當(dāng)于在URL地址欄中重新輸入URL,是第二次請求,所以在request和response保存的數(shù)據(jù)就不存在了。 3. session對象 指的是客戶端與服務(wù)器的一次會話,從客戶連到服務(wù)器的一個WebApplication開始,直到客戶端與服務(wù)器斷開連接為止。它是HttpSession類的實例. Session:用于保存每個用戶的專用信息。Session中的信息保存在Web服務(wù)器的內(nèi)存中,保存的數(shù)據(jù)量可大可小。當(dāng)Session超時或被關(guān)閉時將自動釋放保存的數(shù)據(jù)信息。對于小量的數(shù)據(jù)Session對象保存還是一個不錯的選擇。具體的session對象刻意參考其他章節(jié):Session問題集錦和Session賦值并獲取。 我們的報表軟件是純java編寫的,對于java系統(tǒng),我們能夠很好的進(jìn)行集成,那對于不是java開發(fā)的系統(tǒng),比如C++開發(fā)的,那報表能夠集成嗎?以及該如何集成呢?有如下四種情況: 1. BS端將報表嵌在頁面中,如asp頁面,此時通過直接url便可以了,就像在頁面中嵌入一個谷歌頁面一樣。 2. BS端直接跳轉(zhuǎn)至報表頁面,如頁面中有個標(biāo)簽,點擊的時候可以打開我們的報表,此時就是iis集成。 3. CS系統(tǒng)中查看報表內(nèi)容,與java一樣,C++等中也可以裝瀏覽器插件,可以直接在CS系統(tǒng)中瀏覽報表頁面。 4. CS系統(tǒng)中嵌入我們報表的格子控件,比如用戶自己有一個CS系統(tǒng),工具欄和菜單等等都自己定義,只需要把我們設(shè)計器中格子控件集成到他們系統(tǒng)中,用來編輯內(nèi)容,這個我們不支持。 1. 問題描述 報表自帶的拋錯頁面色調(diào)和整個應(yīng)用的色調(diào)不一致如下圖,項目里有自己統(tǒng)一的出錯頁面,因此需要使用自定義出錯頁面。
![]() 2. 解決方案 在服務(wù)器>服務(wù)器配置>出錯模板定義直接調(diào)用自定義的出錯頁面如:/error.html,頁面中可以通過模板出錯參數(shù)message、charset、exception獲取到報錯信息。 3. 實現(xiàn)步驟 3.1 自定義出錯頁面 在使用自定義出錯頁面的時候可以調(diào)用報表系統(tǒng)錯誤頁面的參數(shù),下面簡單的列出參數(shù)以及說明。
如上的參數(shù)可以通過${參數(shù)名}的形式調(diào)用。如在定義的error.html頁面中調(diào)用參數(shù)message將提示錯誤信息顯示在表格中,如下: 1. <html> 2. <body> 3. <table> 4. <tr> 5. <td> 6. ${message} 7. </td> 8. </tr> 9. </table> 10. </body> 11. </html> 3.2 調(diào)用自定義出錯頁面 定義好的出錯頁面在服務(wù)器>服務(wù)器配置>出錯模板定義的模板路徑中調(diào)用,可以通過相對路徑或絕對路徑進(jìn)行調(diào)用: 相對路徑:自定義的出錯頁面error.html放在當(dāng)前Web應(yīng)用下,如WebReport目錄下,通過相對路徑進(jìn)行調(diào)用,模板路徑為:/error.html; 絕對路徑:自定義的出錯頁面error.html放在其他應(yīng)用下,通過絕對路徑進(jìn)行調(diào)用,模板路徑為:http://www./error.html。 注:通過絕對路徑調(diào)用時為防止瀏覽器不自動識別傳輸協(xié)議,路徑前須加上http://。
![]() |
|
|