struts 2統合JFree Chartホットスポットの例


テストは午後になって、やっと写真が表示できない原因を見つけました。struts 2はブロックでservletをブロックしましたので、配置のDisplayChartが見つけられません。stus.xmlに注:このホットスポット付きアクションはstruts 2のjfreechartプラグインを使用していません。
インポートパッケージ:
       struts 2-jfreechart plugin-2.8.1.jar
       jfreechard-1.0.13.jar
       jcommon-1.0.16.jar
1.ハートネスアクション(ホットスポット付きアクション)

package com.cs.struts2.helloworld;

import java.awt.Color;
import java.awt.Font;
import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.labels.StandardPieToolTipGenerator;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.chart.urls.StandardPieURLGenerator;
import org.jfree.data.general.DefaultPieDataset;

import com.opensymphony.xwork2.ActionSupport;

public class ChartAction extends ActionSupport implements ServletRequestAware, ServletResponseAware{
	private HttpServletRequest request;
	private HttpServletResponse response; 
	private String mapMessage;
	private String src;
	 
	public String getChart() throws IOException {
		//    
		JFreeChart chart = ChartFactory.createPieChart(
				"       ",     //    
				getDateSet(),      //  
				true,             //      
				true,            //        
				true             //    URL
		);
		//         
		chart.setTitle(new TextTitle("       ",new Font("  ",Font.ITALIC,22)));
		//     
		LegendTitle legendTitle = chart.getLegend(0);
		//      
		legendTitle.setItemFont(new Font("  ",Font.BOLD,14));
		//    plot  
		PiePlot plot = (PiePlot) chart.getPlot();
		//  key           
		plot.setSectionPaint("JAVA  ", Color.RED);
		plot.setSectionPaint("c++  ", Color.BLUE);
		plot.setSectionPaint("C#  ", Color.GREEN);
		plot.setSectionPaint("VC++  ", Color.ORANGE);
		//  plot  
		plot.setLabelFont(new Font("  ",Font.BOLD,18));
		//       (0~1)
		plot.setBackgroundAlpha(0.9f);
//-------------------       ----------------------------			
		//    
		plot.setNoDataMessage("No data available");
		String str =request.getContextPath()+"/first/bchart.action"; 
		//StandardPieURLGenerator()        "type"   category
		plot.setURLGenerator(new StandardPieURLGenerator(str,"type"));
		plot.setToolTipGenerator(new StandardPieToolTipGenerator()); 
		StandardEntityCollection sec = new StandardEntityCollection();
		//  RenderingInfo  ,info           
		ChartRenderingInfo info = new ChartRenderingInfo(sec); 
        response.setCharacterEncoding("GBK");
        String filename = null;
        try {
         filename = ServletUtilities.saveChartAsJPEG(chart, 700, 500, info, request.getSession());
        } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
        }
         mapMessage = ChartUtilities.getImageMap("map0", info);
         src = request.getContextPath()+"/servletDisplayChart?filename=" + filename;
        
        return "first";
	}
	
	private static DefaultPieDataset getDateSet() {
		//         
		DefaultPieDataset dataset = new DefaultPieDataset();
		dataset.setValue("JAVA  ", 47);
		dataset.setValue("c++  ", 23);
		dataset.setValue("C#  ", 20);
		dataset.setValue("VC++  ", 10);
		return dataset;
	}

	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}

	public void setServletResponse(HttpServletResponse response) {
		this.response = response;
	}

	public String getMapMessage() {
		return mapMessage;
	}

	public void setMapMessage(String mapMessage) {
		this.mapMessage = mapMessage;
	}

	public String getSrc() {
		return src;
	}

	public void setSrc(String src) {
		this.src = src;
	}
}
2.ChartAction(ホットターゲットアクション)

package com.cs.struts2.helloworld;

import java.awt.Color;
import java.awt.Font;
import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;


import com.opensymphony.xwork2.ActionSupport;

public class ChartActionB extends ActionSupport implements ServletRequestAware {
	private HttpServletRequest request;

	public JFreeChart getChart() throws IOException {
//---------------------       -------------------------------		
		CategoryDataset dataset;
		String queryString = request.getQueryString();
		queryString = java.net.URLDecoder.decode(queryString , "UTF-8");
		System.out.println(queryString);
		String type = null;
		for(String param : queryString.split("&"))
		{
		String[] nameValue = param.split("=");
		type = nameValue[0].equals("type") ? nameValue[1] : type;
		}
		String subTitle = "";
		if(type.equals("JAVA  "))
		{
		dataset = getDateSet1();
		subTitle="JAVA  ";
		}
		else if(type.equals("c++  "))
		{
		dataset = getDateSet4();
		subTitle="c++  ";
		}
		else if(type.equals("C#  "))
		{
		dataset = getDateSet2();
		subTitle="C#  ";
		}
		else
		{
		dataset = getDateSet3();
		subTitle="VC++  ";
		}
		//String title = subTitle + "       ";
//-------------------------       ---------------------
		//     
		JFreeChart chart = ChartFactory.createBarChart (
				"       ",     //    
				"  ",             //        
				"  ",             //        
				dataset,      //  
				//PlotOrientation.HORIZONTAL, //      
				PlotOrientation.VERTICAL,    //      
				false,             //      
				false,            //        
				false             //    URL
		);
		//         
		chart.setTitle(new TextTitle("<<"+subTitle+">>     ",new Font("  ",Font.ITALIC,22)));
		//     
		//LegendTitle legendTitle = chart.getLegend(0);
		//      
		//legendTitle.setItemFont(new Font("  ",Font.BOLD,14));
		//     plot  
		CategoryPlot plot = (CategoryPlot) chart.getPlot();
		//       
		plot.getRenderer().setSeriesPaint(0, Color.blue);
		//    
		CategoryAxis categoryAxis = plot.getDomainAxis();
		//       
		categoryAxis.setLabelFont(new Font("  ",Font.BOLD,22));
		//       45   
		//categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
		//        
		categoryAxis.setTickLabelFont(new Font("  ",Font.BOLD,22));
		//    
		NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();
		//       
		numberAxis.setLabelFont(new Font("  ",Font.BOLD,22));
		//       (0~1)
		plot.setBackgroundAlpha(0.9f);
		
		return chart; 
		
	}
//------------------------       --------------------
	private static DefaultCategoryDataset getDateSet4() {
		System.out.println("c++");
		//          
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		dataset.addValue(47,"c++  ", "06 10 ");
		dataset.addValue(60,"c++  ", "06 11 ");
		dataset.addValue(20,"c++  ","06 12 " );
		dataset.addValue(50,"c++  ","07 1 ");
		return dataset;
	}
	private static DefaultCategoryDataset getDateSet1() {
		System.out.println("java");
		//          
		DefaultCategoryDataset dataset1 = new DefaultCategoryDataset();
		dataset1.addValue(47,"JAVA  ", "06 10 ");
		dataset1.addValue(23,"JAVA  ", "06 11 ");
		dataset1.addValue(20,"JAVA  ","06 12 " );
		dataset1.addValue(10,"JAVA  ", "07 1 ");
		return dataset1;
	}
	private static DefaultCategoryDataset getDateSet2() {
		System.out.println("C#");
		//          
		DefaultCategoryDataset dataset2 = new DefaultCategoryDataset();
		dataset2.addValue(27,"C#  ", "06 10 ");
		dataset2.addValue(23,"C#  ", "06 11 ");
		dataset2.addValue(40,"C#  ","06 12 " );
		dataset2.addValue(70,"C#  ", "07 1 ");
		return dataset2;
	}
	private static DefaultCategoryDataset getDateSet3() {
		System.out.println("VC++");
		//          
		DefaultCategoryDataset dataset3 = new DefaultCategoryDataset();
		dataset3.addValue(48,"VC++  ", "06 10 ");
		dataset3.addValue(63,"VC++  ", "06 11 ");
		dataset3.addValue(29,"VC++  ","06 12 " );
		dataset3.addValue(49,"VC++  ","07 1 ");
		return dataset3;
	}

	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}
}
3.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>
    <constant name="struts.action.extension" value="do,action"/>
    <package name="first" extends="struts-default" namespace="/first"> 
    	<action name="chart" class="com.cs.struts2.helloworld.ChartAction" method="getChart">
    		<result name="first">first.jsp</result>
    	</action>
    </package>
    
    <package name="b" namespace="/first" extends="jfreechart-default">
    	<action name="bchart"  class="com.cs.struts2.helloworld.ChartActionB">
    		<result type="chart">
    			<param name="width">700</param>
    			<param name="height">400</param>
    		</result>
    	</action>
    </package>
</struts>
4.first.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
 <P ALIGN="CENTER">
     <s:property value="mapMessage" escape="false"/>
  <img src="<s:property value='src'/>" border=0 usemap="#map0">
 </P> 
5.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>/servletDisplayChart</url-pattern>
  </servlet-mapping>