2009-12-29 3 views
4

상황 : 내 'metrics.jsp'페이지에서 차트를 만드는 데 필요한 몇 가지 변수를 제출합니다. 'ProjectActionBean.java'는 JFreeChart를 생성하는 몇 가지 다른 Java 클래스를 호출합니다. 차트를 팝업으로 표시 할 수 있지만 원본 브라우저 창에 표시하려고합니다.스트라이프 프레임 워크를 사용하여 웹 브라우저에 JFreeChart를 표시하는 방법

JFreeChart placeChart = ChartFactory.createBarChart(
            "ChartName", 
       "",    //x-axis label 
       "",    //y-axis label 
       dataset, 
       PlotOrientation.VERTICAL, 
       false,   //legend 
       true,   //tooltype 
       false);   //generate urls 
     ChartFrame frame = new ChartFrame(name, placeChart); 
     frame.pack(); 
     frame.setVisible(true); 

답변

5

내가이 같은 응용 프로그램을 작성했습니다, 그래서 그것을이 가능입니다 :)

먼저 말씀 드릴 수 있습니다, 당신은 GUI의 아무것도를 제거해야합니다. 서버에 GUI가 없어도됩니다. 즉, ChartFrame frame이 버려졌습니다. 차트를 만드는 내 주요 루틴은 다음과 같습니다

private void createChart(XYPlot plot, String fileName, String caption) throws IOException { 
     JFreeChart chart = new JFreeChart(caption, plot); 
     chart.addSubtitle(this.subtitle); 
     if (plot.getRangeAxis() instanceof LogarithmicAxis) { 
     chart.addSubtitle(1, new TextTitle("(logarithmische Skala)")); 
     } 
     File file = new File(fileName); 
     file.delete(); 
     ChartUtilities.saveChartAsPNG(file, chart, CHART_WIDTH, CHART_HEIGHT); 
    } 

이것은 당신이 당신의 웹 페이지에서 <img>로까지 제공 할 수있는 파일을 만듭니다. 또는 (조금 더 고급) ChartUtilities를 사용하여 이미지 URL에 대한 요청에 응답하여 제공 할 수있는 스트림을 만들 수 있습니다.

마술의 또 다른 비트는 GUI없이 그래픽 코드를 실행하고 있다고 Java에 알리는 것입니다. 환경 변수를 설정해야합니다

-Djava.awt.headless=true 

Tomcat과 같은 웹 응용 프로그램 서버의 경우 Tomcat 시작 스크립트로 이동합니다.


업데이트

좋아 그래 수행하지 않는 'ChartUtilities.saveChartAsPNG();' 차트를 파일 시스템에 저장하면됩니까? 사용자가 변수를 입력하고 브라우저에서 차트를 직접 표시 할 수있게하려고합니다.

사용자가 한 명이라면 이미지를 파일 시스템에 쓰는 것이 설명하는 시나리오에 적합합니다. 실제로 이것이 저의 첫 번째 버전입니다. 사용자가 매개 변수를 지정한 양식의 HTML 응답 페이지에 4 <img> 태그가 있습니다. 내 이미지가있는 4 개의 파일 이름을 가리키는 파일입니다. 오랫동안 사용자에게 대답을 보내기 전에 해당 파일을 작성하는 것이 좋습니다.

여러 명의 사용자가있는 경우 문제가 발생합니다. 그러면 다른 사용자가 지정한 차트를 볼 수 있습니다. 사용자의 ID 또는 세션을 차트 파일 이름으로 인코딩 할 때 가능한 회피 방법이 있지만 추악합니다. 각 이미지의 주문형 동적 생성을 기반으로 한 더 나은 방법이 있습니다.

난 당신이 HTML/HTTP에 대해 얼마나 알고 있는지 모른다, 그래서 나는이 지루 당신에게 않을거야 희망 : 주어진 HTTP 요청에 대한

만의 단일 스트림을 반환 할 수 있습니다 데이터. 일반적으로 HTML 페이지, 즉 텍스트 스트림입니다. HTML 페이지에 이미지가 필요한 경우 <img> 링크를 다른 URL로 HTML 페이지에 삽입하면 이면서 페이지 만 텍스트로 가득 채워집니다. 브라우저 다음이 진행되고 <img> 태그에 언급 된 URL에 대한 요청을 실행하여 이미지를 요청합니다. 이미지가 파일 시스템의 파일 일 때 이것은 매우 쉽습니다.차트와 같이 동적으로 생성 된 이미지를 원한다면, 생성하고자하는 각 종류의 이미지에 대한 URL을 생각해 내야하며, 각 URL을 그러한 이미지를 생성하는 방법을 알고있는 서블릿에 매핑해야합니다.

내 앱에는 한 페이지에 4 개의 다른 차트가 있었기 때문에 내 HTML 페이지에는 동일한 차트 생성 서블릿에 매핑 된 네 개의 다른 URL이있는 4 <img> 태그가 있었지만 URL에 서블릿에 어떤 매개 변수가 있는지 종류의 차트가 필요했습니다. 요청을 받으면 서블릿은 JFreeChart 매직을 수행 한 다음 ChartUtilities.writeChartAsPNG()을 사용하여 생성 된 이미지를 서블릿의 출력 스트림으로 덤프합니다.

+0

좋아 그래 미상 :

@DefaultHandler public Resolution view() { JFreeChart chart = ... return new ChartStreamingResolution(chart); } 

사용자 정의 StreamingResolution은 다음과 같습니다 'ChartUtilities.saveChartAsPNG();'가 아닙니다. 차트를 파일 시스템에 저장하면됩니까? 사용자가 변수를 입력 할 수있게하고 브라우저에서 차트를 직접 표시 할 수있게하려고합니다. 내가 제공 한 코드로 할 수 있습니까? 고마워요 – robbie

+0

아니요, 그게 제가 "고급"옵션이라고 부른 것입니다. 내 대답을 몇 가지 힌트로 업데이트하겠습니다. –

2

이미지 (바이트 스트림)를 출력 스트림에 클라이언트에 쓰는 서블릿을 작성해야합니다. 파일을 만들 필요가 없습니다. 기본적으로 다음과 같이 작동해야합니다.

public class ChartServlet extends HttpServlet { 
    @Override 
    protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException { 

     JFreeChart chart = .. // create your chart 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    ChartUtilities.writeChartAsPNG(bos, chart, width, height); 

      response.setContentType("image/png"); 
      OutputStream out = new BufferedOutputStream(response.getOutputStream()); 
      out.write(bos.toByteArray()); 
      out.flush(); 
      out.close(); 
    } 
} 

그런 다음 web.xml에서 URL로 매핑하고 HTML/JSP의 "img"태그에서 사용하십시오. 분명히 당신은 그것을 매개 변수를 전달할 수 등

1

당신이 thusly 히 StreamingResolution의 사용자 지정 확장, 사용할 수있는 줄무늬 프레임 워크 내에서 유지하려면 다음의 URL을 대표하는 새로운 정상하는 ActionBean 구현을 작성

을 차트는 (당신의 img 태그에 포함 할) :

public class ChartStreamingResolution extends StreamingResolution { 
    private JFreeChart chart; 
    public ChartStreamingResolution(JFreeChart chart) { 
     super("image/png"); 
     this.chart = chart; 
    } 

    @Override 
    public void stream(HttpServletResponse response) { 
     try { 
      ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
      ChartUtilities.writeChartAsPNG(bos, chart, 400, 200); 
      OutputStream out = new BufferedOutputStream(response.getOutputStream()); 
      out.write(bos.toByteArray()); 
      out.flush(); 
      out.close(); 
     } catch (Exception e) { 
      //something sensible 
     } 
    } 
} 
관련 문제