기능 및 이벤트 흐름 정의

이 섹션에서는 AdvancedExampleServlet2를 소개합니다. AdvancedExampleServlet2는 기능 및 이벤트 흐름을 정의하는 데이터 소스 구현의 예입니다. 이 섹션에서는 AdvancedExampleServlet2를 실행하고 테스트하는 방법에 관한 단계별 안내도 제공합니다.

참고: 이 섹션을 시작하기 전에 시작하기 섹션을 완료해야 합니다.

AdvancedExampleServlet2 소개

AdvancedExampleServlet2 클래스는 examples 패키지에 있습니다. 이 클래스는 이벤트 기능과 기능을 정의하는 구현 예를 제공합니다.

AdvancedExampleServlet2의 가장 중요한 부분은 다음 섹션에 설명되어 있습니다.

이벤트 흐름 정의

AdvancedExampleServlet2HttpServlet.doGet() 메서드를 재정의하고 DataSourceHelper에서 제공하는 다양한 도우미 함수를 호출하여 이벤트 흐름을 정의합니다.

다음 스니펫은 doGet()를 재정의합니다. HttpServletRequest 매개변수는 시각화를 통해 생성된 요청을 서블릿에 캡슐화합니다. HttpServletResponse 매개변수는 서블릿의 응답을 쿼리 시각화로 캡슐화합니다. 또한 이 스니펫은 dsRequest를 null로 설정합니다. dsRequest 코드의 나머지 부분 전반에 걸쳐 다양한 지점에서 사용됩니다.

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    DataSourceRequest dsRequest = null;

다음 스니펫은 HttpServletRequest에서 요청 매개변수를 추출하여 요청이 실행되는 컨텍스트를 만듭니다.

    try {
      // Extract the request parameters.
      dsRequest = new DataSourceRequest(req);

다음 스니펫은 dsRequest 객체에서 쿼리를 가져와 두 개의 별도 쿼리로 분할합니다. 한 쿼리는 데이터 소스 쿼리라고 하고, 다른 쿼리는 완료 쿼리입니다. 데이터 소스에서 선언된 기능은 SELECT이므로 데이터 소스 쿼리는 dsRequest 객체에 SELECT 작업이 포함된 경우 SELECT 작업으로 구성됩니다. 완료 쿼리는 요청에 필요한 다른 모든 작업으로 구성되며 SELECT 작업도 포함될 수 있습니다. 예를 들어 요청된 쿼리가 SELECT a ORDER BY b이면 데이터 소스 쿼리는 SELECT a, b이고 완료 쿼리는 원본 쿼리 SELECT a ORDER BY b와 동일합니다.

      // Split the query.
      QueryPair query = DataSourceHelper.splitQuery(dsRequest.getQuery(), Capabilities.SELECT);

다음 스니펫은 이전 스니펫과 HttpServletRequest,에서 만든 데이터 소스 쿼리를 사용하여 데이터 테이블을 만듭니다. 자세한 내용은 기능 사용 섹션을 참고하세요.

      // Generate the data table.
      DataTable data = generateMyDataTable(query.getDataSourceQuery(), req);

다음 코드는 쿼리가 분할될 때 생성된 완료 쿼리, 이전 스니펫에서 생성된 데이터 테이블, 쿼리 시각화의 사용자 언어를 사용합니다. 그러면 코드가 새 데이터 테이블을 만듭니다.

      // Apply the completion query to the data table.
      DataTable newData = DataSourceHelper.applyQuery(query.getCompletionQuery(), data,
          dsRequest.getUserLocale());

다음 코드는 이전 스니펫에 의해 생성된 데이터 테이블과 HttpServletRequest의 요청 매개변수입니다. 그런 다음 코드를 사용하여 서블릿 응답을 설정합니다. 서블릿 컨테이너는 쿼리 시각화에 이 응답을 반환합니다.

      DataSourceHelper.setServletResponse(newData, dsRequest, resp);

오류 처리

다음 스니펫은 예외를 포착하고, 적절한 메시지를 가져오고, 응답의 형식을 지정하고, 서블릿 응답을 설정합니다. dsRequest가 null이면 아마도 생성자 실패로 인해 DataSourceRequest를 사용할 수 없는 것입니다. 이 경우 DataSourceRequest 대신 HttpRequest이 사용됩니다.

    catch (RuntimeException rte) {
      log.error("A runtime exception has occured", rte);
      ResponseStatus status = new ResponseStatus(StatusType.ERROR, ReasonType.INTERNAL_ERROR,
          rte.getMessage());
      if (dsRequest == null) {
        dsRequest = DataSourceRequest.getDefaultDataSourceRequest(req);
      }
      DataSourceHelper.setServletErrorResponse(status, dsRequest, resp);
    } catch (DataSourceException e) {
      if (dsRequest != null) {
        DataSourceHelper.setServletErrorResponse(e, dsRequest, resp);
      } else {
        DataSourceHelper.setServletErrorResponse(e, req, resp);
      }
    }

URL 매개변수 사용

다음 스니펫은 쿼리가 분할될 때 생성된 데이터 소스 쿼리 및 HttpServletRequest을 사용합니다. HttpServletRequest는 URL로 지정된 tableId 매개변수를 선택적으로 포함할 수 있습니다. 이 tableId 매개변수는 다음과 같이 반환될 데이터 테이블을 결정합니다.

  • tableId 매개변수가 생략되었거나 planets 이외의 값이면 데이터 소스가 동물 데이터 테이블을 반환합니다.
  • tableId 매개변수가 planets로 지정된 경우 데이터 소스가 행성 데이터 테이블을 반환합니다.

데이터 테이블을 반환하는 코드를 직접 작성할 때는 사용할 매개변수를 결정합니다.

  private DataTable generateMyDataTable(Query query, HttpServletRequest req)
      throws TypeMismatchException {
    String tableID = req.getParameter("tableId");
    if ((tableID != null) && (tableID.equalsIgnoreCase("planets"))) {
      return generatePlanetsTable(query);
    }
    return generateAnimalsTable(query);
  }

기능 사용하기

다음 스니펫은 쿼리를 사용하고 animals 데이터 테이블을 생성합니다.

private DataTable generateAnimalsTable(Query query) throws TypeMismatchException {
  DataTable data = new DataTable();
  List requiredColumns = getRequiredColumns(query,
      ANIMAL_TABLE_COLUMNS);
  data.addColumns(requiredColumns);

  // Populate the data table
  for (String key : animalLinksByName.keySet()) {
    TableRow row = new TableRow();
    for (ColumnDescription selectionColumn : requiredColumns) {
      String columnName = selectionColumn.getId();
      if (columnName.equals(ANIMAL_COLUMN)) {
        row.addCell(key);
      } else if (columnName.equals(ARTICLE_COLUMN)) {
        row.addCell(animalLinksByName.get(key));
      }
    }
    data.addRow(row);
  }
  return data;
}

다음 스니펫은 쿼리를 사용하고 planets 데이터 테이블을 생성합니다.

private DataTable generatePlanetsTable(Query query) throws TypeMismatchException {
  DataTable data = new DataTable();
  List requiredColumns = getRequiredColumns(
      query, planetTableColumns);
  data.addColumns(requiredColumns);

  // Populate data table
  for (Planet planet : Planet.values()) {
    TableRow row = new TableRow();
    for (ColumnDescription selectionColumn : requiredColumns) {
      String columnName = selectionColumn.getId();
      if (columnName.equals(PLANET_COLUMN)) {
        row.addCell(planet.name());
      } else if (columnName.equals(MASS_COLUMN)) {
        row.addCell(planet.getMass());
      } else if (columnName.equals(GRAVITY_COLUMN)) {
        row.addCell(planet.getSurfaceGravity());
      } else if (columnName.equals(MOONS_COLUMN)) {
        row.addCell(planet.getNumberOfMoons());
      }
    }
    data.addRow(row);
  }
  return data;
}

AdvancedExampleServlet2 실행 및 테스트

이 섹션에서는 AdvancedExampleServlet2를 실행하고 테스트하는 방법을 안내합니다.

AdvancedExampleServlet2을 실행하고 테스트하려면 웹 애플리케이션을 업데이트하고 다음 섹션에 설명된 대로 데이터 소스를 쿼리하는 시각화를 설정합니다.

Apache Tomcat에서 웹 애플리케이션 업데이트

아래 안내에 따라 Apache Tomcat에서 웹 애플리케이션을 업데이트하세요. 다음 안내는 Windows 시스템의 Apache Tomcat에만 적용됩니다.

  1. 이전에 WEB-INF 디렉터리에 복사한 web.xml 파일에는 이 예시에 필요한 정의와 매핑이 이미 포함되어 있습니다. 이를 정의하는 행은 다음과 같습니다.

    <servlet>
      <servlet-name>AdvancedExampleServlet2</servlet-name>
      <description>
      AdvancedExampleServlet2
      </description>
      <servlet-class>AdvancedExampleServlet2</servlet-class>
    </servlet>
      
    <servlet-mapping>
      <servlet-name>AdvancedExampleServlet2</servlet-name>
      <url-pattern>/advanced</url-pattern>
    </servlet-mapping> 
  2. Tomcat을 시작하거나 이미 실행 중인 경우 Tomcat을 다시 시작합니다.
  3. 다음 링크를 클릭합니다. http://localhost:8080/myWebApp/advanced
    화면 너비에 따라 화면에 6~7줄의 텍스트가 표시됩니다. 텍스트는 google.visualization.Query.setResponse 로 시작하고 {v:'http://en.wikipedia.org/wiki/Tiger'}]}]}});로 끝납니다.
    CSV 데이터 소스가 시각화에 보내는 응답입니다.

시각화를 사용하여 데이터 보기

<data_source_library_install>/examples/src/html 디렉터리의 all_examples.html 파일을 사용하여 데이터 시각화를 볼 수 있습니다.

all_examples의 다음 스니펫은 advanced 서블릿, planets 테이블, 선택 쿼리, 막대 그래프 시각화를 지정합니다.

query = new google.visualization.Query('advanced?tableId=planets&tq=select planet,mass');
...
var chart = new google.visualization.BarChart(document.getElementById('advanced_div'));

all_examples.html에 포함된 다른 시각화에 대한 설명은 외부 데이터 저장소 사용 섹션을 참조하세요.

시각화를 지정하고 쿼리 언어를 사용하는 방법에 관한 자세한 내용은 차트 사용쿼리 언어 참조를 확인하세요.

고급 데이터 소스에서 제공하는 데이터의 시각화를 보려면 아래 안내를 따르거나 조정합니다.

  1. 아직 하지 않았다면 all_examples.html 파일을 <data_source_library_install>/examples/src/html 디렉터리
    에서 <tomcat_home>/webapps/myWebApp/ 디렉터리로 복사합니다.
     
  2. 브라우저에서 http://localhost:8080/myWebApp/all_examples.html 링크를 클릭합니다. 다음과 같이 표시됩니다.

다음 단계

라이브러리와 함께 제공되는 예를 더 살펴보려면 빠른 참조 예를 참고하세요. 복잡한 데이터 소스 구현에 대한 자세한 내용은 구현 팁을 참고하세요.