「Birt」BIRT使用API进行简单部署

在网上查了下BIRT的文章,不是很多。而且讲述的也不是十分全面。还是得自己琢磨啊。
刚实验好,贴上来分享一下共同交流。希望也能帮助到对API部署还困惑的人。
做这个纯粹是看官网上的例子,还有好多疑点,希望高手能给我解答下。
首先,这个API部署其实在官网上是叫"Servlet Example"。我没有在网上找到中文的这个教程,所以我就以我这贫乏的英语水品来自己理解了官网上的步骤。下面直接开始,我不是原文翻译的所以有些地方用词不当也是正常。
既然是个Servlet Exampl那么它肯定符合Java EE的规范。我先把目录结构贴到下面,让大家先有个整体感觉。

图片不是很清楚,凑合着看吧。
我先说下目录结构Tomcat和Webapps就不说了。下面就是自己新建一个自己的文件夹在tomcat/webapps下面是自己的API BIRT的项目。名字自己起就好了,官网上是叫WebReport吧,上面写的很清楚了。我自己是叫TestAPI   
ImagesReports是用来放报表的地方,Images是图片和图像报表,然后Reports是文字报表。就是把自己建好的报表copy到 Reports里面。具体建报表就不说了,自带的帮助文档和网上有很多资料。下面就是WEB-INF目录了,建立好这个目录,你的API所有配置和用的资源才可以发动。在WEB-INF下面的lib没用过也知道是放jar的地方。还有一个platform也是放一些报表运行所需的配置信息和一些jar。其实我们都知道上面图其实应该在WEB-INF下面还有个classes文件夹,用来放编译好的java文件。这也是个重要的目录。上面没有画。
官网上是分了五步,我这里就按自己的来了,也不说分步了。
首先也是需要一个runtime从http://www.eclipse.org/downloads/download.php?file=/birt/downloads/drops/R-R1-2_1_3-200707051847/birt-runtime-2.1.3.zip你可以下载到这个“runtime”不是很大。下载好以后打开,然后进入ReportEngine目录把lib里的所有jar包全部拷贝到自己建立的lib下面,如图



然后开始往platform里面塞东西。把runtime/ReportEngine的两个文件夹(plugins和configuration)拷贝到你自己的platform里面。
plugins里面也是一些报表所需的jar而configuration里面是什么东西?就是一个config.ini文件,我不知道是干什么用的。
拷完之后如下:


如果你的报表用到数据库驱动了,必须把数据库驱动文件拷贝到/WEB-INF/platform/plugins/org.eclipse.birt.report.data.oda.jdbc_2.1.1.v20070705-1847/drivers这个路径下面,看着长其实不难找。
拷贝完是这样,贴个图:


配置就差不多了,就查一个web.xml文件了。
下面是比较重要的东西。有三个文件。是API的核心操作文件。
就是上面三个文件是官网的原文,我拷贝过来的。
第一个是构造报表引擎的资源文件。
第二个用来初始化报表引擎的类。
第三个用GET方法来调用报表。
我英文不好,自己理解是这样的。(四级我都没考,我觉得找个美国人待上一个月英语水平就上去了)
具体这三个文件的代码我贴到下面
BirtConfig.properties

  • BirtConfig.properties - Configuration properties for the Engine.
  • BirtEngine.java - Class used to initialize the Report Engine.
  • WebReport.java - The servlet that handles report generation on a GET command.

     

     

     

    logDirectory = c: / temp
    logLevel
    = FINEST

     


    BirtEngine.java

     

    import  java.io.InputStream;
    import  java.io.IOException;
    import  java.util.Properties;
    import  java.util.logging.Level;

    import  org.eclipse.birt.report.engine.api.EngineConfig;
    import  org.eclipse.birt.report.engine.api.IReportEngine;
    import  javax.servlet. * ;
    import  org.eclipse.birt.core.framework.PlatformServletContext;
    import  org.eclipse.birt.core.framework.IPlatformContext;
    import   org.eclipse.birt.core.framework.Platform;
    import  org.eclipse.birt.core.exception.BirtException;
    import  org.eclipse.birt.report.engine.api.IReportEngineFactory;

    public   class  BirtEngine  {

    private static IReportEngine birtEngine = null;

    private static Properties configProps = new Properties();

    private final static String configFile = "BirtConfig.properties";

    public static synchronized void initBirtConfig() {
     loadEngineProps();
    }


    public static synchronized IReportEngine getBirtEngine(ServletContext sc) {
     
    if (birtEngine == null
     
    {
      EngineConfig config 
    = new EngineConfig();
      
    if( configProps != null){
       String logLevel 
    = configProps.getProperty("logLevel");
       Level level 
    = Level.OFF;
       
    if ("SEVERE".equalsIgnoreCase(logLevel)) 
       
    {
        level 
    = Level.SEVERE;
       }
     else if ("WARNING".equalsIgnoreCase(logLevel))
       
    {
        level 
    = Level.WARNING;
       }
     else if ("INFO".equalsIgnoreCase(logLevel)) 
       
    {
        level 
    = Level.INFO;
       }
     else if ("CONFIG".equalsIgnoreCase(logLevel))
       
    {
        level 
    = Level.CONFIG;
       }
     else if ("FINE".equalsIgnoreCase(logLevel)) 
       
    {
        level 
    = Level.FINE;
      }
     else if ("FINER".equalsIgnoreCase(logLevel)) 
       
    {
        level 
    = Level.FINER;
       }
     else if ("FINEST".equalsIgnoreCase(logLevel)) 
       
    {
        level 
    = Level.FINEST;
       }
     else if ("OFF".equalsIgnoreCase(logLevel)) 
       
    {
        level 
    = Level.OFF;
       }


       config.setLogConfig(configProps.getProperty(
    "logDirectory"), level);
      }


      config.setEngineHome(
    "");
      IPlatformContext context 
    = new PlatformServletContext( sc );
      config.setPlatformContext( context );


      
    try
      
    {
       Platform.startup( config );
      }

      
    catch ( BirtException e )
      
    {
       e.printStackTrace( );
      }


      IReportEngineFactory factory 
    = (IReportEngineFactory) Platform
      .createFactoryObject( IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY );
      birtEngine 
    = factory.createReportEngine( config );


     }

     
    return birtEngine;
    }


    public static synchronized void destroyBirtEngine() {
     
    if (birtEngine == null{
      
    return;
     }
      
     birtEngine.shutdown();
     Platform.shutdown();
     birtEngine 
    = null;
    }


    public Object clone() throws CloneNotSupportedException {
     
    throw new CloneNotSupportedException();
    }


    private static void loadEngineProps() {
     
    try {
      
    //Config File must be in classpath
      ClassLoader cl = Thread.currentThread ().getContextClassLoader();
      InputStream in 
    = null;
      in 
    = cl.getResourceAsStream (configFile);
      configProps.load(in);
      in.close();


     }
     catch (IOException e) {
      e.printStackTrace();
     }


    }


    }

     


    WebReport.java

     

    import  java.io.IOException;
    import  java.io.PrintWriter;
    import  java.util.HashMap;
    import  java.util.logging.Level;
    import  java.util.logging.Logger;

    import  javax.servlet.ServletContext;
    import  javax.servlet.ServletException;
    import  javax.servlet.http.HttpServlet;
    import  javax.servlet.http.HttpServletRequest;
    import  javax.servlet.http.HttpServletResponse;

    import  org.eclipse.birt.report.engine.api.EngineConstants;
    import  org.eclipse.birt.report.engine.api.HTMLRenderContext;
    import  org.eclipse.birt.report.engine.api.HTMLRenderOption;
    import  org.eclipse.birt.report.engine.api.IReportRunnable;
    import  org.eclipse.birt.report.engine.api.IRunAndRenderTask;
    import  org.eclipse.birt.report.engine.api.IReportEngine;


    public   class  WebReport  extends  HttpServlet  {

    /** *//**
     * 
     
    */

    private static final long serialVersionUID = 1L;
    /** *//**
     * Constructor of the object.
     
    */

    private IReportEngine birtReportEngine = null;
    protected static Logger logger = Logger.getLogger( "org.eclipse.birt" );

    public WebReport() {
     
    super();
    }


    /** *//**
     * Destruction of the servlet. 
     
    */

    public void destroy() {
     
    super.destroy(); 
     BirtEngine.destroyBirtEngine();
    }



    /** *//**
     * The doGet method of the servlet. 
     *
     
    */

    public void doGet(HttpServletRequest req, HttpServletResponse resp)
      
    throws ServletException, IOException {

     
    //get report name and launch the engine
     resp.setContentType("text/html");
     
    //resp.setContentType( "application/pdf" ); 
     
    //resp.setHeader ("Content-Disposition","inline; filename=test.pdf");  
     String reportName = req.getParameter("ReportName");
     ServletContext sc 
    = req.getSession().getServletContext();
     
    this.birtReportEngine = BirtEngine.getBirtEngine(sc);
     
     
    //setup image directory
     HTMLRenderContext renderContext = new HTMLRenderContext();
     renderContext.setBaseImageURL(req.getContextPath()
    +"/images");
     renderContext.setImageDirectory(sc.getRealPath(
    "/images"));
     
     logger.log( Level.FINE, 
    "image directory " + sc.getRealPath("/images"));  
     System.out.println(
    "stdout image directory " + sc.getRealPath("/images"));
     
     HashMap
    <String, HTMLRenderContext> contextMap = new HashMap<String, HTMLRenderContext>();
     contextMap.put( EngineConstants.APPCONTEXT_HTML_RENDER_CONTEXT, renderContext );
     
     IReportRunnable design;
     
    try
     
    {
      
    //Open report design
      design = birtReportEngine.openReportDesign( sc.getRealPath("/Reports")+"/"+reportName );
      
    //create task to run and render report
      IRunAndRenderTask task = birtReportEngine.createRunAndRenderTask( design );  
      task.setAppContext( contextMap );
      
      
    //set output options
      HTMLRenderOption options = new HTMLRenderOption();
      options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_HTML);
      
    //options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_PDF);
      options.setOutputStream(resp.getOutputStream());
      task.setRenderOption(options);
      
      
    //run report
      task.run();
      task.close();
     }
    catch (Exception e){
      
      e.printStackTrace();
      
    throw new ServletException( e );
     }

    }


    /** *//**
     * The doPost method of the servlet. 
     *
     
    */

    public void doPost(HttpServletRequest request, HttpServletResponse response)
      
    throws ServletException, IOException {

    this.doGet(request,response);

    /** *//**
     * Initialization of the servlet. 
     *
     * 
    @throws ServletException if an error occure
     
    */

    public void init() throws ServletException {
     BirtEngine.initBirtConfig();
     
    }


    }

     


    官网上还有2.2版本WebReport.java的代码,我反正没用上。您要有用上的可以去试试。
    这三个文件弄好了就ok了。官网上还罗嗦一大堆是在Eclipse下开发要加什么插件什么插件的其实就是加上Servlet支持的就行。我没有用纯Eclipse开发所以直接编译好这两个java,连同拷贝上那个BirtConfig.properties资源文件到自己的WEB-INF/classes下面就行了。

    这下好了,就只有配置你的servlet了。
    在WEB-INF下面建立一个web.xml文件,配置一下这个webreport的servlet
    代码:

     

    <? xml version="1.0" encoding="UTF-8" ?>  
    < web-app  version ="2.4"  
    xmlns
    ="http://java.sun.com/xml/ns/j2ee"  
    xmlns:xsi
    ="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation
    ="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    >  
    < servlet >  
    < servlet-name > WebReport </ servlet-name >  
    < servlet-class > WebReport </ servlet-class >  
    </ servlet >  
    < servlet-mapping >  
    < servlet-name > WebReport </ servlet-name >  
    < url-pattern > /webReport </ url-pattern >  
    </ servlet-mapping >  
    </ web-app >  

     


    最后,把自己做好的报表放到自己项目下面的reports(这是个复数的s)里面就好,这个目录不能错的,在servlet里面是要找这个目录的。
    很简单,然后自己再写一个自己的jsp就ok了
    原来的WebReport.java文件的doPost方法里什么都没有的,如果自己的jsp通过post传递的话不会显示出来报表。我上面吧post里面调用get了。
    这下就全部OK了。
    下面我的这个小jsp给大家参考。

     

    <% @ page language="java" import="java.util.*" pageEncoding="gb2312" %>  
    < html >  
    < head >  
    </ head >  

    < body >  
    < form  name ="theform"  action ="webReport"  method ="post" >  
    < table >  
    < tr >  
    < td > TestReport.rptdesign </ td >  
    < td >< input  name ="ReportName"  type ="text" ></ td >  
    < td >< button  type ="submit" > 走你 </ button ></ td >  
    </ tr >  
    </ table >  
    </ form >  
    </ body >  
    </ html >  

     


    OK在输入框里面填写你的报表名称,记得要带扩展名。

  • 转载自:http://www.blogjava.net/leweslove/articles/leweslove.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值