JasperReport-1.1.0 개발자매뉴얼 작성자 : 김기대작성일 : 2006.04.10 E-mail : kdkim@eznetsoft.co.kr 1
목차 1. Background Knowledge 2. 개발환경구축 3. 개발 - PDF 형식으로보고서제공하기 - Applet Viewer로보고서를 Embedded 해제공하기 4. 참고 2
Background Knowledge JasperReports는 Web Service 또는 C/S 상에서고객에게보고서출력및화면상에출력해주는 Open 툴로기존상용툴의기능못지않은기능을제공하고, 100% Java 기반으로만들어졌다. 본개발자용매뉴얼은웹기반개발을토대로작성되었으며, 본매뉴얼작성자가개발및적용한사례를토대로작성되었다. 따라서본작성자가제시한방법또는검증결과보다더나은방법이있을수있으므로이점참고하기바란다. JasperReports는 PDF, XML, HTML, CSV, XLS, RTF, TXT형식의보고서출력형식을지원하고, 그외여러특징을포함하고있는데, 자세한사항은 http://jasperreports.sourceforge.net/index.html을참고하기바란다. 본매뉴얼에서는 PDF 출력하는방법과 Applet Viewer 를이용에 JSP Page에 Embed 하는방법에대해다룰것이다. 3
환경구축 JasperReport 를사용하기전에기본적인개발환경이구축되어있어야한다. 다음은그내용들이다. OS: Windows NT, Linux, Unix, etc Web Engine: Weblogic, Websphere, Apache & Tomcat, etc J2SE : Version 1.4.0 이상권장 (2006.4.10. 현재 Latest Version: J2SE 5.0) JasperReport: JasperReport 1.1.0 이상권장 (2006.4.10. 현재 Latest Version: JasperReport 1.2.1) Report Designer : ireport-0.5.2 이상권장 (2006.4.10 현재 Latest Version: ireport 1.2.1) 4
환경구축 다음의사이트를방문하여 JasperReport 를다운받는다. http://sourceforge.net/project/showfiles.php?group _id=36382&package_id=28579 JasperReports Sample 및각종관련문서등이들어있다. JasperReport-1.2.1 Embedded Viewer를사용하기위한라이브러리이다. (JSP 페이지에전용 Viewer를사용하기위한라이브러리 ) 5
환경구축 다음의사이트를방문하여 ireport 를다운받는다. http://sourceforge.net/project/showfiles.php?group _id=64348 ireport-1.2.1 을다운받는다.(Windows 용 ) 6
환경구축 다운받은 jasperreport-1.1.0.jar 를다음의경로에복사한다. 본매뉴얼작성자는 BEA WebLogic 을사용하였기에경로는다음과같다. 허나 BEA WebLogic 을제외한다른 Web Engine 을사용할경우약간에변화가있을수있지만대부분의경우 WEB-INF lib 에복사해넣는다. C: bea user_projects domains pmsdomain applications sewonpms s ewonwebapp WEB-INF lib 7
환경구축 다운받은 ireport-0.5.2 를다음의경로에압축을푼다. 본매뉴얼작성자의경우 C: ireport-0.5.2 에압축을풀었다. 압축을푼후 C: ireport-0.5.2 lib 에있는모든라이브러리 (*.jar 외관련파일들 ) 를 C: bea user_projects domains pmsdomain applications sewonpms sewonwebapp WEB-INF lib 에복사한다. 8
환경구축 Bea WebLogic 의 setenv.cmd 파일에다음의내용을추가한다. set JASPER_HOME=C: bea user_projects domains pmsdomain applications se wonpms sewonwebapp WEB-INF lib set CLASSPATH=%JASPER_HOME% jasperreports- 1.1.0.jar;%JASPER_HOME% commons-logging- 1.0.2.jar;%JASPER_HOME% log4j-1.2.8.jar;%jasper_home% jdtcompiler.jar;%jasper_home% itext-1.3.1.jar; 9
환경구축 setenv.cmd 파일내용중 CLASSPATH의경우보고서에서어떤종류의기능을사용했느냐에따라라이브러리 (.jar) 의 CLASSPATH 등록항목이추가될수있다. 본매뉴얼작성자의경우보고서상에서특별한기능을지원하지않은일반적인보고서이기때문에위와같은라이브러리를등록했다. 만일보고서상에서 chart나 barcode 등을사용했다면추가되는관련라이브러리의수는늘어날것이다. 10
환경구축 C: bea user_projects domains pmsdomain appli cations sewonpms sewonwebapp WEB-INF 의 web.xml 파일에다음의내용을추가하자 <servlet> <servlet-name>reportservlet</servlet-name> <display-name>reportservlet</display-name> <servlet-class>reports.reportservlet</servlet-class> </servlet> <servlet> <servlet-name>imageservlet</servlet-name> <display-name>imageservlet</display-name> <servlet-class>reports.imageservlet</servlet-class> </servlet> <servlet> <servlet-name>jasperprintservlet</servlet-name> <servlet-class>reports.jasperprintservlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>jasperprintservlet</servlet-name> <url-pattern>/jasperprintservlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>reportservlet</servlet-name> <url-pattern>/report</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>imageservlet</servlet-name> <url-pattern>/img</url-pattern> </servlet-mapping> 위의내용은개발자의환경이나조건에따라변경될수있다. 11
환경구축 위의과정을모두마쳤으면 JasperReport 를사용하기위한환경 Setting 을마친것이다. 다시말하지만위의내용들은개발환경이나조건에따라변경될수있다. 12
본문서에서는개발자가고객에게보고서를제시할수있는두가지방법을제시할것이다. 첫째, PDF 형식의보고서를고객에게제공하는방법둘째,.jasper 파일을 jsp 페이지에 Embedded 해고객에게제공하는 Applet Viewer 방식 첫째방법의경우 Main 화면에서 Sub 화면을새로생성해보고서를 Sub 화면에출력하는형식으로보고서를.pdf 로저장할수있고, 프린터출력을할수있다. 두번째의경우 Main 화면에서직접보고서를생성해화면에출력하는형식으로보고서를저장할수없지만프린터출력을할수있다. 두가지방법모두장단점이있지만상황에맞게사용하면된다. 단위의방법모두 Client 쪽에제공하기전선행되어야할조건이있는데첫번째방법의경우 Adobe Reader 6.0이상이 Client에 Install 되어있어야하고, 두번째방법의경우 Client에 Java Plug-In 이 Install 되어있어야한다. 위두가지방법외에 JasperReport 는 XML, HTML, CSV, XLS, RTF, TXT 형식을제공할수있는데, 개발환경이나조건에맞게보고서형식을맞추어서비스를제공하면된다. 13
PDF 형식으로보고서제공하기 먼저 PDF 형식으로보고서를제공하기위해선우선보고서가작성되어야한다. ireport 를사용해보고서를작성하면기본적으로다음의파일들이생성될것이다. 그러나 PDF 형식으로보고서를제공하기위해선 ireport 에서 Build 형태를 PDF 선택한후보고서를생성해야한다. Build Option 을 PDF preview 를선택한후 Run 시키면다음의파일이생성된다. Build 의 default option 값으로 JRViewer preview 가선택되어져있다. 이경우다음의파일들이생성된다. 14
PDF 형식으로보고서제공하기 위처럼 ireport 를이용해보고서작성후.pdf 파일을화면에출력하게되는데이때필요한파일이 Interface 상에서사용자와통신을위한.html or.htm or.jsp 파일과 Interface 상에서요구되는요구사항을처리하기위한.class 파일이필요하다..html.htm Request Response RIGOH.pdf.class.jsp.jasper Client Server.jrxml 사용자의보고서출력조건을받아들인다. 사용자의보고서출력조건을받아들여정해진보고서양식에맞추어응답한다. 15
PDF 형식으로보고서제공하기 Client 쪽에서 Server Request 형식 예 ) Test.jsp <script language= javascript > var mc = document.form1.model_cd.value; var ms = document.form1.spec_group_id.value; var so = document.form1.sales_order.value; var a = ''; var b = ''; if(so!= ""){ window.open("/report?reportfilename=sales_requirement_document&lotno="+a+"&model_cd=" +mc+"&spec_group_id="+ms+"&sales_order="+so+"&delivery_order="+b, "reportview", ""); else{ alert(' 제조의뢰번호가생성되지않았습니다. 다시확인하시오.'); return false; </script> 위의소스예에서 /report 는 C: bea user_projects domains pmsdomain applications sewonpms se wonwebapp WEB-INF 의경로에 web.xml 파일의내용과일치해야한다. 또? 이하로이어지는문장들은보고서출력을위한출력조건들을파라미터값으로전달하는예를보여주고있다. 예 ) web.xml <servlet-mapping> <servlet-name>reportservlet</servlet-name> <url-pattern>/report</url-pattern> </servlet-mapping> 16
PDF 형식으로보고서제공하기 Server 에서 Client 에 Response 형식 예 ) ReportServlet.java import java.io.file; import java.io.ioexception; import java.sql.connection; import java.sql.sqlexception; import java.util.hashmap; import java.util.map; import javax.naming.context; import javax.naming.initialcontext; import javax.naming.namingexception; import javax.servlet.servlet; import javax.servlet.servletcontext; import javax.servlet.servletexception; import javax.servlet.servletoutputstream; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import javax.sql.datasource; import net.sf.jasperreports.engine.jrexception; import net.sf.jasperreports.engine.jaspercompilemanager; import net.sf.jasperreports.engine.jasperreport; import net.sf.jasperreports.engine.jasperrunmanager; import net.sf.jasperreports.engine.util.jrloader; /** * @version 1.0 * @author */ public class ReportServlet extends HttpServlet implements Servlet { private DataSource ds; 17
PDF 형식으로보고서제공하기 Server 에서 Client 에 Response 형식 /** * @see javax.servlet.http.httpservlet#void (javax.servlet.http.httpservletrequest, javax.servlet.http.httpservletresponse) */ public void doget(httpservletrequest req, HttpServletResponse resp) throws ServletException, IOException { dopost(req, resp); /** * @see javax.servlet.http.httpservlet#void (javax.servlet.http.httpservletrequest, javax.servlet.http.httpservletresponse) */ public void dopost(httpservletrequest req, HttpServletResponse resp) throws ServletException, IOException { Connection conn = null; Map parameters = new HashMap(); try { // Get a database connection conn = getconnection(); String REPORT_FILE_NAME = req.getparameter("reportfilename"); String LOT_NO= req.getparameter("lotno"); String MODEL_CD= req.getparameter("model_cd"); String SPEC_GROUP_ID= req.getparameter("spec_group_id"); String SALES_ORDER = req.getparameter("sales_order"); String DELIVERY_ORDER = req.getparameter("delivery_order"); String MAIN_MATERIAL_ID = req.getparameter("main_material_id"); ServletContext context = getservletcontext(); if(report_file_name.equals("delivery_requirement_document")){ parameters.put("delivery_order", DELIVERY_ORDER); JasperReport jasperreport = getcompiledreport(report_file_name); generatepdfoutput(resp, parameters, jasperreport); catch (Exception e) { req.setattribute("exception", e); getservletcontext().getrequestdispatcher("/jsp/exception.jsp").forward(req,resp); finally { 18
PDF 형식으로보고서제공하기 Server 에서 Client 에 Response 형식 if (conn!= null) { try { conn.close(); catch (SQLException sqle) { // Ignore private void generatepdfoutput(httpservletresponse resp, Map parameters, JasperReport jasperreport) throws JRException, NamingException, SQLException, IOException { byte[] bytes = null; bytes = JasperRunManager.runReportToPdf(jasperReport, parameters, getconnection()); resp.setcontenttype("application/pdf"); resp.setcontentlength(bytes.length); ServletOutputStream ouputstream = resp.getoutputstream(); ouputstream.write(bytes, 0, bytes.length); ouputstream.flush(); ouputstream.close(); /** * @see javax.servlet.genericservlet#void () */ public void init() throws ServletException { super.init(); ServletContext context = getservletcontext(); // Set class path for compiling XML templates System.setProperty("jasper.reports.compile.class.path", context.getrealpath("/web-inf/lib/jasperreports-1.1.0.jar") + System.getProperty("path.separator") + context.getrealpath("/web-inf/classes/")); // Specify a default folder for storing // compiled XML templates System.setProperty("jasper.reports.compile.temp", context.getrealpath("/reports/")); 19
PDF 형식으로보고서제공하기 Server 에서 Client 에 Response 형식 private DataSource getdatasource() throws NamingException { if (ds == null) { Context ctx = new InitialContext(); ds = (DataSource) ctx.lookup("pmsdatasource"); return ds; private Connection getconnection() throws SQLException, NamingException { return getdatasource().getconnection(); private JasperReport getcompiledreport(string filename) throws JRException { File reportfile = new File(getServletContext().getRealPath("/reports/" + filename + ".jasper")); // If compiled file is not found, then // compile XML template if (!reportfile.exists()) { if(filename.equals("semi_product_outgoing_slip")){ JasperCompileManager.compileReportToFile(getServletContext().getRealPath("/reports/ + filename + ".jrxml")); else{ JasperCompileManager.compileReportToFile(getServletContext().getRealPath("/reports/" + filename + ".xml")); JasperReport jasperreport = JRLoader.loadObject(reportFile.getPath()); return jasperreport; (JasperReport) 20
PDF 형식으로보고서제공하기 파일 Process 구조 보고서양식 (.pdf) Test.jsp Request Response ReportServlet.java 보고서양식 추출데이터 화면단에서보고서출력을위한보고서출력조건을수집해 Server 의 ReportServlet.java 에요청한다. Server 로부터응답이오면그결과값을새로운창에출력한다. 화면단으로부터수집된결과를토대로결과값을 DB 에서추출하고, 보고서 (.pdf) 에접목한후화면단에응답을보낸다. 21
PDF 형식으로보고서제공하기 파일들의보관위치 본매뉴얼작성자의경우위와같은경로에각각의파일들을보관했다. 파일들의보관위치는자유롭기때문에.class 파일의경우는 WEB-INF classes 안에그외파일의경우 sewonwebapp 의원하는하위경로에보관하면된다. 22
PDF 형식으로보고서제공하기 실행화면 DB 에서추출된데이터를 PDF 보고서양식에맞추어출력한다. Click 보고서데이터추출을위한파라미터값 보고서 Window Main Window 23
Applet Viewer 로보고서를 Embedded 해제공하기 이방식또한 PDF 제공방식과마찬가지로보고서를화면단에제공하기위해선선행되어야할조건이있는데이것역시 ireport 를이용해보고서를생성하는것이다. 단지틀린점은보고서 Build 시 Build 형식을 default 형식을선택해생성하면된다. 24
Applet Viewer 로보고서를 Embedded 해제공하기 이방식은개인적인소견으론 PDF 제공방식보다약간복잡하다. 보고서출력을위한파일처리순서는다음과같다. 파라미터값과함께보고서출력요구 1 2 파라미터전송 3 파라미터전송 Applet Viewer 생성 2 Viewer 에결과전송 4 추출된데이터 보고서양식 보고서데이터추출 Viewer 에보고서결과화면출력 25
Applet Viewer 로보고서를 Embedded 해제공하기 파일들의보관위치. 본매뉴얼작성자는위와같은위치에해당파일들을위치시켰다. 26
Applet Viewer 로보고서를 Embedded 해제공하기 파일들의내부구조. <html> <head> <title></title> <script language = "javascript"> /************************************************************ // 업무프로세스함수 ************************************************************/ function doaction(mode){ switch(mode){ case 'retrieve' : document.form1.action = "RPTCOM_L_V01.jsp"; document.form1.target = "BottomF"; document.form1.method = "post"; document.form1.checkswitch.value = "1"; document.form1.submit(); break; </script> </head> 보고서 Applet Viewer 를호출한다. <body> <form name= form1 > <input type= hidden name= model_cd value= > </form> </body> 파라미터대상이될 Tag 들을위치시킨다. </html> 27
Applet Viewer 로보고서를 Embedded 해제공하기 파일들의내부구조. Applet Viewer 를사용하기위해선아래와같이우선 Applet 을호출하기위한조건들을나열한후 HtmlConverter.exe 를이용해컴파일해주어야한다. 위의라이브러리는 JDK(C: jdk142_04 bin) 에서기본적으로포함하고있다. 아래와같이사용하면된다. 사용방식 : C: HtmlConverter test.html 또는 C: HtmlConverter test.jsp <HTML> <HEAD> </HEAD> <TITLE></TITLE> <BODY> <APPLET CODE = "EmbeddedViewerApplet.class" JAVA_CODEBASE = "../../applets" ARCHIVE = "jasperreports-1.1.0-applet.jar" WIDTH = "925" HEIGHT = "710"> <PARAM NAME = "reportfilename" VALUE="<%=reportFileName%>"> <PARAM NAME = "report_group" VALUE="<%=report_group%>"> <PARAM NAME = "model_cd" VALUE="<%=model_cd%>"> <PARAM NAME = "from_ymd" VALUE="<%=from_ymd%>"> <PARAM NAME = "to_ymd" VALUE="<%=to_ymd%>"> <PARAM NAME = "customer_cd" VALUE="<%=customer_cd%>"> <PARAM NAME = "org_cd" VALUE="<%=org_cd%>"> <PARAM NAME = "progress_status" VALUE="<%=progress_status%>"> <PARAM NAME = "REPORT_URL" VALUE ="/JasperPrintServlet"> </APPLET> </BODY> </HTML> 28
Applet Viewer 로보고서를 Embedded 해제공하기 HtmlConverter.exe 를사용하면원본파일이포함되어있는폴더명뒤에 _BAK 라는폴더를새로생성시키고원본파일이폴더에복사한다. 예 ) 원본파일을컴파일한파일 원본파일 원본파일 HtmlConverter.exe 실행전 Directory 구조 HtmlConverter.exe 실행후 Directory 구조 HtmlConverter.exe 를실행한후실제사용하는파일은다음과아래소스코드와같이원본내용이바뀌어있을것이다. 29
Applet Viewer 로보고서를 Embedded 해제공하기 위의코드를 HtmlConverter.exe 를통해컴파일을하면자동으로다음과같은소스가생성된다. <HTML> <HEAD> </HEAD> <BODY> <TITLE></TITLE> <!--"CONVERTED_APPLET"--> <!-- HTML CONVERTER --> <OBJECT classid = "clsid:cafeefac-0014-0002-0004-abcdeffedcba" codebase = "http://java.sun.com/update/1.4.2/jinstall-1_4_2_04-windowsi586.cab#version=1,4,2,40" WIDTH = "925" HEIGHT = "710" > <PARAM NAME = CODE VALUE = "EmbeddedViewerApplet.class" > <PARAM NAME = ARCHIVE VALUE = "jasperreports-1.1.0-applet.jar" > <PARAM NAME = "type" VALUE = "application/x-java-applet;jpi-version=1.4.2_04"> <PARAM NAME = "scriptable" VALUE = "false"> <PARAM NAME = "reportfilename" VALUE="<%=reportFileName%>"> <PARAM NAME = "report_group" VALUE="<%=report_group%>"> <PARAM NAME = "model_cd" VALUE="<%=model_cd%>"> <PARAM NAME = "from_ymd" VALUE="<%=from_ymd%>"> <PARAM NAME = "to_ymd" VALUE="<%=to_ymd%>"> <PARAM NAME = "customer_cd" VALUE="<%=customer_cd%>"> <PARAM NAME = "org_cd" VALUE="<%=org_cd%>"> <PARAM NAME = "progress_status" VALUE="<%=progress_status%>"> <PARAM NAME = "REPORT_URL" VALUE ="/JasperPrintServlet"> <COMMENT> <EMBED type = "application/x-java-applet;jpi-version=1.4.2_04" CODE = "EmbeddedViewerApplet.class" ARCHIVE = "jasperreports-1.1.0-applet.jar" WIDTH = "925" HEIGHT = "710" reportfilename ="<%=reportfilename%>" report_group ="<%=report_group%>" model_cd ="<%=model_cd%>" from_ymd ="<%=from_ymd%>" to_ymd ="<%=to_ymd%>" 30
Applet Viewer 로보고서를 Embedded 해제공하기 customer_cd ="<%=customer_cd%>" org_cd ="<%=org_cd%>" progress_status ="<%=progress_status%>" REPORT_URL ="/JasperPrintServlet" scriptable = false pluginspage = "http://java.sun.com/products/plugin/index.html#download"> <NOEMBED> </NOEMBED> </EMBED> </COMMENT> </OBJECT> <!-- <APPLET CODE = "EmbeddedViewerApplet.class" ARCHIVE = "jasperreports-1.1.0-applet.jar" WIDTH = "925" HEIGHT = "710"> <PARAM NAME = "reportfilename" VALUE="<%=reportFileName%>"> <PARAM NAME = "report_group" VALUE="<%=report_group%>"> <PARAM NAME = "model_cd" VALUE="<%=model_cd%>"> <PARAM NAME = "from_ymd" VALUE="<%=from_ymd%>"> <PARAM NAME = "to_ymd" VALUE="<%=to_ymd%>"> <PARAM NAME = "customer_cd" VALUE="<%=customer_cd%>"> <PARAM NAME = "org_cd" VALUE="<%=org_cd%>"> <PARAM NAME = "progress_status" VALUE="<%=progress_status%>"> <PARAM NAME = "REPORT_URL" VALUE ="/JasperPrintServlet"> </APPLET> --> <!--"END_CONVERTED_APPLET"--> </BODY> </HTML> 31
Applet Viewer 로보고서를 Embedded 해제공하기 원래이전 (2006.04.10 현재 ) 까지만해도위와같이컴파일한후 Applet 을바로사용할수있었으나 IE 가 2006.4 월부터기존의방식을지원하지않아다음과같이바꾼후사용해야한다. 자동생성된코드부분에서 <OBJECT>,<COMMENT>, <EMBED> Tag 모두를 java script 로처리해야한다. 예 ) <HTML> <HEAD> </HEAD> <BODY> <TITLE></TITLE> <!--"CONVERTED_APPLET"--> <!-- HTML CONVERTER --> <script language="javascript"> document.write('<object '); document.write(' classid = "clsid:cafeefac-0014-0002-0004-abcdeffedcba"'); document.write(' codebase = "http://java.sun.com/update/1.4.2/jinstall-1_4_2_04-windowsi586.cab#version=1,4,2,40"'); document.write(' WIDTH = "925" HEIGHT = "710" >'); document.write(' <PARAM NAME = CODE VALUE = "EmbeddedViewerApplet.class" >'); document.write(' <PARAM NAME = CODEBASE VALUE = "../../applets" >'); document.write(' <PARAM NAME = ARCHIVE VALUE = "jasperreports-1.1.0- applet.jar" >'); document.write(' <PARAM NAME = "type" VALUE = "application/x-java-applet;jpiversion=1.4.2_04">'); document.write(' <PARAM NAME = "scriptable" VALUE = "false">'); document.write(' <PARAM NAME = "reportfilename" VALUE="<%=reportFileName%>">'); document.write(' <PARAM NAME = "report_group" VALUE="<%=report_group%>">'); document.write(' <PARAM NAME = "model_cd" VALUE="<%=model_cd%>">'); document.write(' <PARAM NAME = "from_ymd" VALUE="<%=from_ymd%>">'); document.write(' <PARAM NAME = "to_ymd" VALUE="<%=to_ymd%>">'); 32
Applet Viewer 로보고서를 Embedded 해제공하기 document.write(' <PARAM NAME = "customer_cd" VALUE="<%=customer_cd%>">'); document.write(' <PARAM NAME = "org_cd" VALUE="<%=org_cd%>">'); document.write(' <PARAM NAME = "progress_status" VALUE="<%=progress_status%>">'); document.write(' <PARAM NAME = "REPORT_URL" VALUE ="/JasperPrintServlet">'); document.write(' <COMMENT>'); document.write(' <EMBED type="application/x-java-applet;jpiversion=1.4.2_04" CODE="EmbeddedViewerApplet.class" JAVA_CODEBASE="../../applets" ARCHIVE = "jasperreports- 1.1.0-applet.jar" WIDTH = "925" HEIGHT = "710" reportfilename ="<%=reportfilename%>" report_group ="<%=report_group%>" model_cd ="<%=model_cd%>" from_ymd ="<%=from_ymd%>" to_ymd ="<%=to_ymd%>" customer_cd ="<%=customer_cd%>" org_cd ="<%=org_cd%>" progress_status ="<%=progress_status%>" REPORT_URL ="/JasperPrintServlet" scriptable = false pluginspage ="http://java.sun.com/products/plugin/index.html#download">'); document.write(' <NOEMBED>'); document.write(' </NOEMBED>'); document.write(' </EMBED>'); document.write(' </COMMENT>'); document.write('</object>'); </script> <!-- <APPLET CODE = "EmbeddedViewerApplet.class" JAVA_CODEBASE = "../../applets" ARCHIVE = "jasperreports-1.1.0-applet.jar" WIDTH = "925" HEIGHT = "710"> <PARAM NAME = "reportfilename" VALUE="<%=reportFileName%>"> <PARAM NAME = "report_group" VALUE="<%=report_group%>"> <PARAM NAME = "model_cd" VALUE="<%=model_cd%>"> <PARAM NAME = "from_ymd" VALUE="<%=from_ymd%>"> 33
Applet Viewer 로보고서를 Embedded 해제공하기 <PARAM NAME = "to_ymd" VALUE="<%=to_ymd%>"> <PARAM NAME = "customer_cd" VALUE="<%=customer_cd%>"> <PARAM NAME = "org_cd" VALUE="<%=org_cd%>"> <PARAM NAME = "progress_status" VALUE="<%=progress_status%>"> <PARAM NAME = "REPORT_URL" VALUE ="/JasperPrintServlet"> </APPLET> --> <!--"END_CONVERTED_APPLET"--> </BODY> </HTML> 위와같이 Applet 호출부를 Script 로처리해주어야아무런문제없이서비스를제공할수있다. 34
Applet Viewer 로보고서를 Embedded 해제공하기 파일들의내부구조. public void init() { String url = getparameter("report_url"); String reportfilename = getparameter("reportfilename"); String model_cd = getparameter("model_cd"); String report_group = getparameter("report_group"); // 각파라메터들이 null을받았을경우 "" 으로초기화한다. model_cd = (model_cd == null)?model_cd="":model_cd; String makeparameters = url + "?reportfilename=" + reportfilename + "&model_cd=" + model_cd + "&report_group=" + report_group; if (url!= null) { try { jasperprint = (JasperPrint)JRLoader.loadObject(new URL(getCodeBase(), makeparameters)); if (jasperprint!= null) { JRViewerSimple viewer = new JRViewerSimple(jasperPrint); this.pnlmain.add(viewer, BorderLayout.CENTER); catch (Exception e) { StringWriter swriter = new StringWriter(); PrintWriter pwriter = new PrintWriter(swriter); e.printstacktrace(pwriter); JOptionPane.showMessageDialog(this, swriter.tostring()); else{ JOptionPane.showMessageDialog(this, "Source URL not specified"); Parameter 를이용해추출한데이터와미리작성된보고서양식과매치시킨다. 35
Applet Viewer 로보고서를 Embedded 해제공하기 파일들의내부구조. import net.sf.jasperreports.engine.jrexception; import net.sf.jasperreports.engine.jasperprint; import net.sf.jasperreports.view.jrviewer; public class JRViewerSimple extends JRViewer { public JRViewerSimple(JasperPrint jrprint) throws JRException { super(jrprint); tlbtoolbar.remove(btnsave); tlbtoolbar.remove(btnreload); Viewer 의 Tool Bar 를제어한다. 36
Applet Viewer 로보고서를 Embedded 해제공하기 파일들의내부구조. public class JasperPrintServlet extends HttpServlet{ private DataSource ds; public void service(httpservletrequest request, HttpServletResponse response) throws IOException, ServletException{ ServletContext context = this.getservletconfig().getservletcontext(); String REPORT_FILE_NAME = request.getparameter("reportfilename").trim(); String MODEL_CD = request.getparameter("model_cd").trim(); String REPORT_GROUP = request.getparameter("report_group").trim(); File reportfile = new File(context.getRealPath("/reports/" + REPORT_FILE_NAME + ".jasper")); if (!reportfile.exists()) throw new JRRuntimeException("File " + REPORT_FILE_NAME + ".jasper not found. The report design must be compiled first."); Map parameters = new HashMap(); if(report_group.equals("inventory")){ if(report_file_name.equals("process_stock_status")){ parameters.put("model_cd", MODEL_CD); JasperPrint jasperprint = null; Connection conn = null; Parameter 들을처리한다. 37
Applet Viewer 로보고서를 Embedded 해제공하기 try { conn = getconnection(); JasperReport jasperreport = (JasperReport)JRLoader.loadObject(reportFile.getPath()); jasperprint = JasperFillManager.fillReport(jasperReport, parameters, conn); catch (JRException jre) { return; catch (Exception e) { finally{ try{ if(conn!= null){ conn.close(); catch(sqlexception sqle){ 보고서데이터를추출해 Object 에할당한다. if (jasperprint!= null) { response.setcontenttype("application/octet-stream"); ServletOutputStream ouputstream = response.getoutputstream(); ObjectOutputStream oos = new ObjectOutputStream(ouputStream); oos.writeobject(jasperprint); oos.flush(); oos.close(); Stream 을통해 Viewer 에출력한다. ouputstream.flush(); ouputstream.close(); else{ 38
Applet Viewer 로보고서를 Embedded 해제공하기 private DataSource getdatasource() throws NamingException { if (ds == null) { Context ctx = new InitialContext(); ds = (DataSource) ctx.lookup("pmsdatasource"); return ds; DB 연결처리를한다. private Connection getconnection() throws SQLException, NamingException { return getdatasource().getconnection(); 39
Applet Viewer 로보고서를 Embedded 해제공하기 실행화면 보고서출력을위한 Parameter Click Applet Viewer Main JSP Page 40
참고 이상으로 JasperReport 사용방법을간단히매뉴얼로작성했다. 궁금한점이있을경우본매뉴얼작성자 (rokmc0304@hotmailcom or kdkim@eznetsoft.co.kr) 에게연락을하거나다음의사이트들을방문하면더많은정보를얻을수있을것이다. http://jasperreports.sourceforge.net http://ireport.sourceforge.net/ http://www.jaspersoft.com/ http://java.sun.com/j2se/1.4.2/docs/guide/plugin/developer_guide/contents.ht ml http://java.sun.com/j2se/1.4.2/docs/guide/plugin/developer_guide/using_tags. html#intro 41