1. 描述
若有幾張不同的報表,每張報表都有一個共同的項可以選擇,比如日期時間。我們希望選擇了第一張報表的時間之後,其他報表的默認時間都變爲第一張報表選擇的時間,此時要如何實現呢?
2. 思路
可以利用給 Session 賦值來實現。給第一張報表的參數控件增加通過 AJAX 的 URL 将值傳遞給後台的 servlet 的編輯後事件,servlet 獲取 AJAX 傳遞的值并将其保存到 Session 中,後面的報表在參數的控件值處通獲取 Session 值即可。
3. 操作步驟
3.1 AJAX 傳值設置
随便打開一張帶參數的模板,如打開模板:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Primary\Parameter\Parameter.cpt。
點擊
,将控件設置爲文本控件,給文本控件增加編輯後事件,具體的 JavaScript 代碼如下所示:var str=this.getValue(); //獲取當前控件的值
FR.ajax({
url: "/webroot/session/report?id="+encodeURIComponent(str) //将值傳遞給 Session 這個 Servlet 中
});
注:如果想要預覽報表的同時将數據也寫入到 Session 中,而不需要異步加載,可以再 AJAX 下面加上 async:false。
詳細設置如下圖所示:
3.2 獲取值并保存至 Session
新建一個名爲 Session 的類,具體的代碼詳見:
https://git.fanruan.com/demo/example/src/release/10.0/src/main/java/com/fr/data/session.java
編譯 session.java 類,将編譯好的 session.class 放置在%FR _HOME%\webapps\webroot\WEB-INF\classes\com\fr\data目錄下。
3.3 配置訪問 Session 賦值的 Servlet
在%FR _HOME%\webroot\WEB-INF\下的新建 web.xml,加入如下代碼:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<display-name>Template WebApp</display-name>
<mime-mapping>
<extension>msi</extension>
<mime-type>application/x-msi</mime-type>
</mime-mapping>
<servlet>
<servlet-name>session</servlet-name>
<servlet-class>com.fr.data.session</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>session</servlet-name>
<url-pattern>/session/*</url-pattern>
</servlet-mapping>
</web-app>
注:在編寫 Java 類文件的時候,如果是保存在某個具體的包下面,比如說 com/fr/data 下面,那麽除了需要将 class 文件放置在對應位置下之外,web.xml 文件中的 servlet-class 标簽也需要修改,比如說修改爲 com.fr.data.session。
3.4 獲取 Session 值
在另外一個參數模板如%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Primary\Parameter\Parameter1.cpt将數據集中地區參數的默認值華北删除,并且參數控件的控件值中選擇公式并輸入$sessionname(Servlet 中 Session 的名字),如下圖:
注:sessionname 是指 Java 類中的 sessionname。
3.5 效果查看
由於内置的設計器的 Tomcat 現在不讀 web.xml,因此需要将工程部署到外置 Tomcat 中。
填報預覽 parameter.cpt,在文本框中輸入中國後,再預覽 parameter1.cpt,可以看到文本框中顯示的是中國了,如下圖所示: