一、概述
1
問題描述。
有幾張不同的報表,希望某一張報表的日期元件選擇好日期後,其他報表日期元件的參數都變成該日期,那麼該如何實現呢?
2
實現思路。
可以利用 Session 賦值來實現。給某一張報表的參數元件新增一個透過 AJAX 的 URL 將值傳遞給後臺的 servlet 編輯後事件,servlet 獲取 AJAX 傳遞的值並將其儲存到 Session 中,後面的報表在參數的元件值處通獲取 Session 值即可。
注:該方案不支援叢集。
二、操作步驟
1
AJAX 傳值設定。
開啟一張帶參數的範本,如開啟範本:【%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doctw\Primary\Parameter\Parameter.cpt】。點擊參數介面,將元件設定為文字元件,如下圖所示。
給文字元件增加【編輯後事件】。
JavaScript 代碼如下所示。
注:如果想要預覽報表的同時將資料也寫入到 Session 中,而不需要非同步載入,可以再 AJAX 下面加上【async:false】。
var str=this.getValue(); //獲取當前元件的值
FR.ajax({
url: "/webroot/session/report?id="+encodeURIComponent(str) //將值傳遞給 Session 這個 Servlet 中
});
2
獲取值並儲存至 Session。
建立一個名為 Session 的類,具體的代碼如下。
編譯【session.java】類,將編譯好的【session.class】放置在【%FR _HOME%\webapps\webroot\WEB-INF\classes\com\fr\data】目錄下。
package com.fr.data;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.String;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.fr.stable.CodeUtils;
public class session extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html; charset=gb2312");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
String urlid=request.getParameter("id"); //獲取url透過ajax傳遞的值
HttpSession session=request.getSession(true);
if(urlid==""||urlid==null){
out.print("<form action=\"");
out.print("session\" ");
out.println("method=POST>");
out.println("set session:<input type=text name=sessionvalue>");
out.println("<input type=submit name=bbb value=tijiao>");
out.println("</form>");
if(request.getParameter("sessionvalue")!=null&&request.getParameter("sessionvalue")!=""){
session.setAttribute("sessionname", request.getParameter("sessionvalue"));
}
}
else{
urlid = CodeUtils.decodeText(urlid);
session.setAttribute("sessionname",urlid); //將值賦值給sessionname這個session中
out.println("<script language='javascript'>window.close();</script>");
}
out.println("</body>");
out.println("</html>");
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
doGet(request, response);
}
}
3
配置存取 Session 賦值的 Servlet。
在【%FR _HOME%\webroot\WEB-INF\】下的建立【web.xml】檔案,加入如下代碼。
注:在編寫 Java 類檔案的時候,如果是儲存在某個具體的包下面,比如說【com/fr/data】下面,那麼除了需要將 class 檔案放置在對應位置下之外,【web.xml】檔案中的【servlet-class】標籤也需要修改,比如說修改為【com.fr.data.session】。
<?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>
4
獲取 Session 值。
在另外一個參數範本如【%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doctw\Primary\Parameter\Parameter1.cpt】將資料集中【地區】參數的預設值【華北】刪除,並且參數元件的元件值中選擇公式並輸入【$sessionname】(Servlet 中 Session 的名字),如下圖所示。
注:sessionname 是指 Java 類中的 sessionname。
5
效果查看。
由於設計器內建的 Tomcat 現在不讀【web.xml】檔案,因此需要將工程部署到外置Tomcat 中。
填報預覽【parameter.cpt】,在正文框中輸入【中國】後,再預覽【parameter1.cpt】,可以看到正文框中顯示的是【中國】了,如下圖所示。