struts2整合jfreechart的经验之谈(痛的教训)

         一个java web项目中需要用到图表显示,于是我选择了jfreechart(正常人都会想到..)鉴于这次给我的教训比较大,花的时间也比较多,于是将struts2整合jfreechart的方法写下来,纪念这几天花去的时间和精力。

 

第一,jfreechart的使用,不多说网上很多资料..

         需要下载的包有

  • struts2-core-2.1.6.jar
  • freemarker-2.3.13.jar
  • xwork-2.1.2.jar
  • ognl-2.6.11.jar
  • commons-fileupload-1.2.1.jar
  • commons-logging-1.0.4.jar
  • struts2-jfreechart-plugin-2.1.6.jar
  • jcommon-1.0.15.jar
  • jfreechart-1.0.12.jar

第二,根据你web.xml中struts2的路径配置,struts2中有两种方式使用jfreechart

   ①.如果web.xml中struts2的配置为     

 

<filter>
  <filter-name>struts2</filter-name>
  <filter-class>com.b510.base.web.filter.PrepareFilter</filter-class>
 </filter>

 <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>*.action</url-pattern>
 </filter-mapping>

这个配置的话jfreechart和普通状态下jfreechart使用一样,只需要在web.xml中添加如下配置就可以正常使用

<servlet> 
            <servlet-name>DisplayChart</servlet-name> 
            <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class> 
        </servlet> 
        <servlet-mapping> 
            <servlet-name>DisplayChart</servlet-name> 
            <url-pattern>/DisplayChart</url-pattern> 
        </servlet-mapping> 


如果在jsp中直接使用jfreechart的话,参考如下代码即可:

<!--    ----------开始绘图----------   -->
<%
    
     DefaultCategoryDataset dataset = new DefaultCategoryDataset();
         /*                      设置编码                   */
		StandardChartTheme standardChartTheme=new StandardChartTheme("CN");  
		   //设置标题字体  
		   standardChartTheme.setExtraLargeFont(new Font("隶书",Font.BOLD,20));  
		   //设置图例的字体  
		   standardChartTheme.setRegularFont(new Font("宋书",Font.PLAIN,15));  
		   //设置轴向的字体  
		   standardChartTheme.setLargeFont(new Font("宋书",Font.PLAIN,15));  
		   //应用主题样式  
		   ChartFactory.setChartTheme(standardChartTheme);
		   
        //添加数据****这个根据自己需要添加特定数据,这里是我项目里的代码,只做参考。在dataset.setValue()里添加数据
     for(int j=0;j<s.size();j++){
          State myState = s.get(j);
          dataset.setValue(myState.getTemperature(), sheet.getMonitors().getName(), myState.getTime());
     }
     
     JFreeChart chart = ChartFactory.createLineChart(
						"testChart",			// 图表标题
						"日期",					// 目录轴的显示标签
						"温度",					// 数值轴的显示标签
						dataset,			    // 数据集
						PlotOrientation.VERTICAL, // 图表方向:水平、垂直
						true, 					// 是否显示图例(对于简单的柱状图必须是false)
						false,					 // 是否生成工具
						false);					// 是否生成URL链接

     String fileName = ServletUtilities.saveChartAsPNG(chart, 480, 320 , null , session);
    String url = request.getContextPath()+"DisplayChart?filename="+fileName;
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";

%>

<img  src="<%=basePath+url%> " width="800" height="600">


 

②.如果web.xml中struts2的配置如下的

	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>com.b510.base.web.filter.PrepareFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

jfreechart中产生图片的servlet即DisplayChart会被struts2给拦截,出现空指针NullPoint错误

解决办法是使用struts2的一个插件

struts2-jfreechart-plugin-2.1.6.jar

使用方法如下:

2-1编写strut2.xml文件(添加代码)

   <package name="jfreechart" extends="jfreechart-default">  
        <action name="jfreechart" class="jfreechartAction">  
            <result name="success" type="chart">  
                <param name="width">500</param>  
                <param name="height">400</param>  
            </result>  
        </action>  
    </package>  

2-2编写jfreechartAction来接收请求

ps.以下代码参考来自http://wind-sing.iteye.com/blog/443980

public class JfreeCharAction extends ActionSupport {     
    
    /**    
     * 定义JFreeChart对象 大家请注意在这里JFreeChart对象名只能为chart     
     * 不能是别的     
      * 关于这点    
      * 大家可以上struts2网站上面查看一下      
      * http://struts.apache.org/2.x/docs/jfreechart-plugin.html    
     */    
    private JFreeChart chart;     
    
    public JFreeChart getChart() {     
        return chart;     
    }     
    
    public void setChart(JFreeChart chart) {     
        this.chart = chart;     
    }     
    
    @Override    
    public String execute() throws Exception {     
        // 调用方法     
        this.chart = JfreeChartTest.createChart();     
        return SUCCESS;     
    }     
}


2-3编写制图类JfreeChartTest

 public static JFreeChart createChart() throws IOException {     
        // 数据集     
        DefaultPieDataset dpd = new DefaultPieDataset();     
        dpd.setValue("管理人员", 25);     
        dpd.setValue("市场人员", 25);     
        dpd.setValue("开发人员", 45);     
        dpd.setValue("其它人员", 10);     
        // 创建PieChart对象     
        JFreeChart chart = ChartFactory.createPieChart3D("某公司人员组织结构图", dpd,     
                true, true, false);     
        utils.setFont(chart);     
        return chart;     
    }     
}     
    
/**    
 * 设置字体    
 *     
 * @author zyong    
 *     
 */    
class utils {     
    public static void setFont(JFreeChart chart) {     
        Font font = new Font("宋体", Font.ITALIC, 12);     
        PiePlot plot = (PiePlot) chart.getPlot();     
        chart.getTitle().setFont(font);     
        plot.setLabelFont(font);     
        chart.getLegend().setItemFont(font);     
    }     
} 


2-4在jsp中直接使用jfreechart

<img alt="jfreechart" src="jfreechart.action"/> 


ps. 两种方法中推荐第二种,绘图类可以复用也可以实现多态根据不同情况绘制不同图表,而且系统分层明确,有利于后期维护。

      我因为原来的系统束缚,传参比较麻烦,于是使用第一种方法修改比较快速方便

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值