博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

struts2 jfreechart生成报表

Posted on 2013-06-25 13:12  TimeFight  阅读(293)  评论(0)    收藏  举报

转至 http://wangyu.iteye.com/blog/211266 
下面以边帖图片和代码的方式来讲解Struts2与JFreeChart的整合。 
     搭建环境:首先帖一张工程的目录结构以及所需的jar包。注意:如果你不打算自己写ChartResult的话只需要引入struts2-jfreechart-plugin-2.0.6.jar(这个在struts-2.0.6-all.zip可以找到了): 
         
       1.依次帖web.xml、struts.xml、struts.properties和struts-jfreechart.xml几个配置文件的代码: 
        web.xml 


<?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"> 
    
    <filter> 
        <filter-name>struts2</filter-name> 
        <filter-class> 
            org.apache.struts2.dispatcher.FilterDispatcher 
        </filter-class> 
    </filter> 
    <filter-mapping> 
        <filter-name>struts2</filter-name> 
        <url-pattern>/*</url-pattern> 
    </filter-mapping> 
</web-app>        struts.xml 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
    "http://struts.apache.org/dtds/struts-2.0.dtd"> 

  

  struts.xml

<constant name="struts.ui.theme" value="simple"></constant>

<struts> 
    <include file="struts-jfreechart.xml" /> 
</struts>    

  struts-jfreechart.xml 

<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
    "http://struts.apache.org/dtds/struts-2.0.dtd"> 
<struts> 
    <package name="jFreeChartDemonstration" extends="struts-default" 
        namespace="/jfreechart"> 
        <result-types> 
            <result-type name="chart" class="org.apache.struts2.dispatcher.ChartResult"></result-type> 
        </result-types> 
        <action name="JFreeChartAction" class="com.tangjun.struts2.JFreeChartAction"> 
              <result type="chart"> 
                   <param name="width">400</param> 
                   <param name="height">300</param> 
            </result> 
        </action> 
    </package> 
</struts>        说明:这里只需要说明下struts-jfreechart.xml,这里直接调用已经写好的类ChartResult,这个类是继承自 com.opensymphony.xwork2.Result,传入生成图片大小的参数width和height就可以了。 

       2. 新建JFreeChartAction继承ActionSupport,生成JFreeChart对象并保存到chart中,注意这个名称是固定的。

package com.tangjun.struts2; 

import com.opensymphony.xwork2.ActionSupport; 
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.JFreeChart; 
import org.jfree.data.general.DefaultPieDataset; 

public class JFreeChartAction extends ActionSupport { 

    /** 
     * 
     */ 
    private static final long serialVersionUID = 5752180822913527064L; 

    //供ChartResult调用->ActionInvocation.getStack().findValue("chart") 
    private JFreeChart chart; 
    
    @Override 
    public String execute() throws Exception { 
        //设置数据 
        DefaultPieDataset data = new DefaultPieDataset(); 
        data.setValue("Java", new Double(43.2)); 
        data.setValue("Visual Basic", new Double(1.0)); 
        data.setValue("C/C++", new Double(17.5)); 
        data.setValue("tangjun", new Double(60.0)); 
        //生成JFreeChart对象 
        chart = ChartFactory.createPieChart("Pie Chart", data, true,true, false); 
        
        return SUCCESS; 
    } 

    public JFreeChart getChart() { 
        return chart; 
    } 

    public void setChart(JFreeChart chart) { 
        this.chart = chart; 
    } 
} 

OK!至此代码已经全部贴完。 
输入访问 http://localhost:8080/Struts2JFreeChart/jfreechart/JFreeChartAction.action 
显示结果如下: 







-------------------------------------------------------------------------------- 


补充 
    以上生成的图片是PNG格式的图片,如果需要自定义图片格式的话(好像只能支持JPG和PNG格式),那么自己写一个ChartResult继承自StrutsResultSupport,见代码: 



package com.tangjun.struts2.chartresult; 

import java.io.OutputStream; 

import javax.servlet.http.HttpServletResponse; 

import org.apache.struts2.ServletActionContext; 
import org.apache.struts2.dispatcher.StrutsResultSupport; 
import org.jfree.chart.ChartUtilities; 
import org.jfree.chart.JFreeChart; 

import com.opensymphony.xwork2.ActionInvocation; 

public class ChartResult extends StrutsResultSupport { 

    /** 
     * 
     */ 
    private static final long serialVersionUID = 4199494785336139337L; 
    
    //图片宽度 
    private int width; 
    //图片高度 
    private int height; 
    //图片类型 jpg,png 
    private String imageType; 
    
    
    @Override 
    protected void doExecute(String arg0, ActionInvocation invocation) throws Exception { 
        JFreeChart chart =(JFreeChart) invocation.getStack().findValue("chart"); 
        HttpServletResponse response = ServletActionContext.getResponse(); 
        OutputStream os = response.getOutputStream(); 
        
        if("jpeg".equalsIgnoreCase(imageType) || "jpg".equalsIgnoreCase(imageType)) 
            ChartUtilities.writeChartAsJPEG(os, chart, width, height); 
        else if("png".equalsIgnoreCase(imageType)) 
            ChartUtilities.writeChartAsPNG(os, chart, width, height); 
        else 
            ChartUtilities.writeChartAsJPEG(os, chart, width, height); 
        
        os.flush(); 

    } 
    public void setHeight(int height) { 
        this.height = height; 
    } 

    public void setWidth(int width) { 
        this.width = width; 
    } 
    
    public void setImageType(String imageType) { 
        this.imageType = imageType; 
    } 

} 

如此的话还需要小小的修改一下struts-jfreechart.xml: 

<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
    "http://struts.apache.org/dtds/struts-2.0.dtd"> 

<struts> 
    <package name="jFreeChartDemonstration" extends="struts-default" 
        namespace="/jfreechart"> 
        <!-- 自定义返回类型 --> 
        <result-types> 
            <!-- 
            <result-type name="chart" class="org.apache.struts2.dispatcher.ChartResult"></result-type> 
             --> 
            <result-type name="chart" class="com.tangjun.struts2.chartresult.ChartResult"></result-type> 
        </result-types> 

        <action name="JFreeChartAction" class="com.tangjun.struts2.JFreeChartAction"> 
              <!-- 
              <result type="chart"> 
                   <param name="width">400</param> 
                   <param name="height">300</param> 
            </result> 
            --> 
              <result type="chart"> 
                   <param name="width">400</param> 
                   <param name="height">300</param> 
                   <param name="imageType">jpg</param> 
            </result> 
        </action> 
    </package> 
</struts> 
OK!显示的效果是一样的,只是图片格式不一样,当然这里面你可以做更多操作!