1. 問題描述
在報表開發工具FineReport中,若有幾張不同的報表,每張報表都有一個共同的項可以選擇,比如日期時間。我們希望選擇了第一張報表的時間之后,其他報表的默認時間都變為第一張報表選擇的時間,此時要如何實現呢?
2. 實現思路
可以利用給session賦值來實現。給第一張報表的參數控件增加通過ajax的url將值傳遞給后臺的servlet的編輯后事件,servlet獲取ajax傳遞的值并將其保存到session中,后面的報表在參數的控件值處通獲取session值即可。
3. 實現步驟
3.1 Ajax傳值設置
隨便打開一張帶參數的模版,如打開模版:%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Primary\Parameter\Parameter.cpt。
點擊參數界面,將控件設置未文本框控件,給文本框控件增加編輯后事件,具體的js如下:
1.var str=this.getValue(); //獲取當前控件的值
2.FR.ajax({
3. url: "servlet/session?id="+FR.cjkEncode(str), //將值傳遞給session這個servlet中
});
注:如果想要預覽報表的同時將數據也寫入到session中,而不需要異步加載,可以再ajax下面加上async:false。
3.2 獲取值并保存至Session
新建一個名為session的類,具體的代碼如下:
1.import javax.servlet.http.HttpSession;
2.import java.io.IOException;
3.import java.io.PrintWriter;
4.import java.util.ResourceBundle;
5.import java.lang.String;
6.import javax.servlet.ServletException;
7.import javax.servlet.http.HttpServlet;
8.import javax.servlet.http.HttpServletRequest;
9.import javax.servlet.http.HttpServletResponse;
10.
11.import com.fr.stable.CodeUtils;
12.import com.fr.web.utils.WebUtils;
13.
14.public class session extends HttpServlet {
15. public void doGet(HttpServletRequest request,
16. HttpServletResponse response)
17. throws IOException, ServletException
18. {
19. response.setContentType("text/html; charset=gb2312");
20.
21. PrintWriter out = response.getWriter();
22. out.println("<html>");
23. out.println("<body>");
24. String urlid=request.getParameter("id"); //獲取url通過ajax傳遞的值
25. HttpSession session=request.getSession(true);
26. if(urlid==""||urlid==null){
27. out.print("<form action=\"");
28. out.print("session\" ");
29. out.println("method=POST>");
30. out.println("set session:<input type=text name=sessionvalue>");
31. out.println("<input type=submit name=bbb value=tijiao>");
32. out.println("</form>");
33. if(request.getParameter("sessionvalue")!=null&&request.getParameter("sessionvalue")!=""){
34. session.setAttribute("sessionname", request.getParameter("sessionvalue"));
35. }
36. }
37. else{
38. urlid = CodeUtils.decodeText(urlid);
39. session.setAttribute("sessionname",urlid); //將值賦值給sessionname這個session中
40. out.println("<script language='javascript'>window.close();</script>");
41. }
42. out.println("</body>");
43. out.println("</html>");
44. }
45. public void doPost(HttpServletRequest request,
46. HttpServletResponse response)
47. throws IOException, ServletException
48. {
49. doGet(request, response);
50. }
51.}
編譯session.java類,將編譯好的session.class放置在%FR _HOME%\WebReport\WEB-INF\classes目錄下。
3.3 配置訪問session賦值的Servlet
打開%FR _HOME%\WebReport\WEB-INF\下的web.xml,加入如下代碼:
1.<servlet>
2. <servlet-name>session</servlet-name>
3. <servlet-class>session</servlet-class>
4. </servlet>
5.
6. <servlet-mapping>
7. <servlet-name>session</servlet-name>
8. <url-pattern>/servlet/session</url-pattern>
9. </servlet-mapping>
注:在編寫java類文件的時候,如果是保存在某個具體的包下面,比如說com/fr/data下面,那么除了需要將class文件放置在對應位置下之外,web.xml文件中的servlet-class標簽也需要修改,比如說修改為com.fr.data.session。
3.4 獲取session值
在另外一個參數模版如%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Primary\Parameter\Parameter1.cpt將數據集中地區參數的默認值華北刪除,并且參數控件的控件值中選擇公式并輸入$sessionname(servlet中session的名字),如下圖:

注:sessionname是指java類中的sessionname。
3.5 效果查看
分頁預覽parameter.cpt,在文本框中輸入中國后,再預覽parameter1.cpt,可以看到文本框中顯示的是中國了,如下圖:
