기능 및 이벤트 흐름 정의

이 섹션에서는 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 객체에서 쿼리를 가져와서 이를 별도의 쿼리 2개로 분할합니다. 하나는 데이터 소스 쿼리이고 다른 하나는 완료 쿼리입니다. 데이터 소스의 선언된 기능은 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. 아직 복사하지 않았다면 <data_source_library_install>/examples/src/html 디렉터리
    에서 <tomcat_home>/webapps/myWebApp/ 디렉터리로 all_examples.html 파일을 복사합니다.
     
  2. 브라우저에서 http://localhost:8080/myWebApp/all_examples.html 링크를 클릭합니다. 다음과 같이 표시됩니다.

다음 단계

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