`
hjoo
  • 浏览: 74723 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Birt的Servlet扩展

    博客分类:
  • Birt
阅读更多
由于不想用Birt默认的Viewer,所以参考官方的例子用Servlet扩展了!

BirtEngine代码如下:
package com.yjga.birt;

import java.util.logging.Level;

import javax.servlet.ServletContext;

import org.eclipse.birt.core.exception.BirtException;
import org.eclipse.birt.core.framework.IPlatformContext;
import org.eclipse.birt.core.framework.Platform;
import org.eclipse.birt.core.framework.PlatformServletContext;
import org.eclipse.birt.report.engine.api.EngineConfig;
import org.eclipse.birt.report.engine.api.HTMLActionHandler;
import org.eclipse.birt.report.engine.api.HTMLEmitterConfig;
import org.eclipse.birt.report.engine.api.HTMLServerImageHandler;
import org.eclipse.birt.report.engine.api.IReportEngine;
import org.eclipse.birt.report.engine.api.IReportEngineFactory;

public class BirtEngine {

	private static IReportEngine birtEngine = null;

	public static synchronized void initBirtConfig() {
		
	}

	public static synchronized IReportEngine getBirtEngine(ServletContext sc) {
		
		EngineConfig config = new EngineConfig();
		config.setLogConfig(sc.getRealPath("/logs"), Level.FINE);
	
		config.setEngineHome("");
		IPlatformContext context = new PlatformServletContext(sc);
		config.setPlatformContext(context);
		
		//Register new image handler 解决了读取图片时的路径问题
		HTMLEmitterConfig emitterConfig = new HTMLEmitterConfig( );
		emitterConfig.setActionHandler( new HTMLActionHandler( ) );
		HTMLServerImageHandler imageHandler = new HTMLServerImageHandler( );
		emitterConfig.setImageHandler( imageHandler );
		config.getEmitterConfigs( ).put( "html", emitterConfig ); //-NLS-1$


		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();
	}

	
}


AjzsServlet代码如下:
package com.yjga.birt;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
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.IGetParameterDefinitionTask;
import org.eclipse.birt.report.engine.api.IParameterDefnBase;
import org.eclipse.birt.report.engine.api.IReportEngine;
import org.eclipse.birt.report.engine.api.IReportRunnable;
import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
import org.eclipse.birt.report.engine.api.IScalarParameterDefn;

import com.yjga.util.DateUtil;

public class AjzsServlet extends HttpServlet {

	
	private static final long serialVersionUID = 1L;
	private IReportEngine birtReportEngine = null;
	protected static Logger logger = Logger.getLogger("org.eclipse.birt");

	public AjzsServlet() {
		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 {

		HashMap parmDetails = new HashMap();

		
		// get report name and launch the engine
		resp.setContentType("text/html");
		// resp.setContentType( "application/pdf" );
		// resp.setHeader ("Content-Disposition","inline; filename=test.pdf");
		//得到参数并放入paramsList集合
		String reportName = req.getParameter("ReportName");
		String bm = new String(req.getParameter("bm").getBytes("ISO8859_1"),"GB2312");
		String sj1 = req.getParameter("sj1");
		String sj2 = req.getParameter("sj2");
		List paramsList = new ArrayList();
		if (bm != null && !bm.equals("") && !bm.equals("null"))
			paramsList.add(bm);
		paramsList.add(sj1);
		paramsList.add(sj2);
		
		ServletContext sc = req.getSession().getServletContext();
		this.birtReportEngine = BirtEngine.getBirtEngine(sc);
		
		// setup image directory
		HTMLRenderContext renderContext = new HTMLRenderContext();
		renderContext.setBaseImageURL(req.getContextPath() + "/report/images");
		renderContext.setImageDirectory(sc.getRealPath("/report/images"));

		//logger.log(Level.FINE, "image directory "
		//		+ sc.getRealPath("/report/images"));
		//System.out.println(renderContext.getBaseImageURL());
		//System.out.println(renderContext.getImageDirectory());

		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("/report")
					+ "/" + reportName);
			
			//以下是将报表里的参数和传递进来的参数匹配然后放到parmDetails集合中
			IGetParameterDefinitionTask taskParam = birtReportEngine.createGetParameterDefinitionTask( design );
			Collection params = taskParam.getParameterDefns( true );

			Iterator iter = params.iterator();
			Iterator iterList = paramsList.iterator();
			// Iterate over all parameters
			while ( iter.hasNext() && iterList.hasNext() )
			{
				IParameterDefnBase param = (IParameterDefnBase) iter.next( );
				// Parameters are not in a group
				IScalarParameterDefn scalar = (IScalarParameterDefn) param;
				if(scalar.getName().equals("bm")){
					String paramList = (String)iterList.next();
					parmDetails.put( scalar.getName(),paramList);
					//System.out.println(scalar.getName() + " " + paramList);
				}else{
					Date paramList = new Date();
					try{
						paramList = DateUtil.parse((String)iterList.next(),"yyyy-M-d");
					}catch(Exception e){
						e.printStackTrace();
					}
					parmDetails.put( scalar.getName(),paramList);
					//System.out.println(scalar.getName() + " " + paramList);
				}
			}
			taskParam.close();
			//
			
			// create task to run and render report
			IRunAndRenderTask task = birtReportEngine
					.createRunAndRenderTask(design);
			task.setAppContext(contextMap);
			task.setParameterValues(parmDetails);

			// 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 {
		
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		out.println(" Post does nothing");
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
		
	}

	/**
	 * Initialization of the servlet.
	 * @throws ServletException
	 *             if an error occure
	 */
	public void init() throws ServletException {
	}
}


web层只要把参数传递到Servlet即可,但这种扩展通用性还是很差的,代码也比较乱,有待进一步改进!
分享到:
评论

相关推荐

    thunderbird 邮件备份

    Thunderbird有多个扩展(如BackupBird、ExportImportTools等)可以帮助你更方便地备份邮件和设置。这些扩展通常提供一键备份、加密备份和定时备份等功能。 二、Thunderbird邮件导入导出 1. **导入备份文件** - *...

    Thunderbird的一套主题

    3. **Thunderbird扩展机制**:Thunderbird允许通过扩展(Extension)和主题(Theme)来增强其功能和外观。主题主要关注视觉设计,而扩展则可以添加新功能。开发者需要了解Thunderbird的XUL(XML User Interface ...

    quicktext:Thunderbird的扩展,可让您创建可轻松插入自己的电子邮件中的模板

    值得庆幸的是,他将Quicktext的许可证更改为MPL 2.0,因此我可以继续更新该扩展,并使其与最新版本的Thunderbird一起使用。 我将尽力使Quicktext继续前进,但是支持将受到限制。 您可以使用此存储库的来报告错误。...

    mozext:Mozilla Firefox和Mozilla Thunderbird的扩展插件

    Mozext Mozilla Firefox和Mozilla Thunderbird的扩展/附加组件请检查我的专用网站以获取更多详细信息: → 目录WebExtensions / MailExtensions | 请检查每个文件夹中的特定自述文件以获取构建说明。雷鸟 火狐浏览器...

    ThunderBird常用组件

    在ThunderBird中,有许多常用组件和扩展可以帮助用户提升邮件处理的效率和体验。以下将详细介绍这些组件及其功能。 1. Enigmail:这是一款用于ThunderBird的GPG(GNU Privacy Guard)插件,提供了加密和数字签名...

    thunderbird lightning1.9.1扩展

    为了支持linux下thunderbird的exchange的日历功能.

    Flappy bird资源.zip

    《Flappy Bird游戏资源与...进一步扩展到"小鸟大战"等更复杂的游戏,可以深化对Unity引擎的理解,提升游戏开发能力。无论你是零基础的新手,还是有一定经验的开发者,这个过程都将帮助你提升在游戏开发领域的专业技能。

    flappy_bird 素材资源

    《Flappy Bird游戏素材资源详解》 在游戏开发领域,Flappy Bird是一款极其经典且具有极高人气的小游戏,它的简洁设计和挑战性吸引了无数玩家。本资源包是针对这款热门游戏——Flappy Bird的素材资源集合,包含了...

    FlappyBird游戏源码

    《FlappyBird游戏源码解析》 FlappyBird是一款风靡全球的休闲小游戏,以其简单易上手的操作和高难度的挑战性吸引了大量玩家。本文将深入探讨cocos2dx和Unity两个版本的游戏源码,解析其背后的编程原理和技术实现。 ...

    flappyBird素材包

    《Flappy Bird游戏素材解析与应用》 Flappy Bird是一款风靡全球的休闲游戏,以其简单易上手的操作和极具挑战性的玩法深受玩家喜爱。在本文中,我们将深入探讨这款游戏中的一些关键素材,并通过提供的压缩包文件,...

    thunderbird exquilla23.1扩展(for linux)

    这是exquilla23.1的版本, 支持linux下的thunderbird使用微软Exchange

    flappy bird制作资源素材

    同时,开发者还可以根据自己的设计理念和需求,对这些素材进行修改和扩展,创造出独具特色的游戏界面。 总结,Flappy Bird的制作资源素材包为游戏开发者提供了制作此类游戏的基础元素,通过理解和运用这些素材,...

    flappybird图像音频资源包

    《Flappy Bird 图像音频资源解析》 在游戏开发领域,资源是构成游戏世界的基础,它们赋予游戏视觉和听觉的生动性。本资源包“flappybird图像音频资源包”便是针对经典游戏《Flappy Bird》而设计的,旨在为开发者...

    flappybird全套图片+音效

    《Flappy Bird游戏素材解析:图像与音效的全方位探讨》 Flappy Bird,这款曾经风靡全球的小游戏,以其简单却极具挑战性的玩法吸引了无数玩家。在学习游戏开发的过程中,掌握并理解游戏素材——尤其是图像和音效——...

    FlappyBird素材.zip

    《flappy bird》是一款由来自越南的独立游戏开发者Dong Nguyen所开发的作品,游戏于2013年5月24日上线,并在2014年2月突然暴红。2014年2月,《Flappy Bird》被开发者本人从苹果及谷歌应用商店撤下。2014年8月份正式...

    前端开源库-bluebird-co

    此外,Bluebird还提供了一些高级特性,如 promisification(将非Promise对象转换为Promise)、long stack traces(扩展错误堆栈跟踪)和cancellation(Promise取消)等,这些特性大大增强了Promise的实用性。...

    OpenCv制作的FlappyBird

    在这个名为“OpenCv制作的FlappyBird”的项目中,开发者利用OpenCV技术实现了一个经典游戏FlappyBird的版本。下面我们将详细探讨OpenCV在该项目中的应用以及相关知识点。 首先,我们要理解OpenCV的基本概念。OpenCV...

    flappy bird素材及源码

    《Flappy Bird游戏素材与源码解析》 Flappy Bird是一款简单却极具挑战性的移动平台游戏,由越南开发者Dong Nguyen开发。它以其独特的游戏机制和极高的难度在全球范围内引起了热潮。在这里,我们拥有的是自己制作的...

    FlappyBird素材包

    《Flappy Bird游戏素材解析与应用》 Flappy Bird,这款曾经风靡全球的休闲小游戏,以其简单却极具挑战性的玩法吸引了无数玩家。本素材包是根据某博主在CSDN上的分享(链接:...

    FlyBird资源文件图片加音效

    【FlyBird资源文件图片加音效】是一款深受国内外玩家喜爱的游戏资源包,它包含了用于创建类似"FlappyBird"游戏的素材,包括视觉元素和音频效果。这些资源为开发者提供了便利,使他们能够快速构建一个与原版Flappy...

Global site tag (gtag.js) - Google Analytics