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