`
canofy
  • 浏览: 829725 次
  • 性别: Icon_minigender_1
  • 来自: 北京、四川
社区版块
存档分类
最新评论

cewolf应用

    博客分类:
  • j2EE
阅读更多
cewolf的应用

Cewolf可以在一个基于Servlet/JSP的Web应用程序内部使用,基于JFreechart的,利用JFreechart的绘制引擎的开源项目。以在Web页中嵌入各种复杂的图形图表(如,直方图、饼图、棒图等等)。它提供了一个功能完备的标签库来定义图表的所有属性(颜色、笔画、图例等),这样嵌入了图表的JSP就不用使用任何Java代码。

遇到的问题:最初遇到的问题是一个关于作用域的问题,在网上找了一些资料,发现cewolf的比较少,慢慢摸索了一下,弄明白与作用域有关。

环境:myeclipse+tomcat6+jdk5

前提:由于公司里面很多统计数据,和日期有关,因此横坐标都是使用的日期,纵坐标是数据。

结果:这里把cewolf的东西进行了封装,在使用时只需提供按要求所提供的数据以及重新写servlet类即可,当然还可以继续进行封装,只是这可能就可能会与其余的东西相依赖了。

最新的思路:
还可以进行更深的抽象,即servlet只需一些很基本的操作,这里需要使用接口,然后只需把实现几口的类的.class传进去坐参数。
前台的参数也不用去获取,只需存到一个数组中,这可以在util里面写,然后再数据库查询的时候可以做成一个通用的东西,比如用jdbc连数据库,自己写数据库的一些东西等等。

1.首先是从http://cewolf.sourceforge.net/new/index.html下载最新的包,把相应的包(不仅是cewolf,JFreechart,还有好几个所依赖的包)都复制到项目工程里去。


2.配置web.xml文件,把下面的xml代码复制到web.xml中,然后把img和etc文件夹复制到工程目录里面去,这里有绘图需要的东东,配置文件里写有
<!-- cewolf的配置 -->
  <servlet>
    <servlet-name>CewolfServlet</servlet-name>
    <servlet-class>de.laures.cewolf.CewolfRenderer</servlet-class>
	<!-- sets storage implementation -->
    <init-param>
        <param-name>storage</param-name>
        <param-value>de.laures.cewolf.storage.TransientSessionStorage</param-value>
    </init-param>
	<!-- sets overlib.js location relative to webapp -->
    <init-param>
        <param-name>overliburl</param-name>
        <param-value>/etc/overlib.js</param-value>
    </init-param>
	<!-- turn on or off debugging logging -->
    <init-param>
        <param-name>debug</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>CewolfServlet</servlet-name>
    <url-pattern>/cewolf/*</url-pattern>
  </servlet-mapping>

  <session-config>
    <session-timeout>1</session-timeout>
  </session-config>

  <mime-mapping>
      <extension>css</extension>
      <mime-type>text/css</mime-type>
  </mime-mapping>
  

3.cewolf的核心处理类,这里参考了cewolf的例子
public class PageViewData implements DatasetProducer, CategoryToolTipGenerator,CategoryItemLinkGenerator, Serializable{
	
	private static final long serialVersionUID = 1829275651312989845L;
	private List list=new ArrayList();
	
	
	
	public List getList() {
		return list;
	}

	public void setList(List list) {
		this.list.addAll(list);
	}

	
	/**
	 * 产生一个唯一的标识符,这里还需要进行修改
	 */
	public String getProducerId() {		
		return "PageViewData ";
	}

	/**
	 * 5m时间作为图片的过期时间,即在5m内刷新图片,图片不会发生变化。
	 */
	public boolean hasExpired(Map arg0, Date arg1) {	
		return (System.currentTimeMillis() - arg1.getTime())  > 5000;
	}

	/**
	 * 主要的方法,报表的图片的数据显示在这里进行设置
	 */
	public Object produceDataset(Map arg0) throws DatasetProduceException {
		//这个对象的建立参考网上的例子
		DefaultCategoryDataset dataset = new DefaultCategoryDataset(){   
		    /* 
		     * @see java.lang.Object#finalize()
		    *当垃圾回收器确定不存在对该对象的更多引用时,
		    *由对象的垃圾回收器调用此方法
		    */
		   protected void finalize() throws Throwable {
			    super.finalize();			    
		   }
       };
       ReportImgBean rb;
       String seriesName;
       List imgDataList;
       ImgData imgData;
       if(list!=null&&list.size()>0){
    	   //外层循环是几条折线,内层循环是一条折线
    	   for(int i=0;i<list.size();i++){
    		   rb=(ReportImgBean)list.get(i);
    		   seriesName=rb.getSeriesName();
//    		   System.out.println("seriesName:"+seriesName);
    		   imgDataList=rb.getImgDataList();
//    		   System.out.println("seriesName:"+seriesName+":"+imgDataList.size());
    		   if(imgDataList!=null&&imgDataList.size()>0){//必须要有数据,否则无意义    			   
        		   for(int j=0;j<imgDataList.size();j++){
        			   imgData=(ImgData)imgDataList.get(j);
        			   dataset.addValue(imgData.getData(),seriesName, imgData.getXcoordinate()); 
        		   }	
    		   }
           }
       }      
       return dataset;
	}

	public String generateToolTip(CategoryDataset arg0, int arg1, int arg2) {
		// 返回描述,相当于提示作用吧
		return this.getDescription(arg1);
	}

	public String generateLink(Object arg0, int arg1, Object arg2) {
		//返回描述,在底部的说明
		return this.getDescription(arg1);
	}

	protected void finalize() throws Throwable {
		  super.finalize();		  
	}
	/**
	 * 返回描述的内容
	 * @param i
	 * @return
	 */
	public String getDescription(int i){
		String result="";
		if(list!=null&&list.size()>0){
			ReportImgBean rb=(ReportImgBean)list.get(i);
			result=rb.getSeriesName();
		}	
		return result;
	}
}


cewolf所需数据的结构如下:
public class ImgData {
	private String xcoordinate;//日期,横坐标
	private double data;//数据,纵坐标的数据
	
	public String getXcoordinate() {
		return xcoordinate;
	}
	public void setXcoordinate(String xcoordinate) {
		this.xcoordinate = xcoordinate;
	}
	public double getData() {
		return data;
	}
	public void setData(double data) {
		this.data = data;
	}
}


public class ReportImgBean {
	
	private String seriesName;//描述数据是哪种数据
	private List imgDataList;
	

	public List getImgDataList() {
		return imgDataList;
	}
	public void setImgDataList(List imgDataList) {
		this.imgDataList = imgDataList;
	}
	public String getSeriesName() {
		return seriesName;
	}
	public void setSeriesName(String seriesName) {
		this.seriesName = seriesName;
	}
	
}


4.数据处理的核心类,主要是对查询数据库所得到的数据进行处理成cewolf所需要的类型
public class BaseImgPhaseData {
	/**
	 * 
	 * @param dataList 这里面的数据都必须是必要的,若添加了不必要的则会出错,里面的元素的第一个为横坐标,之后的为具体的数据
	 * @param seriiseNames  折线的显示项。如:pv,click,ctr
	 * @return
	 */
	public PageViewData phaseData(List dataList,String[] seriiseNames) throws Exception{
		PageViewData pvd=null;
		List<ReportImgBean> result=new ArrayList<ReportImgBean>();		
		List<ArrayList<ImgData>> tempList=new ArrayList<ArrayList<ImgData>>();
		//判断是否有数据
		if(dataList==null||dataList.size()==0||seriiseNames==null||seriiseNames.length==1){
			return pvd;
		}
		for(int i=0;i<seriiseNames.length;i++){
			tempList.add(new ArrayList());
		}
		String seriesName="";
		//相当于数据解析成需要的数据
		for(int i=0;i<dataList.size();i++){
			Object[] obj=(Object[])dataList.get(i);
			for(int j=0;j<tempList.size();j++){				
				List<ImgData> list=(List<ImgData>)tempList.get(j);
				ImgData temp=new ImgData();
				temp.setXcoordinate(obj[0].toString());
				//数据从1开始
				temp.setData(Double.parseDouble(obj[1+j].toString()));
				list.add(temp);
			}
		}
		//把数据加入到最终的结构中
		for(int i=0;i<seriiseNames.length;i++){
			ReportImgBean tempBean=new ReportImgBean();
			List<?> imgDataList=tempList.get(i);
			seriesName=seriiseNames[i];
			tempBean.setSeriesName(seriesName);
			tempBean.setImgDataList(imgDataList);
			result.add(tempBean);
		}
		pvd=new PageViewData();
		pvd.setList(result);
		return pvd;
	}
}


5.数据准备,数据格式必须如下所示那样(这样只是迎合hibernate所生成的数据):
public class TestImpl2 extends BaseImgPhaseData {
	public PageViewData getData(String beginDate,String endDate){
		PageViewData result=null;		
		List list=new ArrayList();
		Object[] obj1={"20090613","200","150"};
		Object[] obj2={"20090614","200","250"};
		Object[] obj3={"20090615","100","350"};
		Object[] obj4={"20090616","250","150"};
		Object[] obj5={"20090617","300","400"};
		String[] seriiseNames={"测试pv","测试click"};
		list.add(obj1);
		list.add(obj2);
		list.add(obj3);
		list.add(obj4);
		list.add(obj5);
		try {
			result=super.phaseData(list, seriiseNames);
		} catch (Exception e) {			
			e.printStackTrace();
		}		
		return result;
	}
}

6.servlet类,主要是供前台调用
public class TestServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse res) throws ServletException, IOException{
		request.setCharacterEncoding("utf-8");
		String beginDate="2009-06-01";
		String endDate="2009-06-06";
		TestImpl2 ti=new TestImpl2();
		PageViewData pvd=ti.getData(beginDate, endDate);
		//常用参数的设置
		Util util=new Util();
		util.setCommonParam(request,pvd);
		request.setAttribute("beginDate", beginDate);
		request.setAttribute("endDate", endDate);		
//		res.sendRedirect("report/test.jsp");//这种方式不行
		request.getRequestDispatcher("report/test.jsp").forward(request, res);
	}
	
	public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
		this.doGet(req, res);
	}
}

7.jsp页面,核心代码
<form name="theFrom" action="${actionName}" method="post">	
	宽度:<input type="text" name="widths" value="${widths}" />
	高度:<input type="text" name="hights" value="${hights}" /><br />
	<input type="hidden" name="xname" value="${xname}" />
	<input type="hidden" name="yname" value="${yname}" />
	<input type="hidden" name="type" value="${type}" />
	<input type="hidden" name="title" value="${title}" />	
	<input type="hidden" name="beginDate" value="${beginDate}" />
	<input type="hidden" name="endDate" value="${endDate}" />
	<input type="submit" value="提交" />
</form>
<br />
<p>

<cewolf:chart 
    id="line" 
    title="${title}" 
    type="line" 
    xaxislabel="${xname}" 
    yaxislabel="${yname}">
    <cewolf:data>
        <cewolf:producer id="${pageViews}"/>
    </cewolf:data>
</cewolf:chart>
<p>
<cewolf:img chartid="line" renderer="/cewolf" width="${widths}" height="${hights}">
    <cewolf:map linkgeneratorid="${pageViews}" tooltipgeneratorid="${pageViews}"/>
</cewolf:img>



附件为myeclipse工程

图片为最终运行之后的效果图


  • 大小: 20.3 KB
分享到:
评论

相关推荐

    cewolf-1.2.1.zip

    **Cewolf** 是一个开源项目,主要专注于提供图形用户界面(GUI)和应用程序开发框架。它允许开发者快速创建和设计具有现代界面的应用程序,而无需深入学习复杂的图形设计技术。Cewolf 的核心特性包括: 1. **易用性...

    cewolf

    5. **Web集成**:CEWolf易于与Web应用程序集成,可以生成动态图表以供Web页面显示,增强用户体验。 **使用CEWolf的步骤** 1. **引入依赖**:将CEWolf库添加到项目的类路径中,通常通过Maven或Gradle管理依赖。 2. ...

    jfreechart+cewolf的架包

    2. **配置Cewolf**:在Web应用的部署描述符(如web.xml)中添加Cewolf Servlet的配置信息。 3. **发送请求**:当用户请求图表时,向Cewolf Servlet发送包含图表数据的HTTP请求。 4. **Servlet处理请求**:Cewolf接收...

    Cewolf web报表实例

    本实例将深入探讨Cewolf在Web报表开发中的应用,帮助开发者了解如何利用Cewolf创建动态、可视化的数据展示。 1. **Cewolf概述** - **功能特性**:Cewolf支持静态和动态图表,能够处理XML、JSON等多种数据格式,且...

    cewolf开发需要的jar文件

    这些jar(Java Archive)文件包含了各种类和方法,为开发者提供了丰富的功能和接口,使得开发者能够快速构建和运行cewolf相关的应用程序。 【描述】中提到的步骤,即“解压文件、然后放入WEB-INF的lib下”,这是在...

    cewolf-1.1.4

    cewolf则是在JFreeChart的基础上,提供了一种Web服务的方式来显示这些图表,特别适用于Web应用中的动态数据可视化。 **cewolf的特性:** 1. **Web服务接口**:cewolf的核心在于其提供了通过HTTP服务接口来生成图表...

    cewolf-1.2.3

    Cewolf可以在一个基于Servlet/JSP的Web应用程序内部使用,基于JFreechart的,利用JFreechart的绘制引擎的开源项目。以在Web页中嵌入各种复杂的图形图表(如,直方图、饼图、棒图等等)。它提供了一个功能完备的标签库来...

    Web报表开发技术-Cewolf开发技术实例

    本实例将深入探讨如何在Web应用程序中集成和使用Cewolf技术。 1. **Cewolf简介** Cewolf,全称为“Charts on the Web in Every Language”,是一个开源项目,主要目的是简化在Web应用中生成动态图表的过程。它支持...

    flex实战报表:jFreeChart,cewolf,iText.doc

    2. **Cewolf配置**:集成Cewolf通常涉及在Web应用的`web.xml`中配置CewolfServlet,并设置相应的MIME类型映射。 3. **十分钟上手**:使用Cewolf,你需要创建一个Java类来绘制图表,然后通过Servlet请求该类并渲染到...

    Java Web开发实例大全(基础卷) 完整pdf扫描版[179MB]

    重点内容有操作XML文件、发送与接收邮件、数据库操作技术、SQL语句应用技术、复杂查询技术、数据库高级应用、JFreeChart绘图基础、基础图表技术、扩展图表技术、基于Cewolf组件的图表编程、Prototype框架、jQuery...

    Java Web开发实例大全

    重点内容有操作XML文件、发送与接收邮件、数据库操作技术、SQL语句应用技术、复杂查询技术、数据库高级应用、JFreeChart绘图基础、基础图表技术、扩展图表技术、基于Cewolf组件的图表编程、Prototype框架、jQuery...

    Cewolf:用于在网页中显示图表的JSP标记库-开源

    Cewolf是用于各种图表的标记库。 它使每个JSP都可以轻松地嵌入图表图像。 Servlet容器中运行的任何Web应用程序都可以使用它。 无需Java scriplet代码即可定义图表。

    贯通开源WEB图形与报表技术全集—part1

    它支持静态和动态图表,广泛应用于Web应用、桌面应用和服务器端报告。通过JFreeChart,开发者可以方便地生成高质量的图表,并且能够自定义颜色、字体、图例、数据标签等元素,满足不同场景的数据展示需求。 Cewolf...

    开放源代码作品与Web图表编程

    JFreeChart和Cewolf是两个关键的开放源代码Web图表生成引擎,广泛应用于Java Web开发中。JFreeChart作为一个强大的图表库,支持多种类型的图表,如饼图、柱状图、线图等,可用于数据分析和可视化展示。Cewolf则在其...

    JSP创建基于WEB的动态图表之开源代码篇源代码.rar_jsp_jsp动态_动态WEB_基于Web

    接着,Cewolf是一个JSP图表组件库,它是基于JFreeChart的,可以方便地在Web应用中集成动态图表。例如,`CewolfHBar.jsp`和`CewolfVBar.jsp`分别展示了水平条形图和垂直条形图的创建,而`CewolfHBar3D.jsp`和`...

    精通Java+Web动态图表编程

    《精通Java+Web动态图表编程》是一本全面且深入的教程,它不仅涵盖了Java图形处理的基础知识,还提供了大量的实战案例,特别是对JFreeChart和Cewolf动态图表生成引擎的应用,以及如何将复杂的图表生成过程封装成可...

    java 报表生成 工具介绍

    6. **Cewolf**:Cewolf是一个用于在Web应用中嵌入复杂图形图表的Servlet/JSP组件。它提供了一个标签库,使得在JSP页面中添加图表无需编写Java代码。 7. **JOpenChart**:JOpenChart库提供了创建不同类型的图表(如...

    精通Java Web动态图表编程4

    向读者展示如何使用Java Applet、Java Servlet、Java Server Pages(JSP)、JavaBean以及开放源代码的Web图表生成引擎——JFreeChart和Cewolf来开发奇妙的Web动态图表应用程序——以一种跨平台、小巧、结构清晰的...

Global site tag (gtag.js) - Google Analytics