מעגל החיים של
Servlet נשלט
לחלוטין ע"י ה-container-Servlet-engine שהוא חלק מכל שרת
Web שבו ה-Servlet
מותקן.
כאשר
Servlet נוצר לראשונה
מופעל init method בו יש להציב קוד אתחול חד פעמי. לאחר מכן
כל בקשת HTTP יוצרת thread הקורא ל-service method של מופע ה-Servlet שנוצר קודם לכן.
דרישות מרובות המגיעות בו זמנית יוצרות threads הקוראים ל-service באופן סימולטאני, זאת למרות
ש-Servlet
יכול ליישם את SingleThreadModel interface המתיר רק
ל-thread יחיד לפעול בכל פעם. service method
קורא ל-doGet ,doPost או כל doXXX
method אחר, בהתאם לסוג בקשת ה-HTTP
המתקבלת. לבסוף, כאשר השרת מחליט להסיר את ה-Servlet הוא
קורא ל-destroy method.
init method
method זה נקרא רק כאשר ה-Servlet
נוצר, לכן הוא משמש לאתחול חד פעמי. Servlet יכול להיווצר
כאשר משתמש מפעיל לראשונה את ה-Servlet או בתחילת הפעלה של
השרת, תלוי באופן הרישום של
ה-Servlet
בתוכנת שרת ה-Web.
קיימות שתי גרסאות של
init method. אחת שאינה מקבלת כל ארגומנטים ואחרת המקבלת כארגומנט אובייקט
מסוג ServletConfig. הגרסה הראשונה משמשת כאשר ה-Servlet
אינו צריך לקרוא הגדרות כלשהן המשתנות משרת לשרת. הגדרת ה-init
method
נקראת כך:
public void init()
throws ServletException
{
//initialization code...
}
|
הגרסה השנייה של
init method
משמשת כאשר ה-Servlet חייב לקרוא דרישות שרת ייחודיות עבור
האתחול. לדוגמה כאשר הוא צריך לדעת על:
קבצי סיסמא, פרמטרי ביצוע ייחודיים לשרת,
קבצי hit count, הגדרות מסד
הנתונים, cookies
סידרתיים מדרישות קודמות.
הגדרת ה-init method
נקראת כך :
public void init(ServletConfig config) throws
ServletException
{
super.init(config);
// initialization code
} |
שים לב לשני פרטים בקוד זה :
1. ה-init method מקבל
כארגומנט מופע של
ServletConfig.
ב-ServletConfig נמצא getInitParameter
method שבאמצעותו ניתן לחפש פרמטרי אתחול הקשורים ל-Servlet. שים לב שאף על פי שחיפוש פרמטרים אלו נעשה באופן שאינו תלוי בסוג השרת, הגדרת
ערכי הפרמטרים עצמם נעשית באופן ייחודי לכל שרת.
2. השורה הראשונה של גוף ה-method
קוראת ל-super.init. קריאה זו היא קריטית.
תמיד קרא
ל-super.init בשורה הראשונה.
service method
בכל פעם שהשרת מקבל דרישה ל-Servlet
השרת מייצר Servlet חדש וקורא ל-method
זה.
ה-method בודק את סוג בקשת ה-HTTP
וקורא
ל-doGet ,doPost
,doPut ,doDelete
וכו' בהתאמה.
doGet, doPost, doXXX methods
methods אלו הם עיקרו של ה-Servlet. ברוב המקרים כל שעליך לעשות הוא לדרוס את doGet
ו/או doPost, אולם
באפשרותך לדרוס את
doDelete עבור בקשת HTTP מסוג
DELETE, את doPut עבור PUT, את doOptions עבור OPTIONS ו-doTrace עבור
TRACE.
יש לזכור
שה-service method תומך באופן אוטומטי ב-OPTIONS
ו-TRACE.
SingleThreadModel
בד"כ השרת יוצר
instance
יחיד של Servlet ו-thread חדש עבור
כל בקשת HTTP. מס' thread-ים
מופעלים באופן
סימולטאני כך ש-doGet
ו-doPost מסנכרנים את הגישה לשדות ונתונים
משותפים. על מנת למנוע גישה זו של
thread-ים מרובים יש ליישם את ממשק SingleThreadModel כדלקמן:
public class MyServlet extends HttpServlet
implements
SingleThreadModel
{
}
|
יישום
ממשק זה מבטיח שלא תהיה גישה בו זמנית ליותר מ-thread אחד למופע ה-Servlet. זה מובטח ע"י
סידור כל הבקשות בתור והעברתם אחת בכל פעם למופע ה-Servlet
היחיד, או ע"י יצירת מופעים רבים שכל אחד מהם מטפל
בדרישה אחת בלבד. אולם יש להביא בחשבון שגישה מסונכרנת ליישומי השרת עלולה לפגום
משמעותית בביצוע מבחינת הזמן.
destroy method
השרת עשוי להחליט להסיר מופע של
Servlet בשני מצבים: מכיוון שנדרש לכך מפורש ע"י מנהל השרת, או
מכיוון שה-Servlet לא היה בשימוש זמן רב. לפני הסרתו השרת
קורא ל-destroy method של ה-Servlet. קריאה זו מאפשרת ל-Servlet לסגור connection
לבסיסי נתונים, לעצור background threads, לכתוב רשימות
coockies לדיסק ולבצע פעולות ניקוי אחרות.
|