Yetenekleri Tanımlama ve Etkinliklerin Akışı

Bu bölümde AdvancedExampleServlet2 tanıtılmaktadır. AdvancedExampleServlet2, özellikleri ve etkinlik akışını tanımlayan bir veri kaynağı uygulaması örneğidir. Bu bölümde, AdvancedExampleServlet2 komut dosyasını çalıştırma ve test etmeyle ilgili adım adım talimatlar da verilmiştir.

Not: Bu bölüme başlamadan önce Başlarken bölümünü tamamlamanız gerekir.

Karşınızda AdvancedExampleServlet2

AdvancedExampleServlet2 sınıfı examples paketinde yer alıyor. Bu sınıf, etkinliklerin özelliklerini ve akışını tanımlayan bir örnek uygulama sağlar.

AdvancedExampleServlet2 ürününün en önemli bölümleri aşağıdaki bölümlerde açıklanmıştır:

Etkinlik akışını tanımlama

AdvancedExampleServlet2, HttpServlet.doGet() yöntemini geçersiz kılarak ve DataSourceHelper tarafından sağlanan çeşitli yardımcı işlevleri çağırarak etkinlik akışını tanımlar.

Aşağıdaki snippet doGet() değerini geçersiz kılar. HttpServletRequest parametresi, servlet'e görselleştirme tarafından yapılan isteği içerir. HttpServletResponse parametresi, servlet'ten sorgu görselleştirmeye verilen yanıtı içerir. Bu snippet aynı zamanda dsRequest öğesini boş olarak ayarlar. dsRequest kodun geri kalanında çeşitli noktalarda kullanılır.

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

Aşağıdaki snippet, isteğin çalıştığı bağlamı oluşturmak için HttpServletRequest parametresinden istek parametrelerini çıkarır.

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

Aşağıdaki snippet, sorguyu dsRequest nesnesinden alıp iki ayrı sorgu halinde böler. Bir sorguya veri kaynağı sorgusu, diğerine de tamamlanma sorgusu denir. Veri kaynağının bildirdiği özellik SELECT olduğundan, dsRequest nesnesinde SELECT işlemi varsa veri kaynağı sorgusu SELECT işleminden oluşur. Tamamlama sorgusu, isteğin gerektirdiği diğer tüm işlemleri (bir SELECT işlemini de içerebilir) içerir. Örneğin, istenen sorgu SELECT a ORDER BY b ise veri kaynağı sorgusu SELECT a, b ve tamamlama sorgusu, orijinal sorgu (SELECT a ORDER BY b) ile aynı olur.

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

Aşağıdaki snippet, önceki snippet ve HttpServletRequest, tarafından oluşturulan veri kaynağı sorgusunu alıp bir veri tablosu oluşturur. Daha ayrıntılı bilgi için Özellikleri kullanma bölümüne bakın.

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

Aşağıdaki kod, sorgu bölündüğünde oluşturulan tamamlanma sorgusunu, önceki snippet tarafından oluşturulan veri tablosunu ve sorgu görselleştirmesinden kullanıcı yerel ayarını alır. Ardından kod, yeni bir veri tablosu oluşturur.

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

Aşağıdaki kod, önceki snippet tarafından oluşturulan veri tablosunu ve HttpServletRequest kaynağından istek parametrelerini alır. Ardından kod, servlet yanıtını ayarlar. Serlet kapsayıcı, bu yanıtı sorgu görselleştirmesine döndürür.

      DataSourceHelper.setServletResponse(newData, dsRequest, resp);

Kullanım hataları

Aşağıdaki snippet bir istisnayı yakalar, uygun mesajı alır, yanıtı biçimlendirir ve servlet yanıtını ayarlar. dsRequest Boşsa, muhtemelen oluşturucunun başarısız olması nedeniyle DataSourceRequest kullanılamaz. Bu durumda, DataSourceRequest yerine HttpRequest kullanılır.

    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 parametrelerini kullanma

Aşağıdaki snippet, sorgu bölündüğünde oluşturulan veri kaynağı sorgusunu ve HttpServletRequest öğesini alır. HttpServletRequest isteğe bağlı olarak URL olarak belirtilen bir tableId parametresi içerebilir. Bu tableId parametresi, hangi veri tablosunun aşağıdaki gibi döndürüldüğünü belirler:

  • tableId parametresi atlanırsa veya planets dışında bir şeyse veri kaynağı, hayvanlar veri tablosunu döndürür.
  • tableId parametresi planets olarak belirtilirse veri kaynağı, gezegenler veri tablosunu döndürür.

Veri tablosu döndürmek için kendi kodunuzu yazdığınızda hangi parametreleri alacağınıza karar verirsiniz.

  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);
  }

Özellikleri kullanma

Aşağıdaki snippet, sorguyu alarak animals veri tablosunu oluşturur.

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;
}

Aşağıdaki snippet, sorguyu alarak planets veri tablosunu oluşturur.

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;
}

Çalıştırma ve Test Etme AdvancedExampleServlet2

Bu bölümde, AdvancedExampleServlet2'nun çalıştırılması ve test edilmesiyle ilgili talimatlar verilmiştir.

AdvancedExampleServlet2 oyununu çalıştırmak ve test etmek için web uygulamanızı güncelleyin ve aşağıdaki bölümlerde açıklandığı gibi, veri kaynağını sorgulayan bir görselleştirme oluşturun:

Apache Tomcat'ta Web Uygulamasını Güncelleme

Apache Tomcat'te web uygulamanızı güncellemek için aşağıdaki talimatları uygulayın veya uyarlayın. Bu talimatlar bir Windows sisteminde Apache Tomcat'e özeldir:

  1. Daha önce WEB-INF dizinine kopyaladığınız web.xml dosyası, bu örnek için gereken tanımı ve eşlemeyi zaten içeriyor. Bunu tanımlayan satırlar:

    <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'i başlatın veya zaten çalışıyorsa Tomcat'i yeniden başlatın.
  3. Şu bağlantıyı tıklayın: http://localhost:8080/myWebApp/advanced
    Ekran genişliğinize bağlı olarak ekranda 6-7 satırlık metinler gösterilir. Metin google.visualization.Query.setResponse ile başlar ve {v:'http://en.wikipedia.org/wiki/Tiger'}]}]}}); ile biter
    Bu, örnek CSV veri kaynağının görselleştirmeye gönderdiği yanıttır.

Verileri Görüntülemek için Görselleştirmeyi Kullanma

<data_source_library_install>/examples/src/html dizinindeki all_examples.html dosyası, verilerin görselleştirmesini görüntülemek için kullanılabilir.

Aşağıdaki all_examples snippet'i, advanced servlet'i, planets tablosunu, belirli bir sorguyu ve bir çubuk grafik görselleştirmesini belirtir.

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 içindeki diğer görselleştirmelerin açıklaması için Harici Veri Deposu Kullanma bölümünü inceleyin.

Görselleştirme belirtme ve sorgu dilini kullanma hakkında daha fazla bilgi için Grafikleri Kullanma ve Sorgu Dili Referansı bölümlerine bakın.

Gelişmiş veri kaynağı tarafından sağlanan verilerin görselleştirmesini görüntülemek için aşağıdaki talimatları uygulayın veya uyarlayın:

  1. Henüz yapmadıysanız all_examples.html dosyasını <data_source_library_install>/examples/src/html dizininden
    dizinine <tomcat_home>/webapps/myWebApp/ dizinine kopyalayın.
     
  2. Şu bağlantıyı tıklayın: Bir tarayıcıda http://localhost:8080/myWebApp/all_examples.html adresini tıklayın. Aşağıdaki ekranı görmeniz gerekir:

Sonraki Adımlar

Kitaplıkla birlikte verilen örnekleri daha ayrıntılı incelemek için Örnekler Hızlı Referans'a bakın. Karmaşık bir veri kaynağını uygulama hakkında daha fazla bilgi için Uygulama İpuçları konusuna bakın.