2011-09-06 6 views
0

포틀릿 (Vaadin/Liferay 포털)의 버튼 또는 메뉴 선택 klick을 통해 내 차트 (파이) (배경색 데이터 세트 색상 등등 ..)의 색상을 변경하고 싶습니다. 내가하고 싶은 것은 내가 메뉴 선택에 klick 때 색상이 변경되도록 서블릿에 선택한 색상을 보내, 포틀릿의 JFreeChart

import org.jfree.data.jdbc.JDBCPieDataset; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartUtilities; 

import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.ServletException; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.sql.SQLException; 
import java.sql.DriverManager; 
import java.sql.Connection; 

public class PieChart extends HttpServlet { 


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

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    Connection connection = null; 
    try { 
     Class.forName("org.postgresql.Driver").newInstance(); 
     try { 
      connection = DriverManager.getConnection(
        "jdbc:postgresql://localhost:5432/db", "user", 
        "password"); 
     } catch (SQLException e) { 
     e.printStackTrace(); 
     } 
    } 
    catch (InstantiationException e) { 
     e.printStackTrace(); 
    } 
    catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } 
    catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 

    JDBCPieDataset dataset = new JDBCPieDataset(connection); 
    try { 
     dataset.executeQuery("Select * From my_table"); 
     JFreeChart chart = ChartFactory.createPieChart("Pie Chart", dataset, true, false, false); 
     if (chart != null) { 
     response.setContentType("image/png"); 
     OutputStream out = response. 
     getOutputStream(); 
     ChartUtilities.writeChartAsPNG(out, chart, 450, 400); 
     } 
    } 
    catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    try { 
     if(connection != null){connection.close();} 
    } 
    catch (SQLException e) {e.printStackTrace();} 
} 

입니다

(이미 : 내가 좀 어떻게 여기에 수행하는 단서가 없다 나의 서블릿이다 메뉴).

어떤 안내 나 비슷한 것이 좋을 것입니다.


이제 차트의 배경색을 변경하고 싶다고합시다. 나는 chart.setBackgroundPaint (Color.blue)를 사용할 것이다; 서블릿에서 색상을 수동으로 변경하십시오. 하지만 난이 포틀릿에서 그것을 할 내가 할 tryed 것을되고 싶어 : 나는 메뉴를 구성 init 메소드에서

PieChart pie; 

및 클릭에 색상을 보내려고

final MenuBar.MenuItem config = menubar.addItem("Config", null); 

newItem.addItem("PieChart", new Command(){ 
     public void menuSelected(MenuItem selectedItem) { 
      pie.chart.setBackgroundPaint(Color.blue); 
     } 
}); 

내가 사용 하위 클래스의 배경색을 다른 클래스에서 바꾼다면 괜찮습니다.하지만 서블릿 내에서 작동하지 않는 것 같습니다.

+0

Btw은 : 당신은 내가 실제로 사용하는 내 포틀릿에서 이미지를 표시하려면 ... – home

답변

2

포틀릿의 작업 단계 (메뉴를 클릭 할 때 실행 됨)와 서블릿 요청은 완전히 다른 요청임을 이해해야합니다.

나는 Vaadin의 복잡함을 모르지만 JSF와 같은 서버 측 구성 요소 모델이라고 가정합니다. 따라서 귀하의 menuSelected 방법에서 차트의 색을 변경해야합니다 (귀하가 귀하의 질문에 대한 수정을 통해 귀하에게 보였습니다). 이것은 맞지만, pie과 그 데이터는 서블릿과 어떻게 공유됩니까? 이 서블릿은 색상을 사용할 것이므로 어떻게 든 전달해야합니다.

  • 공유 세션 상태
  • url 매개 변수

일반적으로, 공유 세션 상태가 나쁜 생각은 그것 때문에 단단히 커플 :이 부부가 여기에 나열되어있는 여러 가지 방법 중 하나를 통해 할 수있다 구성 요소를 함께. 매개 변수에 중요한 데이터가 포함되어 있으면 URL 매개 변수가 잘못된 옵션이 될 수 있습니다. 그러나 귀하의 예를 들어 URL 매개 변수는 완벽하게 괜찮습니다.

덧글에 작성한 정보로 이동하려면 Label 구성 요소를 사용하여 <img> 태그를 렌더링합니다. 요청에서 읽을 수있는

new Label("<img src='/path/to/servlet?background=blue'>",Label.CONTEXT_XHTML)); 

그래서이 URL 매개 변수는 서블릿 볼 수 있습니다 : 그래서 지금처럼 서블릿 URL 매개 변수를 추가 할 수 있습니다

new Label("img link",Label.CONTEXT_XHTML)); 

: 당신은 같은 것을 말 매개 변수 (아래 예와 같이)를 입력하고 chart에 색상을 설정합니다.

사용자의 입력 요구 사항 외에도 코드를 약간 재정렬 할 것입니다. 주로 JDBC 드라이버 초기화를 서블릿의 init() 메소드로 옮기고 finally 블록에서 연결이 닫혀 있는지 확인합니다. @home은 연결 풀을 잡기 위해 연결 풀을 사용하는 것이 가장 이상적이라는 의견을 제시합니다.

요청 매개 변수를 가져 와서 차트와 함께 사용하는 방법을 보여주는 몇 가지 의견을 추가했습니다. (편집 - 색상을 설정하기위한 기본 논리를 추가했습니다).

public class PieChart extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    public void init() throws ServletException { 
     super.init(); 
     try { 
      Class.forName("org.postgresql.Driver").newInstance(); 
     } catch (InstantiationException e) { 
      throw new ServletException(e); 
     } catch (IllegalAccessException e) { 
      throw new ServletException(e); 
     } catch (ClassNotFoundException e) { 
      throw new ServletException(e); 
     } 
    } 

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     String background = request.getParameter("background"); 
     // do some checks on colour here 
     // such as null check and checking it is a valid colour value for your 
     // chart 

     Connection connection = null; 
     try { 
      connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/db", "user", "password"); 
      JDBCPieDataset dataset = new JDBCPieDataset(connection); 
      dataset.executeQuery("Select * From my_table"); 
      JFreeChart chart = ChartFactory.createPieChart("Pie Chart", dataset, true, false, false); 

      if ("blue".equals(background)) { 
       chart.setBackgroundPaint(Color.blue) 
      } 

      // why the null test? can chart ever be (sensibly) null? 
      if (chart != null) { 
       response.setContentType("image/png"); 
       OutputStream out = response.getOutputStream(); 
       ChartUtilities.writeChartAsPNG(out, chart, 450, 400); 
      } 
     } catch (SQLException e) { 
      log("Exception retrieving chart data", e); 
     } finally { 
      if (connection != null) { 
       try { 
        connection.close(); 
       } catch (SQLException e) { 
        log("Could not close Connection", e); 
       } 
      } 
     } 
    } 
} 
+0

을 연결 풀링의 개념 (은 javax.sql.DataSource)를 살펴해야 img 태그 : (만약 angel) 윈도우 창 = 새 창 (새 레이블 ("img link", Label.CONTEXT_XHTML)); 나를 위해 잘 작동합니다 (현재). – Kiesa

+0

완벽한, 단지 내가 필요한 것 나는 빚지고있다 :) – Kiesa

+0

좋아요! 의견을 보내 주셔서 감사 드리며 다른 것이 필요한 경우 알려주십시오. –