jfreechar map标签输出问题

来源:互联网 发布:nginx实现session共享 编辑:程序博客网 时间:2024/06/11 17:02

我使用的jfreechar的版本是

先说一下我是如何来做的,以及出现的问题,以及如何解决的

现在做的项目是升级,以前的代码全部写在JSP上,所以我现在改成了自定义标签,的方式生成饼图,和折线图;

以下是之前代码:


生成图的Java类和方法:

public static String getLineURLTemp(HttpSession session,PrintWriter pw,CategoryDataset barDataset,String title,String xName,String yName,int width,int height)throws ServletException, IOException {String filename = "";try{// 把生成的文件写入到临时的目录中ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());filename = ServletUtilities.saveChartAsPNG(createLineXYChar(title,xName,yName,barDataset), width, height, info,session);// 选择存储成png格式的文件,当然你也可以使用saveChartAsJPEG的方法生成jpg图片// 把image map 写入到 PrintWriterChartUtilities.writeImageMap(pw, filename, info, false);//这里一定要设成falsepw.flush();}catch (Exception e){System.err.println(e.toString());}return filename;}
在修改代码之前生成图一切正常:(问题就出在map标签的输出上)

之前生成图之后map标签得到了及时的输出,参杂在HTML代码中:(下图)



下面是该后的标签,和对应的标签类:

TLD文件

<?xml version="1.0" encoding="UTF-8" ?><taglib xmlns="http://java.sun.com/xml/ns/javaee"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"    version="2.1">      <display-name>chart</display-name>  <tlib-version>1.0</tlib-version>  <short-name>chart</short-name>  <uri>http://www.yhc.com/chart</uri>  <tag>    <description>            该标签是判断并输出标签和产生饼图    </description>    <name>createChart</name>    <tag-class>com.blue.himp.his.taglib.CreateChartTag</tag-class>    <body-content>JSP</body-content>    <attribute>        <description>                           饼状图对象,注意饼图和折线图只能设置一个        </description>        <name>pieChart</name>        <required>false</required>        <rtexprvalue>true</rtexprvalue>    </attribute>        <attribute>        <description>                     折线图对象,注意饼图和折线图只能设置一个        </description>        <name>lineGraph</name>        <required>false</required>        <rtexprvalue>true</rtexprvalue>    </attribute>        <attribute>        <description>                     图的名称        </description>        <name>title</name>        <required>true</required>        <rtexprvalue>true</rtexprvalue>    </attribute>         <attribute>        <description>         xName,创建折线图,需要属性        </description>        <name>xName</name>        <required>false</required>        <rtexprvalue>true</rtexprvalue>    </attribute>        <attribute>        <description>         yName,创建折线图,需要属性        </description>        <name>yName</name>        <required>false</required>        <rtexprvalue>true</rtexprvalue>    </attribute>     <attribute>        <description>                           图片的宽度        </description>        <name>width</name>        <required>false</required>        <rtexprvalue>true</rtexprvalue>    </attribute>         <attribute>        <description>                        图片的高度        </description>        <name>height</name>        <required>false</required>        <rtexprvalue>true</rtexprvalue>    </attribute>         <attribute>        <description>                        图片的比例,如果设置,那么最后就等于,width*proportion 和height*proportion        </description>        <name>proportion</name>        <required>false</required>        <rtexprvalue>true</rtexprvalue>    </attribute>      </tag></taglib>

对应的Java类:

package com.blue.himp.his.taglib;import java.io.IOException;import java.io.PrintWriter;import java.io.Writer;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import javax.servlet.jsp.JspException;import javax.servlet.jsp.PageContext;import javax.servlet.jsp.tagext.Tag;import javax.servlet.jsp.tagext.TagSupport;import org.jfree.data.category.CategoryDataset;import org.jfree.data.general.DefaultPieDataset;import com.blue.himp.his.bean.OutpatientVo;import com.blue.himp.util.CreatChart;import com.blue.summer.core.exception.ActionException;public class CreateChartTag extends TagSupport{  private Integer width=0;//宽度private Integer height=0;//高度private Integer proportion=1;//比例//折线图对象private CategoryDataset lineGraph;//饼状图对象private DefaultPieDataset pieChart;//图像名称private String title;//private String xName;//private String yName;//输出流private Writer out;/*** * 开始该标签的事件 */@Overridepublic int doStartTag() throws JspException,ActionException{if(lineGraph==null&&pieChart==null){return Tag.SKIP_BODY;//不执行该标签}//得到请求对象HttpServletRequest request=(HttpServletRequest) pageContext.getRequest();//得到SessionHttpSession session=request.getSession();//输出流//out=pageContext.getOut();if(width==0){width=proportion*80;//宽度}if(height==0){height=68*proportion;//高度}    try { out= pageContext.getResponse().getWriter();} catch (IOException e) {e.printStackTrace();throw new ActionException("生成图失败.", e);}String fileName="";//文件名称String imageURL="";//该文件的访问路径if(lineGraph!=null){//折线图try {//创建图得到文件名称 fileName=CreatChart.getLineURLTemp(session, new PrintWriter(out),lineGraph,title,xName,yName,width,height);//对应生成该图的访问url imageURL=request.getContextPath() + "/servlet/DisplayChart?filename=" + fileName;} catch (Exception e) {e.printStackTrace();}}if(pieChart!=null){//饼状图  try {//创建图得到文件名称fileName=CreatChart.get3DPieURLTemp(session, new PrintWriter(out),  pieChart,title,width,height);//对应生成该图的访问urlimageURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + fileName;} catch (Exception e) {e.printStackTrace();throw new ActionException("生成图失败.", e);} }//将对应的值放到请求的作用域中request.setAttribute("fileName",fileName);//名称request.setAttribute("imageURL",imageURL);//图片URLrequest.setAttribute("width", width);//图片宽度request.setAttribute("height", height);//图片高度//System.out.println("执行过....");return Tag.EVAL_PAGE;//正常的流程继续执行JSP}//=============================getter setter@Overridepublic void setPageContext(PageContext pageContext) {super.setPageContext(pageContext);}public void setLineGraph(CategoryDataset lineGraph) {this.lineGraph = lineGraph;}public void setPieChart(DefaultPieDataset pieChart) {this.pieChart = pieChart;}public void setTitle(String title) {this.title = title;}public void setxName(String xName) {this.xName = xName;}public void setyName(String yName) {this.yName = yName;}public void setWidth(Integer width) {this.width = width;}public void setHeight(Integer height) {this.height = height;}public void setProportion(Integer proportion) {this.proportion = proportion;}}

该过之后map标签的输出问题,是不能及时输出(输出的map标签参杂在js文件中,由于使用了ExtJs,这时脚本会报错)

以下是JSP改为标签之后的效果:datdaSet是在Action中生成的


以下是输出后的HTML源代码:(没有生成到HTML标签中而是参杂在JS代码中)



以下是自定义标签生成后的内容:(效果图)


那么问题是出在了什么地方了(需要注意的是我的标签类,有一个获得输出流的地方被注释了)(图1)


   上面注释的获得流的方法是我修改后的,没有注释获得流的是之前的(图2)

那么现在把(图1)代码解禁,将(图2)代码注释:

在看看自定义标签生成后的HTML源代码:(是不是已经被及时写出去了)



 需要注意的是这两个流的类型一个是JSPWriter,另一个是PrintWriter

在来看看该JSP生成的JAVA代码,明白了吧:



原创粉丝点击