- package com.defonds.test;
- import java.io.File;
- import java.io.IOException;
- import java.io.ObjectOutputStream;
- import javax.servlet.RequestDispatcher;
- import javax.servlet.ServletException;
- import javax.servlet.ServletOutputStream;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- import java.util.Calendar;
- import java.util.HashMap;
- import java.util.Map;
- import net.sf.jasperreports.engine.JRResultSetDataSource;
- import net.sf.jasperreports.engine.JasperCompileManager;
- import net.sf.jasperreports.engine.JasperExportManager;
- import net.sf.jasperreports.engine.JasperFillManager;
- import net.sf.jasperreports.engine.JasperPrint;
- import net.sf.jasperreports.engine.JasperReport;
- import net.sf.jasperreports.engine.JasperRunManager;
- /**
- * 建立數據庫鏈接
- * 由 sql 語法取出資料,準備好傳入的 parameters
- * 將 parameters 及取出的資料傳入 Jasper 中。會由 .jasper 文檔生出 .jrprint 文檔
- * 再由 .jrprint 文檔生出 .pdf 目的文檔給調用頁面下載
- * @author Defonds
- *
- */
- public class TestServlet3 extends HttpServlet {
- private static final String CONTENTTYPE = "application/octet-stream";
- /**
- * Constructor of the object.
- */
- public TestServlet3() {
- super();
- }
- /**
- * Destruction of the servlet. <br>
- */
- public void destroy() {
- super.destroy(); // Just puts "destroy" string in log
- // Put your code here
- }
- /**
- * The doGet method of the servlet. <br>
- *
- * This method is called when a form has its tag value method equals to get.
- *
- * @param request the request send by the client to the server
- * @param response the response send by the server to the client
- * @throws ServletException if an error occurred
- * @throws IOException if an error occurred
- */
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- String fileName = "";
- String sql = "";
- Map parameters = new HashMap();
- //parameters.put("rptToday", strDate);//傳入的 prameters 引數
- sql = "select * from tab_channel_car_basic t";
- Connection conn = this.createConnection();//建立連接
- try {
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(sql);
- response.setContentType(CONTENTTYPE);
- ServletOutputStream ouputStream = response.getOutputStream();
- fileName="D://iReport//iReport-0.4.0//Work//carBasic3.jrxml";
- JasperReport jrt = JasperCompileManager.compileReport(fileName);//編譯報表格式
- JasperPrint jpt = JasperFillManager.fillReport(jrt, parameters, new JRResultSetDataSource(rs));//匹配數據源,生成JasperPrint
- ObjectOutputStream oos = new ObjectOutputStream(ouputStream);
- oos.writeObject(jpt);
- oos.flush();
- oos.close();
- }catch(Exception e) {
- System.out.println("Error:" + e.toString());
- e.printStackTrace();
- }finally {
- CloseConnect(conn);
- conn = null;
- }
- }
- /**
- * 建立連接方法
- * @return Connection
- */
- public Connection createConnection() {
- Connection conn;
- try {
- String driver = "oracle.jdbc.driver.OracleDriver";
- String url = "jdbc:oracle:thin:@localhost:1521:CUC";
- Class.forName(driver);
- conn = DriverManager.getConnection(url,"sybj","sybj");
- conn.setAutoCommit(false);
- return conn;
- }catch(SQLException e1) {
- System.out.println("建立連接錯誤 = " + e1.toString());
- e1.printStackTrace();
- }catch(ClassNotFoundException e2) {
- System.out.println("建立連接錯誤 = " + e2.toString());
- e2.printStackTrace();
- }
- return null;
- }
- /**
- * 關閉連接方法
- * @param conn
- */
- public void CloseConnect(Connection conn) {
- try {
- conn.commit();
- conn.setAutoCommit(true);
- conn.close();
- }catch(Exception e) {
- System.out.println("關閉連接錯誤 = " + e.toString());
- }
- }
- }
PS:這裏,關於 carBasic3.jrxml 文件的提取,筆者採用的是物理路徑,讀者可以把 *.jrxml 文件放到項目根目錄下,然後採用其他方式提取。
如果輸入http://localhost:9999/Test2/testServlet3
就彈出來一個下載窗口,證明這個 servlet 已經 ok(筆者 tomcat 端口號設置的是 9999,在 Test2 項目中進行測試)。
7、applet 請求服務器 servlet 得到 JasperPrint 對象並打印。源碼:
- package com.defonds.test;
- import java.applet.Applet;
- import java.io.PrintWriter;
- import java.io.StringWriter;
- import java.net.URL;
- import javax.swing.JOptionPane;
- import net.sf.jasperreports.engine.JasperPrint;
- import net.sf.jasperreports.engine.JasperPrintManager;
- import net.sf.jasperreports.engine.util.JRLoader;
- public class JRPrinterApplet extends javax.swing.JApplet
- {
- /**
- *
- */
- private URL url = null;
- private JasperPrint jasperPrint = null;
- /** Creates new form AppletViewer */
- public JRPrinterApplet()
- {
- }
- /**
- *
- */
- public void init()
- {
- // String strUrl = getParameter("REPORT_URL");
- String strUrl = "http://localhost:9999/Test2/testServlet3";
- if (strUrl != null)
- {
- try
- {
- //url = new URL(getCodeBase(), strUrl);
- URL urll = new URL("http://localhost:9999/Test2/testServlet3");
- url = urll;
- System.out.println("url="+urll);
- }
- catch (Exception e)
- {
- StringWriter swriter = new StringWriter();
- PrintWriter pwriter = new PrintWriter(swriter);
- e.printStackTrace(pwriter);
- JOptionPane.showMessageDialog(this, swriter.toString());
- }
- }
- else
- {
- JOptionPane.showMessageDialog(this, "init():Source URL not specified");
- }
- }
- public void start() {
- if (url != null)
- {
- if (jasperPrint == null)
- {
- try
- {
- System.out.println("進入start方法,即將下載pdf文件");
- jasperPrint = (JasperPrint)JRLoader.loadObject(url);
- System.out.println("進入start方法,下載pdf文件完畢");
- }
- catch (Exception e)
- {
- StringWriter swriter = new StringWriter();
- PrintWriter pwriter = new PrintWriter(swriter);
- e.printStackTrace(pwriter);
- JOptionPane.showMessageDialog(this, swriter.toString());
- }
- }
- if (jasperPrint != null)
- {
- final JasperPrint print = jasperPrint;
- Thread thread = new Thread
- (
- new Runnable()
- {
- public void run()
- {
- try
- {
- System.out.println("進入start方法,即將打印pdf文件");
- JasperPrintManager.printReport(print, true);
- }
- catch (Exception e)
- {
- StringWriter swriter = new StringWriter();
- PrintWriter pwriter = new PrintWriter(swriter);
- e.printStackTrace(pwriter);
- JOptionPane.showMessageDialog(null, swriter.toString());
- }
- }
- }
- );
- thread.start();
- }
- else
- {
- JOptionPane.showMessageDialog(this, "Empty report.");
- }
- }
- else
- {
- JOptionPane.showMessageDialog(this, "start():Source URL not specified");
- }
- }
- }
右鍵單擊 JRPrinterApplet.java,選擇 “Run as Java Applet”,彈出打印對話框,確認後打印機正常打印,證明 applet 已經編寫成功。
8、jsp 頁面嵌入 applet源碼:
- <%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <base href="<%=basePath%>">
- <title>My JSP 'index.jsp' starting page</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
- <meta http-equiv="description" content="This is my page">
- <!--
- <link rel="stylesheet" type="text/css" href="styles.css" mce_href="styles.css">
- -->
- </head>
- <mce:script language="javascript"><!--
- function openApp()
- {
- var url = "/JRPrintServlet";
- document.write('<APPLET ID="JrPrt" CODE="com.defonds.test.JRPrinterApplet.class" CODEBASE = "./" ARCHIVE = "reportprint.jar" WIDTH = "0" HEIGHT = "0">');
- document.write('<PARAM NAME = "type" VALUE="application/x-java-applet;version=1.2.2">');
- document.write('<PARAM NAME = "scriptable" VALUE="false">');
- document.write('<PARAM NAME = "REPORT_URL" VALUE ="'+url+'">');
- document.write('</APPLET>');
- }
- // --></mce:script>
- <body bgcolor="#FFFFFF">
- <input type="button" value="測試打印" onclick="openApp();">
- </body>
- </html>