הקטע הזה מציג את 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(); ListrequiredColumns = 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(); ListrequiredColumns = 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:
- הקובץ
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>
- מפעילים את Tomcat או מפעילים מחדש את Tomcat, אם הוא כבר פועל.
- לוחצים על הקישור הבא: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
, תוכלו לעיין בקטע שימוש בחנות נתונים חיצונית.
רוצים לדעת איך לציין תצוגה חזותית ולהשתמש בשפת השאילתה? מומלץ לקרוא את המאמר שימוש בתרשימים ואת ההפניה לשפת השאילתה.
כדי לראות תצוגה חזותית של הנתונים שמספקים מקור הנתונים המתקדם:
- אם עדיין לא עשית זאת, כדאי להעתיק את הקובץ
all_examples.html
מספריית<data_source_library_install>/examples/src/html
אל ספריית<tomcat_home>/webapps/myWebApp/
.
- יש ללחוץ על הקישור הבא: http://localhost:8080/myWebApp/all_examples.html בדפדפן. אתם אמורים לראות את הנתונים הבאים:
השלבים הבאים
כדי לעיין בפירוט של הדוגמאות שמסופקות עם הספרייה, ראו דוגמאות הפניות מהירות. מידע נוסף על הטמעה של מקור נתונים מורכב זמין במאמר טיפים להטמעה.