JasperReport+iReport+Applet+Servlet制作报表

转载:http://gddzmr.iteye.com/blog/192536

关联:http://zmx.iteye.com/blog/572812

项目是B/S的,标示层使用的是Openlaszlo,客户要求在打印的时候不需要选择打印的纸张类型,报表显示就直接打印,所以我在客户做了一个小应用程序。

需要的jar有:msbase.jar;mssqlserver.jar;msutil.jar;jasperreports-2.0.5-applet.jar;

jasperreports-1.3.3.jar;jasperreports-2.0.5-javaflow.jar

需要使用Ireport设计模板,放在reports目录下,载入*.jasper文件

Java代码   收藏代码
  1. <%@ page contentType="text/html;charset=UTF-8"%>  
  2. <%@page import="java.util.Enumeration"%>  
  3. <%@page import="java.net.URLDecoder"%>  
  4. <%  
  5.    String sql = request.getParameter("sql");  
  6.    sql="select * from authors";  
  7.    System.out.println("viewer.jsp  =========:"+sql);  
  8.   // System.out.println("viewer.jsp  =========:"+new String(condition.getBytes("ISO8859_1"),"UTF-8"));  
  9. %>  
  10. <html>  
  11.     <head>  
  12.     </head>  
  13.     <body>  
  14.         <!--"CONVERTED_APPLET"-->  
  15.         <!-- HTML CONVERTER -->  
  16.         <object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"  
  17.             codebase="http://java.sun.com/update/1.5.0/jinstall-1_5-windows-i586.cab#Version=5,0,0,5"  
  18.             WIDTH="100%" HEIGHT="100%">  
  19.             <PARAM NAME=CODE VALUE="ViewerApplet.class">  
  20.             <param name="scriptable" value="false">  
  21.             <PARAM NAME=CODEBASE VALUE="applet">  
  22.             <PARAM NAME=ARCHIVE  
  23.                 VALUE="jasperreports-2.0.5-javaflow.jar,jasperreports-2.0.5-applet.jar,commons-collections-3.1.jar">  
  24.             <param name="type" value="application/x-java-applet;version=1.5">  
  25.             <PARAM NAME="sql" VALUE="<%=sql%>">  
  26.             <comment>  
  27.             <embed type="application/x-java-applet;version=1.5"  
  28.                 \  
  29.             ARCHIVE="jasperreports-2.0.5-javaflow.jar,jasperreports-2.0.5-applet.jar,commons-collections-3.1.jar"  
  30.                 \  
  31.             WIDTH="100%"   
  32.                 \  
  33.             HEIGHT="100%"  
  34.                 \  
  35.             CODE="ViewerApplet.class"  
  36.                 \  
  37.             CODEBASE="applet"  
  38.                 \  
  39.             ARCHIVE="jasperreports-2.0.5-javaflow.jar,jasperreports-2.0.5-applet.jar,commons-collections-3.1.jar"  
  40.                 \  
  41.             scriptable="false"  
  42.                 \  
  43.             sql="<%=sql%>"  
  44.                 \  
  45.             scriptable=false  
  46.             pluginspage="http://java.sun.com/products/plugin/index.html#download">  
  47.                 <noembed>  
  48.                     </XMP>  
  49.                 </noembed>  
  50.             </embed>  
  51.             </comment>  
  52.         </object>  
  53.     </body>  
  54. </html>  

 做一个ViewerApplet的类,继承JApplet

Java代码   收藏代码
  1. import java.awt.BorderLayout;  
  2. import java.io.PrintWriter;  
  3. import java.io.StringWriter;  
  4. import java.net.URL;  
  5. import java.net.URLEncoder;  
  6.   
  7. import javax.swing.JApplet;  
  8. import javax.swing.JOptionPane;  
  9.   
  10. import net.sf.jasperreports.engine.JasperPrint;  
  11. import net.sf.jasperreports.engine.util.JRLoader;  
  12. import net.sf.jasperreports.view.JRViewer;  
  13.   
  14. public class ViewerApplet extends JApplet {  
  15.   
  16.     public ViewerApplet() {  
  17.         initComponents();  
  18.     }  
  19.   
  20.     private javax.swing.JPanel pnlMain;  
  21.   
  22.     public void init() {  
  23.   
  24.         try {  
  25.             //获取viewer.jsp的sql参数  
  26.             String sql = getParameter("sql");  
  27.             //使用URLEncoder对sql语句进行encode  
  28.             sql = URLEncoder.encode(sql, "UTF-8");  
  29.             //提交到servlet,使用servlet访问服务器端数据  
  30.             URL url = new URL(getCodeBase(), "../servlet/appletServlet?sql="  
  31.                     + sql);  
  32.             if (url != null) {  
  33.                 //获取服务器的传递过来的JasperPrint对象  
  34.                 JasperPrint jasperPrint = (JasperPrint) JRLoader  
  35.                         .loadObject(url);  
  36.                 //创建一个JRViewer  
  37.                  JRViewer viewer = new JRViewer(jasperPrint);  
  38.                  this.pnlMain.add(viewer, BorderLayout.CENTER);  
  39.             }  
  40.         } catch (Exception e) {  
  41.             StringWriter swriter = new StringWriter();  
  42.             PrintWriter pwriter = new PrintWriter(swriter);  
  43.             e.printStackTrace(pwriter);  
  44.             JOptionPane.showMessageDialog(this, swriter.toString());  
  45.         }  
  46.     }  
  47.   
  48.     private void initComponents() {// GEN-BEGIN:initComponents  
  49.         pnlMain = new javax.swing.JPanel();  
  50.         pnlMain.setLayout(new java.awt.BorderLayout());  
  51.         getContentPane().add(pnlMain, java.awt.BorderLayout.CENTER);  
  52.     }  
  53.   
  54. }  

 创建一个AppletServlet类

Java代码   收藏代码
  1. package com.gddzmr.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.ObjectOutputStream;  
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.ServletOutputStream;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. import com.gddzmr.applet.ViewerService;  
  12.   
  13. import net.sf.jasperreports.engine.JasperPrint;  
  14.   
  15. public class AppletServlet extends HttpServlet {  
  16.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  17.             throws ServletException, IOException {  
  18.   
  19.         doPost(request, response);  
  20.     }  
  21.        
  22.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  23.             throws ServletException, IOException {  
  24.   
  25.         try {  
  26.             //获取一个sql参数  
  27.             String sql = request.getParameter("sql");  
  28.               
  29.             ViewerService service = new ViewerService();  
  30.             //获取JasperPrint对象  
  31.             JasperPrint jasperPrint = service.getJasper(request  
  32.                     .getRealPath("/"), sql);  
  33.             //将JasperPrint转化为ObjectOutputStream数据流输出  
  34.             response.setContentType("application/octet-stream");  
  35.             ServletOutputStream out = response.getOutputStream();  
  36.             ObjectOutputStream os = new ObjectOutputStream(out);  
  37.             os.writeObject(jasperPrint);  
  38.             os.flush();  
  39.             os.close();  
  40.         } catch (Exception e) {  
  41.             e.printStackTrace();  
  42.         }  
  43.     }  
  44.   
  45. }  

创建;AppletService类,用于获取JasperPrint对象

Java代码   收藏代码
  1. package com.gddzmr.applet;  
  2.   
  3. import java.sql.ResultSet;  
  4. import java.util.ArrayList;  
  5. import java.util.Collection;  
  6. import java.util.HashMap;  
  7. import java.util.List;  
  8. import java.util.Map;  
  9.   
  10. import com.gddzmr.db.DBManager;  
  11.   
  12. import net.sf.jasperreports.engine.JasperFillManager;  
  13. import net.sf.jasperreports.engine.JasperPrint;  
  14. import net.sf.jasperreports.engine.data.JRMapCollectionDataSource;  
  15.   
  16. public class ViewerService {  
  17.     DBManager db = new DBManager();  
  18.   
  19.     public JasperPrint getJasper(String realpath, String sql) throws Exception {  
  20.         db.openDB();  
  21.         //查询结果集  
  22.         ResultSet rs = db.executeQuery(sql);  
  23.         db.closeSTDB();  
  24.         //将ResultSet转化为一个List<HashMap>数组  
  25.         List list = db.getMapList(rs);  
  26.         Collection rows = list;  
  27.         //获取一个JasperPrint对象  
  28.         JasperPrint jasperPrint = setReportCollection(realpath  
  29.                 + "\\reports\\inboundReport.jasper", rows);  
  30.         return jasperPrint;  
  31.     }  
  32.   
  33.     /** 
  34.      * 获取JasperPrint对象 
  35.      *  
  36.      * @param url 
  37.      * @param list 
  38.      * @return 
  39.      * @throws Exception 
  40.      */  
  41.     public JasperPrint setReportCollection(String url, Collection list)  
  42.             throws Exception {  
  43.   
  44.         Map parameters = new HashMap();  
  45.         JRMapCollectionDataSource dataSource;  
  46.         //将list数据集转换为JRMapCollectionDataSource  
  47.         dataSource = new JRMapCollectionDataSource(list);  
  48.         //使用JasperFillManager填充JasperPrint对象  
  49.         JasperPrint jasperPrint = JasperFillManager.fillReport(url, parameters,  
  50.                 dataSource);  
  51.         return jasperPrint;  
  52.     }  
  53. }  

 最后创建一个DBManager获取数据

Java代码   收藏代码
  1. package com.gddzmr.db;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5. import java.sql.PreparedStatement;  
  6. import java.sql.ResultSet;  
  7. import java.sql.ResultSetMetaData;  
  8. import java.sql.SQLException;  
  9. import java.sql.Statement;  
  10. import java.util.ArrayList;  
  11. import java.util.HashMap;  
  12. import java.util.List;  
  13.   
  14. public class DBManager {  
  15.     private String driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver";  
  16.   
  17.     private String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";  
  18.   
  19.     private String user = "sa";  
  20.   
  21.     private String password = "";  
  22.   
  23.     private Connection cnn;  
  24.   
  25.     private Statement stat;  
  26.   
  27.     private PreparedStatement ps;  
  28.   
  29.     public DBManager() {  
  30.     }  
  31.   
  32.     /** 
  33.      * 新建一个数据库连接 
  34.      *  
  35.      */  
  36.     public void openDB() {  
  37.         try {  
  38.   
  39.             // 加载数据连接驱动  
  40.             Class.forName(driverName);  
  41.             // 获取数据库连接  
  42.             cnn = DriverManager.getConnection(url, user, password);  
  43.         } catch (Exception e) {  
  44.             // TODO Auto-generated catch block  
  45.             e.printStackTrace();  
  46.         }  
  47.     }  
  48.   
  49.     /** 
  50.      * Statement执行查询语句,返回查询的结果集 
  51.      *  
  52.      * @param sql 
  53.      * @return 
  54.      */  
  55.     public ResultSet executeQuery(String sql) {  
  56.         try {  
  57.             stat = cnn.createStatement();  
  58.             return stat.executeQuery(sql);  
  59.         } catch (SQLException e) {  
  60.             // TODO Auto-generated catch block  
  61.             e.printStackTrace();  
  62.         }  
  63.         return null;  
  64.     }  
  65.   
  66.     /** 
  67.      * Statement执行update,insert,delete语句,返回影响的行数 
  68.      *  
  69.      * @param sql 
  70.      * @return 
  71.      */  
  72.     public int executeUpdate(String sql) {  
  73.         try {  
  74.             stat = cnn.createStatement();  
  75.             return stat.executeUpdate(sql);  
  76.         } catch (SQLException e) {  
  77.             // TODO Auto-generated catch block  
  78.             e.printStackTrace();  
  79.         }  
  80.         return 0;  
  81.     }  
  82.   
  83.     /** 
  84.      * Statement执行存储过程,返回ture/false 
  85.      *  
  86.      * @param sql 
  87.      * @return 
  88.      */  
  89.     public boolean executeProcedural(String sql) {  
  90.         try {  
  91.             stat = cnn.createStatement();  
  92.             return stat.execute(sql);  
  93.         } catch (SQLException e) {  
  94.             // TODO Auto-generated catch block  
  95.             e.printStackTrace();  
  96.         }  
  97.         return false;  
  98.     }  
  99.   
  100.     /** 
  101.      * prepareStatement执行查询语句,返回查询的结果集 
  102.      *  
  103.      * @param sql 
  104.      * @param list 
  105.      * @return 
  106.      */  
  107.     public ResultSet executeQuery(String sql, List list) {  
  108.         try {  
  109.             ps = cnn.prepareStatement(sql);  
  110.             if (list.size() != 0 && list != null) {  
  111.                 for (int i = 0; i < list.size(); i++) {  
  112.                     ps.setObject(i + 1, list.get(i));  
  113.                 }  
  114.             }  
  115.             return ps.executeQuery(sql);  
  116.         } catch (SQLException e) {  
  117.             // TODO Auto-generated catch block  
  118.             e.printStackTrace();  
  119.         }  
  120.         return null;  
  121.     }  
  122.   
  123.     /** 
  124.      * prepareStatement执行update,insert,delete语句,返回影响的行数 
  125.      *  
  126.      * @param sql 
  127.      * @param list 
  128.      * @return 
  129.      */  
  130.     public int executeUpdate(String sql, List list) {  
  131.         try {  
  132.             ps = cnn.prepareStatement(sql);  
  133.             if (list.size() != 0 && list != null) {  
  134.                 for (int i = 0; i < list.size(); i++) {  
  135.                     ps.setObject(i + 1, list.get(i));  
  136.                 }  
  137.             }  
  138.             return ps.executeUpdate(sql);  
  139.         } catch (SQLException e) {  
  140.             // TODO Auto-generated catch block  
  141.             e.printStackTrace();  
  142.         }  
  143.         return 0;  
  144.     }  
  145.   
  146.     /** 
  147.      * prepareStatement执行存储过程,返回ture/false 
  148.      *  
  149.      * @param sql 
  150.      * @param list 
  151.      * @return 
  152.      */  
  153.     public boolean executeProcedural(String sql, List list) {  
  154.         try {  
  155.             ps = cnn.prepareStatement(sql);  
  156.             if (list.size() != 0 && list != null) {  
  157.                 for (int i = 0; i < list.size(); i++) {  
  158.                     ps.setObject(i + 1, list.get(i));  
  159.                 }  
  160.             }  
  161.             return ps.execute(sql);  
  162.         } catch (SQLException e) {  
  163.             // TODO Auto-generated catch block  
  164.             e.printStackTrace();  
  165.         }  
  166.         return false;  
  167.     }  
  168.   
  169.     /** 
  170.      * 关闭数据库连接,释放statment 
  171.      *  
  172.      */  
  173.     public void closeSTDB() {  
  174.         try {  
  175.             stat.close();  
  176.             cnn.close();  
  177.         } catch (SQLException e) {  
  178.             // TODO Auto-generated catch block  
  179.             e.printStackTrace();  
  180.         }  
  181.   
  182.     }  
  183.   
  184.     /** 
  185.      * 关闭数据库连接,释放PreparedStatement 
  186.      *  
  187.      */  
  188.     public void closePSDB() {  
  189.         try {  
  190.             ps.close();  
  191.             cnn.close();  
  192.         } catch (SQLException e) {  
  193.             // TODO Auto-generated catch block  
  194.             e.printStackTrace();  
  195.         }  
  196.     }  
  197.   
  198.     /** 
  199.      * 将ResultSet结果集,转换为List<HashMap>,为创建jasperPrint做准备 
  200.      * @param rs 
  201.      * @return 
  202.      */  
  203.     public List getMapList(ResultSet rs) {  
  204.         ArrayList<HashMap> list = new ArrayList<HashMap>();  
  205.         ArrayList<String> nameList = new ArrayList<String>();  
  206.         try {  
  207.             // 获取字段名的数组  
  208.             ResultSetMetaData md = rs.getMetaData();  
  209.             for (int i = 1; i <= md.getColumnCount(); i++) {  
  210.                 nameList.add(md.getColumnName(i));  
  211.             }  
  212.             // 根据字段名,获取rs中字段的值  
  213.             if (rs != null) {  
  214.                 while (rs.next()) {  
  215.                     HashMap map = new HashMap();  
  216.                     for (int i = 0; i < nameList.size(); i++) {  
  217.                         map.put(nameList.get(i), rs.getObject(nameList.get(i)));  
  218.                     }  
  219.                     list.add(map);  
  220.                 }  
  221.             }  
  222.   
  223.         } catch (SQLException e) {  
  224.             // TODO Auto-generated catch block  
  225.             e.printStackTrace();  
  226.         }  
  227.         return list;  
  228.     }  
  229.   
  230.     public static void main(String[] args) {  
  231.         DBManager db = new DBManager();  
  232.         db.openDB();  
  233.         ResultSet rs = db.executeQuery("select * from authors");  
  234.         ArrayList<HashMap> list = new ArrayList<HashMap>();  
  235.         ArrayList<String> nameList = new ArrayList<String>();  
  236.         try {  
  237.             // 获取字段名数组  
  238.             ResultSetMetaData md = rs.getMetaData();  
  239.             for (int i = 1; i <= md.getColumnCount(); i++) {  
  240.                 nameList.add(md.getColumnName(i));  
  241.             }  
  242.   
  243.             if (rs != null) {  
  244.                 while (rs.next()) {  
  245.                     HashMap map = new HashMap();  
  246.                     for (int i = 0; i < nameList.size(); i++) {  
  247.                         System.out.println(nameList.get(i) + "===="  
  248.                                 + rs.getObject(nameList.get(i)));  
  249.                         map.put(nameList.get(i), rs.getObject(nameList.get(i)));  
  250.                     }  
  251.                     list.add(map);  
  252.                 }  
  253.             }  
  254.   
  255.         } catch (SQLException e) {  
  256.             // TODO Auto-generated catch block  
  257.             e.printStackTrace();  
  258.         }  
  259.         db.closeSTDB();  
  260.   
  261.     }  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值