1. 問題描述javascript
在報表開發工具FineReport中,如有幾張不一樣的報表,每張報表都有一個共同的項能夠選擇,好比日期時間。咱們但願選擇了第一張報表的時間以後,其餘報表的默認時間都變爲第一張報表選擇的時間,此時要如何實現呢?html
2. 實現思路java
能夠利用給session賦值來實現。給第一張報表的參數控件增長經過ajax的url將值傳遞給後臺的servlet的編輯後事件,servlet獲取ajax傳遞的值並將其保存到session中,後面的報表在參數的控件值處通獲取session值便可。web
3. 實現步驟ajax
3.1 Ajax傳值設置session
隨便打開一張帶參數的模版,如打開模版:%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Primary\Parameter\Parameter.cpt。app
點擊參數界面,將控件設置未文本框控件,給文本框控件增長編輯後事件,具體的js以下:異步
1.var str=this.getValue(); //獲取當前控件的值 2.FR.ajax({ 3. url: "servlet/session?id="+FR.cjkEncode(str), //將值傳遞給session這個servlet中 });
注:若是想要預覽報表的同時將數據也寫入到session中,而不須要異步加載,能夠再ajax下面加上async:false。async
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,能夠看到文本框中顯示的是中國了,以下圖: