历史版本1 :从数据库读取报表 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

上一节中我们已经将cpt模板保存入库了,当需要访问报表的时候,我们便可以从数据库中根据报表名称取出报表,不需要再保存为cpt模板,可以直接转为网络报表,在Web浏览器中进行访问。例如在浏览器中输入

http://localhost:8075/WebReport/ReportServer?reportlet=com.fr.demo.ReadFromDatabase&cptname=gettingstarted.cpt,就可以读出上一节中保存的模板了。
若您修改参数cptname的值,就可以查看数据库中不同的报表。

1. 实现步骤编辑

1.1 编写读取模板程序
新建类ReadFromDatabase,继承com.fr.web.Reportlet抽象类,并实现public Report createReport(ReportletRequest reportletRequest)方法。完整代码如下
package com.fr.demo;          import java.io.InputStream;     import java.sql.Blob;     import java.sql.Connection;     import java.sql.DriverManager;     import java.sql.ResultSet;     import java.sql.Statement;   import java.util.Map;      import com.fr.base.Env;   import com.fr.base.FRContext;   import com.fr.main.TemplateWorkBook;   import com.fr.main.impl.WorkBook;   import com.fr.web.core.Reportlet;   import com.fr.web.request.ReportletRequest;           public class ReadFromDatabase extends Reportlet {         public TemplateWorkBook createReport(ReportletRequest reportletRequest) {             Env oldEnv = FRContext.getCurrentEnv();              WorkBook workbook = new WorkBook();             String name = reportletRequest.getParameter("cptname").toString();             try {                 // 定义数据连接                 String driver = "com.mysql.jdbc.Driver";                 String url = "jdbc:mysql://192.168.100.252:3306/test?useUnicode=true&characterEncoding=gbk";                 String user = "root";                 String pass = "mysql252";                 Class.forName(driver);                 Connection conn = DriverManager.getConnection(url, user, pass);                 // 从数据库中读模板                 String sql = "select cpt from test.report1 where cptname = '" + name                         + "'";                 Statement smt = conn.createStatement();                 ResultSet rs = smt.executeQuery(sql);                 while (rs.next()) {                     Blob blob = rs.getBlob(1); // 取第一列的值,即cpt列                     FRContext.getLogger().info(blob.toString());                   InputStream ins = blob.getBinaryStream();                     workbook.readStream(ins);                 }             } catch (Exception e) {                 e.printStackTrace();             }             return workbook;         }          @Override       public void setParameterMap(Map arg0) {           // TODO Auto-generated method stub                  }          @Override       public void setTplPath(String arg0) {           // TODO Auto-generated method stub                  }     }   
注:最新的代码链接
1.2 发布并访问

编译源文件,将编译后的ReadFromDatabase.class类放至应用目录WEB-INF\classes\com\fr\demo下,启动服务器,输入地址http://localhost:8075/WebReport/ReportServer?reportlet=com.fr.demo.ReadFromDatabase&cptname=gettingstarted.cpt,就可以看到报表结果了。