טיפים להטמעה

בקטע הזה מתוארים כמה טיפים שיעזרו לכם לכתוב הטמעות מורכבות יותר של הספרייה:

שימוש ב-Servlet משלכם

ההטמעות הפשוטות ביותר של מקורות נתונים מקבלות בירושה מהמחלקה DataSourceServlet של הספרייה. כדי לרשת נתונים ממחלקה שאינה DataSourceServlet, צריך להטמיע מקור נתונים באופן הבא:

  1. מטמיעים את הממשק DataTableGenerator ומבטלים את getCapabilities() ואת generateDataTable().
  2. כדי להריץ את זרימת מקור הנתונים, קוראים ל-DataSourceHelper.executeDataSourceServletFlow() מהקוד של ה-servlet.השיטה הזו כוללת את הפרמטרים הבאים:
    • אובייקט HttpServletRequest.
    • אובייקט HttpServletResponse.
    • ההטמעה של הממשק DataTableGenerator משלב 1 שלמעלה.
    • ערך בוליאני שמציין מצב גישה מוגבלת או גישה בלתי מוגבלת.

לדוגמה, אם רוצים לרשת את ה-servlet מסיווג אחר של servlet, שנקרא AuthServlet שמספק אימות מובנה, אפשר לשכתב את SimpleServletExample כדי לרשת את AuthServlet במקום את DataSourceServlet באופן הבא:

  1. הטמעת הממשק של DataTableGenerator.
  2. מעבירים את generateDataTable() מההטמעה של DataSourceServlet להטמעה של DataTableGenerator.
  3. כדי להחזיר את הערך Capabilities.None, צריך לשנות את getCapabilities() בהטמעה של DataTableGenerator.
  4. קוראים ל-DataSourceHelper.executeDataSourceServletFlow() מקוד ה-servlet (doGet() או doPost()), ומעבירים את ההטמעה של DataTableGenerator. השיטה הזו מפעילה את כל התהליך של מקור הנתונים, כולל רינדור התוצאות של מקור הנתונים לתוך התגובה של ה-servlet.

אפשר להשתמש באותה שיטה אם משתמשים ב-framework של servlet, שבו בדרך כלל יורשים מחלקה מופשטת שמסופקת על ידי ה-framework. לדוגמה, אם אתם משתמשים ב-WebWork, יכול להיות שתרצו לרשת את המחלקה ActionSupport.

הגדרת יכולות

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

משתמשים ב-enum Capabilities כדי להגדיר את יכולות השאילתות שהקוד מספק. האפשרויות הזמינות הן:

  • NONE: ברירת המחדל, הקוד לא מספק פעולות שאילתה.
  • SQL: הקוד מספק פעולות של שאילתת SQL.
  • SORT_AND_PAGINATION: הקוד מספק גם פעולות של מיון וגם פעולות של חלוקה לדפים.
  • SELECT: הקוד מספק פעולה נבחרת.
  • ALL: הקוד מספק פעולות SQL, SORT_AND_PAGINATION ו-SELECT.

הערה: בכל המקרים, הספרייה מטפלת בפעולות שאילתה שלא סופקו על ידי הקוד שלכם.

כדי להטמיע יכולת שאינה NONE, צריך לעקוף את Capabilities.getCapabilities() ולהטמיע את DataTable.generateDataTable() כדי לשלוח שאילתות על מאגר הנתונים ולהחזיר טבלת נתונים.

שלוש הדוגמאות ממחישות איך להטמיע יכולות: AdvancedExampleServlet, AdvancedExampleServlet2 ו-SqlDataSourceServlet. כל השירותים כלולים בחבילה של example. במאמר הגדרת יכולות וזרימה של אירועים מוסבר על AdvancedExampleServlet2.

התאמה אישית של זרימת האירועים

זרימת האירועים שמוגדרת כברירת מחדל מוגדרת ב-DataSourceHelper.executeDataSourceServletFlow. תהליך ברירת המחדל הוא:

  1. חילוץ וניתוח פרמטרים של שאילתה.
  2. במצב גישה מוגבלת בלבד, צריך לוודא שהבקשה מגיעה מאותו דומיין כמו ה-servlet.
  3. ינתח את הבקשה ליצירת שני אובייקטים של שאילתה: השאילתה של מקור הנתונים ושאילתת ההשלמה. מעבירים את השאילתה של מקור הנתונים להטמעה של generateDataTable().
  4. ההטמעה של generateDataTable() יוצרת טבלת נתונים.
  5. מריצים את שאילתת ההשלמה בטבלת הנתונים שנוצרה בשלב 5.
  6. מעבדים את טבלת הנתונים בפורמט שצוין על ידי התצוגה החזותית, ומגדירים את התגובה של ה-servlet.

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

העברת פרמטרים אל DataTableGenerator.generateDataTable

אפשר להשתמש ב-HttpServletRequest.setAttribute כדי להעביר ל-DataTableGenerator.generateDataTable נתונים שאינם חלק משאילתה או אובייקט HttpServletRequest. בהמשך מופיע קוד לדוגמה.

בקוד של ה-servlet, מזינים את האובייקט שרוצים להעביר אל HttpServletRequest באופן הבא:

request.setAttribute("my_object_name", myObject);
DataSourceHelper.executeDataSourceServletFlow(request, response, dataTableGenerator);

בהטמעה של ממשק dataTableGenerator, מקבלים את האובייקט מ-HttpServletRequest באופן הבא:

public DataTable generateDataTable(Query query, HttpServletRequest request){
  Object myObject = request.getAttribute("my_object_name"); 
  // Add your code to manipulate myObject here 
} 

הטמעת מקור נתונים שאינו שרת (servlet)

אם מטמיעים את הספרייה בלי להשתמש ב-servlet, אפשר להשתמש רק במחלקות ובפונקציות המסייעות שלא דורשות סביבת servlet. אלה כוללים את המחלקות Query ו-DataTable וחלק מהפונקציות של DataSourceHelper כמו parseQuery, applyQuery, validateQuery ו-splitQuery. אפשר להשתמש במחלקות ובפונקציות האלה כדי לבצע את הפעולות הבאות:

  • ניתוח שאילתה להמחשה.
  • פיצול השאילתה לשאילתה של מקור נתונים ולשאילתת השלמה.
  • מריצים את שאילתת ההשלמה כדי ליצור טבלת נתונים.
  • מחזירים את טבלת הנתונים לתצוגה החזותית בפורמט HTML, CSV או JSON.