הגדרת יכולות וזרימת אירועים

הקטע הזה מציג את AdvancedExampleServlet2. AdvancedExampleServlet2 הוא הטמעה של מקור נתונים לדוגמה, שמגדירה יכולות וזרימת אירועים. בקטע הזה תמצאו הוראות מפורטות לבדיקה ולבדיקה של AdvancedExampleServlet2.

הערה: צריך להשלים את הקטע תחילת העבודה לפני שמתחילים את הקטע הזה.

חדש: AdvancedExampleServlet2

הכיתה AdvancedExampleServlet2 נמצאת בחבילה של examples. הכיתה הזו מספקת דוגמה להטמעה שמגדירה את היכולות ואת זרימת האירועים.

החלקים החשובים ביותר ב-AdvancedExampleServlet2 מתוארים בסעיפים הבאים:

הגדרת זרימת האירועים

AdvancedExampleServlet2 מגדיר את זרימת האירועים על ידי ביטול השיטה HttpServlet.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, שאילתת מקור הנתונים מורכבת מפעולה SELECT אם האובייקט dsRequest כולל פעולה 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 אינו זמין, אולי עקב בנאי. במקרה כזה, השדה HttpRequest יהיה בשימוש במקום המאפיין DataSourceRequest.

    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 יכול לכלול גם פרמטר 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. ההוראות הבאות הן ספציפיות ל-Apache Tomcat במערכת Windows:

  1. הקובץ web.xml שהעתקת בעבר לספרייה WEB-INF כבר מכיל את ההגדרה והמיפוי שנדרשים עבור הדוגמה הזו. השורות שמגדירים את ההגדרה הזו הן:

    <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 שולח לוויזואליזציה.

שימוש בהצגה חזותית כדי להציג את הנתונים

ניתן להשתמש בקובץ all_examples.html בספרייה <data_source_library_install>/examples/src/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 בדפדפן. אתם אמורים לראות את הנתונים הבאים:

השלבים הבאים

כדי לעיין בפירוט של הדוגמאות שמסופקות עם הספרייה, ראו דוגמאות הפניות מהירות. מידע נוסף על הטמעה של מקור נתונים מורכב זמין במאמר טיפים להטמעה.