struts 2 - JFree Chart plugin

Published on: 2009. 7. 8. 16:52 by louis.dev


Java plug in 중 chart 를 쉽고 빠르게  만들 수 있게 해주는 JFree Chart Plugin을 소개한다.



다음과 같이 원형과 막대형의 그래프도 만들 수 있고 그외 만들수 있는 그래프의 숫자는 아주 많다. 지원되는 많은 차트를 확인 하려면
http://www.jfree.org/jfreechart/jfreechart-1.0.13-demo.jnlp

Library Download:

 http://www.jfree.org/ -->Download -->SourceForge Download page Click --> 하단의 jfreechart-1.0.13-javadocs.zip와 jfreechart-1.0.13.zip 받기


다음을 실행 시켜서 확인해 보면 된다.


작업순서

일단 차트를 만드는 기본적인 컨셉은 데이터가 있어야 차트로 변환할 수 있다는 점이다. 데이터가 들어가 있지 않으면 어떤것도 차트로 표현 할 수 없는 것은 당연한 일이다.


기본적인 Class의 구조는 다음과 같다.(API를 확인 하면서 보면 된다.)

가장 큰 밑바탕의 역할을 하는 JFreeChart Class가 존재 한다. JFreeChart class의 인스턴스를 생성하려면 Plot이라는 Class가 필요하다.
Plot은 정확하게 어떤 모양을 구현할지 선택하는 클래스 이다.(원형, 막대형, 꺽은선형...)
Plot은 모든 그래프 모형의 상위에 존재 하며 하위의 클래스들은 Plot을 상속하고 있다.
예를 들어 PiePlot 이라는 클래스는 원형 모델을 지원하며 PiePlot class로 구현한 그래프트는 맨 첫번째 그림의 왼쪽 모형이 되겠다.
PiePlot이라는 class는 또 다양한 형태의 class에 부모가 되며 하위 클래스 들은 3D형태의 클래스 부터 다양한 모양의 클래스가 존재 하며 예를 들면 PiePlot3D class가 원형이면서 3D형태로 구현된다.



                                                               Plot
                                                                ↑
                                                            PiePlot
                                                                ↑
                                                            PiePlot3D 

이런 형태가 된다.

이 Pie class에 데이터를 넣어 줘야 하는데 데이터를 저장하고 넣게 해주는 것은 PieDataset 이라는 interface가 존재 하고 이것을 구현하고 있는 다양한 class가 있는데 일반적으로 DefaultPieDataset class를 사용한다.

작업순서
                
                           
1) Library파일 추가

struts 2 에서 제공하는 다음과 같은 library를 추가한다.

struts2-jfreechart-plugin-2.0.14.jar
commons-digester-1.8.jar

위에서 다운받은 JFreeChart library를 추가 한다.

jcommon-1.0.16.jar
jfreechart-1.0.13.jar

2) action mapping 설정

extends="struts-default,jfreechart-default"

<action name="register"
           class="chart.actions.RegisterAction"
           method="execute">
          <result name="success" type="chart">
              <param name="width">500</param>
              <param name="height">400</param> 
          </result>   
 </action>

꼭 extends를 다음과 같이 설정해 주어야 하고 result type을 chart로 해주면 jFreeChart가 실행되어 차트가 보여지게 된다.
그러나 보통 웹페이지에서는 웹페이지에 전체 다 차트가 나오는 경우는 없으며 html 사이에 추가 되길 원한다.

그렇기 때문에 보통은 type="chart" 로 선언하지 않고 BusinussLogic상에서 차트를 이미지로 만들어 주어 저장한후 jsp페이지에서 링크를 걸어 주는 형식을 취하고 있다.

<action name="result"
           class="chart.actions.ResultAction"
           method="execute">
          <result name="success">/chart/result.jsp</result>    
</action>

다음과 같이 평범하게 결과 페이지로 이동시킨다.


3) Business Logic을 수행하고 JFreeChart class로 chart를 생성한다.

Logic을 수행할 class - 투표로직!
----------------------------------------------------------------------------------------------------------
package chart.actions;

import org.jfree.chart.JFreeChart;

import com.opensymphony.xwork2.ActionSupport;
import chart.model.dao.ChartDAO;
import chart.model.dto.ChartDTO;
import chart.poll.PollChart;

public class RegisterAction extends ActionSupport {

 public static final long serialVersionUID = 1L;
  
 /*property fields*/
 private int answer;
 private ChartDTO dto;
 private JFreeChart chart;
 
 public JFreeChart getChart(){          //action mapping 의 result로 데이터를 보내야 하기 때문에 JFreeChart로 리턴한다.
  return chart;
 }

 
 @Override
 public String execute()throws Exception {
  dto = new ChartDTO();
  calc();                                        //jsp페이지의 radio 버튼으로 들어오는 오는 값을 세팅 시켜준다.
  ChartDAO dao = new ChartDAO();
  dao.update(dto);                          //DB에 데이터 업데이트
  //list query
  dto = dao.list(dto);                        //DB에 있는 데이터 가져옴
  //chart 정보 가져옴
  chart = PollChart.getPie3dChart(dto);  // 실질적 차트를 생성하는 부분
  return SUCCESS;
 }

 public void calc(){
  switch(answer){
   case 1 : dto.setAnswer1(1);break;
   case 2 : dto.setAnswer2(1);break;
   case 3 : dto.setAnswer3(1);break;
   case 4 : dto.setAnswer4(1);
  }
  dto.setTot(1);
 }
 
 public int getAnswer() {
  return answer;
 }

 public void setAnswer(int answer) {
  this.answer = answer;
 }


}
----------------------------------------------------------------------------------------------------------

PollChart class

----------------------------------------------------------------------------------------------------------
package chart.poll;

import org.jfree.chart.JFreeChart;
//import org.jfree.chart.ChartFactory;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.category.DefaultCategoryDataset;
//import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.entity.StandardEntityCollection;
import chart.model.dto.ChartDTO;
import java.io.File;

import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.axis.CategoryAxis3D;
import org.jfree.chart.axis.NumberAxis3D;
import org.jfree.chart.renderer.category.BarRenderer3D;

public class PollChart {
 
 
 
 /*pie 3D chart*/
 public static JFreeChart getPie3dChart(ChartDTO dto)throws Exception {
  
  String path="D://JAVA/java document/web 2/workspace/struts2/WebContent/chart_images/pie3d.png";  //이미지 파일을 저장할 경로 설정
  JFreeChart chart = null;
// 차트에 삽입할 데이터를 집어 넣는다.
  DefaultPieDataset dataset = new DefaultPieDataset();
  dataset.setValue("1번("+dto.getAnswer1()+"명)", dto.getAnswer1());
  dataset.setValue("2번("+dto.getAnswer2()+"명)", dto.getAnswer2());
  dataset.setValue("3번("+dto.getAnswer3()+"명)", dto.getAnswer3());
  dataset.setValue("4번("+dto.getAnswer4()+"명)", dto.getAnswer4());
  PiePlot3D plot = new PiePlot3D(dataset);         //값을 넣어서 3DChart를 생성한다.
  chart = new JFreeChart(
     "설문조사 통계",
     JFreeChart.DEFAULT_TITLE_FONT,
     plot,
     true
          ); //true는 범례설정
  plot.setOutlineVisible(false);  //사각 테두리 사용하지 않음
  chart.setBackgroundPaint(java.awt.Color.WHITE); //background color설정
  new PollChart().createImage(path, chart);   //png파일로 저장해서 저장한 폴더위치에 저장하자
  
  return chart;
 }
 
 /*bar 3D chart*/
 public static JFreeChart getBar3dChart(ChartDTO dto)throws Exception {
  String path="D://JAVA/java document/web 2/workspace/struts2/WebContent/chart_images/bar3d.png";
  JFreeChart chart = null;
  DefaultCategoryDataset dataset = new DefaultCategoryDataset();
  dataset.setValue(dto.getAnswer1(), "1번", "1번("+dto.getAnswer1()+"명)");
  dataset.setValue(dto.getAnswer2(), "2번", "2번("+dto.getAnswer2()+"명)");
  dataset.setValue(dto.getAnswer3(), "3번", "3번("+dto.getAnswer3()+"명)");
  dataset.setValue(dto.getAnswer4(), "4번", "4번("+dto.getAnswer4()+"명)");
  /*
  chart = ChartFactory.createBarChart3D(
    "설문조사 통계",
    "선택항목",
    "인원수",
    dataset,
    PlotOrientation.VERTICAL,
    true, false, false);
  */
  CategoryAxis3D axis = new CategoryAxis3D("선택항목");
  NumberAxis3D numAxis = new NumberAxis3D("인원수");
  BarRenderer3D renderer = new BarRenderer3D(35.0,10.0);
  renderer.setItemMargin(0.10);
  renderer.setShadowVisible(true);
  CategoryPlot plot = new CategoryPlot(dataset,axis,numAxis, renderer);
  chart = new JFreeChart(
    "설문조사 통계",
    JFreeChart.DEFAULT_TITLE_FONT,
    plot,
    false
  );
  chart.setBackgroundPaint(java.awt.Color.WHITE);
  new PollChart().createImage(path, chart);
  return chart;
 }
 
 /*image 생성부분*/
 public void createImage(String file, JFreeChart chart)throws Exception {
  ChartRenderingInfo info = new ChartRenderingInfo(
                      new StandardEntityCollection());
  ChartUtilities.saveChartAsPNG(new File(file), chart, 380, 300, info);
 }

}

----------------------------------------------------------------------------------------------------------
사진 파일을 저장할 위치를 프로젝트가 접근 가능한 폴더에 넣어야 jsp페이지에서 링크 걸때 정확하게 걸린다.

'Framework > STRUTS 2' 카테고리의 다른 글

struts2 - struts 2의 Exception 처리  (2) 2009.08.09
struts 2 - 스트러츠2 + spring 연동하기  (2) 2009.07.12
struts 2 - Tiles Plug in  (6) 2009.07.08
struts 2 - Interceptor  (3) 2009.07.06
struts 2 - properties 파일  (1) 2009.07.05