在報(bào)表中給session賦值實(shí)現(xiàn)報(bào)表間參數(shù)共享
Posted on 2015-09-30 09:59 FineReport——報(bào)表技術(shù)領(lǐng)跑者 閱讀(127) 評(píng)論(0) 編輯 收藏1. 問(wèn)題描述
在報(bào)表開(kāi)發(fā)工具FineReport中,若有幾張不同的報(bào)表,每張報(bào)表都有一個(gè)共同的項(xiàng)可以選擇,比如日期時(shí)間。我們希望選擇了第一張報(bào)表的時(shí)間之后,其他報(bào)表的默認(rèn)時(shí)間都變?yōu)榈谝粡垐?bào)表選擇的時(shí)間,此時(shí)要如何實(shí)現(xiàn)呢?
2. 實(shí)現(xiàn)思路
可以利用給session賦值來(lái)實(shí)現(xiàn)。給第一張報(bào)表的參數(shù)控件增加通過(guò)ajax的url將值傳遞給后臺(tái)的servlet的編輯后事件,servlet獲取ajax傳遞的值并將其保存到session中,后面的報(bào)表在參數(shù)的控件值處通獲取session值即可。
3. 實(shí)現(xiàn)步驟
3.1 Ajax傳值設(shè)置
隨便打開(kāi)一張帶參數(shù)的模版,如打開(kāi)模版:%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Primary\Parameter\Parameter.cpt。
點(diǎn)擊參數(shù)界面,將控件設(shè)置未文本框控件,給文本框控件增加編輯后事件,具體的js如下:
1.var str=this.getValue(); //獲取當(dāng)前控件的值 2.FR.ajax({ 3. url: "servlet/session?id="+FR.cjkEncode(str), //將值傳遞給session這個(gè)servlet中 });
注:如果想要預(yù)覽報(bào)表的同時(shí)將數(shù)據(jù)也寫(xiě)入到session中,而不需要異步加載,可以再ajax下面加上async:false。
3.2 獲取值并保存至Session
新建一個(gè)名為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通過(guò)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這個(gè)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 配置訪問(wèn)session賦值的Servlet
打開(kāi)%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>
注:在編寫(xiě)java類文件的時(shí)候,如果是保存在某個(gè)具體的包下面,比如說(shuō)com/fr/data下面,那么除了需要將class文件放置在對(duì)應(yīng)位置下之外,web.xml文件中的servlet-class標(biāo)簽也需要修改,比如說(shuō)修改為com.fr.data.session。
3.4 獲取session值
在另外一個(gè)參數(shù)模版如%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Primary\Parameter\Parameter1.cpt將數(shù)據(jù)集中地區(qū)參數(shù)的默認(rèn)值華北刪除,并且參數(shù)控件的控件值中選擇公式并輸入$sessionname(servlet中session的名字),如下圖:
注:sessionname是指java類中的sessionname。
3.5 效果查看
分頁(yè)預(yù)覽parameter.cpt,在文本框中輸入中國(guó)后,再預(yù)覽parameter1.cpt,可以看到文本框中顯示的是中國(guó)了,如下圖: