Web Container
Download
Report
Transcript Web Container
© Keren Kalif
Servlet
קרן כליף
© Keren Kalif
2
:ביחידה זו נלמד
Web Container -מנגנון ה
servlet מהו
web.xml עבודה עם קובץ הקונפיגורציה
המקבל פרמטריםservlet
html - מservlet הפעלת
get/post :action
annotation עבודה עם
Load On Startup
ServletContext 'ים באמצעותservlet העברת נתונים בין
נוסףservlet -שימוש ב/העברה
Cookies
session
מנגנון העבודה של שרת web
© Keren Kalif
:Web Server
מחשב המחובר לאינטרנט ויודע להריץ תוכנה שיודעת להקשיב
לבקשות httpולהחזירן
כאשר מבקשים דף משרת webיכולות להתקבל 2תשובות:
.1תשובה סטטית :תינתן ע"י דף HTMLשהוכן מראש
.2תשובה דינאמית :תתקבל ע"י דף HTMLשיוכן ע"י קוד שמורץ
בשרת עבור הבקשה הספציפית שלנו
כדי לקבל תשובה דינאמית ,לרוב נרצה לשלוח לשרת נתונים ספציפיים
(פרמטרים)
3
JAVA - Web Container
© Keren Kalif
4
:Web Container
Web Server שכתוב ב JAVA -ויודע להפנות בקשות httpלWeb -
Applicationsשכתובות בJAVA -
:Web Application
תוכנית JAVAשמורצת ע"י Web Conatiner
מקבלת מהשרת בקשות HttpRequestמלקוחות (למשל דפדפנים או
אפליקציות אחרות שמבקשות )URL
מחזירה כתשובה ,HttpResponseלמשל דף text ,XML ,HTMLאו
כל מידע טקסטואלי או בינארי (למשל )mp3
כלומר ,יכולה לייצר אינטאקציה דינאמית עם ה ,client -ע"י חיבור ל-
BL ,DBוכו'
תכנות בצד השרת
© Keren Kalif
5
כאשר רוצים שתהייה לוגיקה בצד השרת ,הוא צריך להכיל תוכניות
מיוחדות (למשל )asp, jsp, servlet, php
הלקוח יפנה לשרת עם URL
השרת מקונפג להפנות בקשות מ URL -מסויימים להפעלת אחת
מהתוכניות שהשרת מריץ
תוכניות אלו מתפקדות כשכבת ביניים בין בקשת httpמhttp client -
(למשל הדפדפן) לבין תוכניות אחרות
תוכנית זו תוכל לקבל פרמטרים ולהחזיר תשובה ללקוח שתתורגם
לפורמט שהלקוח ידע לקרוא (למשל )html
© Keren Kalif
6
http://tech.kaazing.com/documentation/dragonfire/kaazing-architecture-overview.html
דוגמא בסיסית בסביבת NetBeans
נפתח פרוייקט חדש ב:NetBeans -
© Keren Kalif
7
© Keren Kalif
8
..המשך
© Keren Kalif
9
..המשך
המשך..
© Keren Kalif
כעת נרצה לייצר קובץ מטיפוס Servletשהוא הולך להיות ה-
Web Applicationשלנו
בתפריט Servlet File New
10
© Keren Kalif
11
..המשך
הקוד של הServlet -
המתודה מקבלת כפרמטר את
אובייקט ה( Request -קלט) ואת
אובייקט ה( Response -פלט)
נעדכן באובייקט הresponse -
שהתשובה בפורמט html
קבלת הפניה לאובייקט הפלט
של הresponse -
כתיבת מחרוזת היוצרת דף html
© Keren Kalif
12
© Keren Kalif
הרצת Servlet
13
הרצת servletהינה שליחת URLשממופה ע"י הWeb -
ContainerלServlet -
שם הפרוייקט בתוכו נמצא
ה servlet -המבוקש
אנחנו רואים שבדוגמא זו לא
הצלחנו לקבל תשובה מהשרת
הפעלת השרת בNetBeans -
© Keren Kalif
14
וזאת בגלל שתחת
Applicationsלא מוגדר ה-
Web Applicationשלנו
מקש ימני וstart -
ונריץ את התוכנית שוב:
ההודעה אומרת לנו
שהשרת לא יודע להריץ
את התוכנית המבוקשת...
deployלפרוייקט
© Keren Kalif
15
נעמוד על הפרוייקט מקש ימני deploy
כעת ניתן לראות את ה Web Application -תחת השרת (יש צורך
לעשות :)refresh
וכעת נריץ שוב את התוכנית:
© Keren Kalif
16
מאחורי הקלעים של הרצת Servlet
© Keren Kalif
17
בפעם הראשונה שהשרת מקבל את הבקשה ,הוא מייצר
אובייקט מטיפוס ה servlet -המבוקש ומפעיל את המתודה
serviceשל אובייקט זה ,שיודעת להפעיל את מתודה
מתאימה בהתאם לסוג הבקשה ( – get/postהסבר בהמשך)
פונקציה זו ממומשת באבא HttpServlet
© Keren Kalif
18
: נוסףservlet נייצר
ונריץ אותו:
© Keren Kalif
כאשר שומרים את הקובץ ב NetBeans -הוא כבר מקמפל אותו
ועושה אוטומטית :deploy
19
הקובץ web.xml
קובץ זה מכיל את הגדרת ה-
'sevletים שיצרנו בפרוייקט זה
© Keren Kalif
20
הקובץ - web.xmlהמשך
הגדרת שם הservlet -
הגדרת הclass -
בבלוק זה מגדירים את ה URL -איתו
פונים לשרת להפעלת הservlet-
© Keren Kalif
21
© Keren Kalif
22
web.xml - בurl-pattern שינוי הערך
היררכיית התיקיות ביצירת
© Keren Kalif
Web Application
כאשר יוצרים פרוייקט מטיפוס ,web applicationכמו למשל
,servletתיווצר הירכיית התיקיות הבאה:
23
הוספת הקובץ web.xml
© Keren Kalif
יתכן שתיצרו את הפרוייקט הקובץ web.xmlלא יהיה קיים ,ולגן
כאשר מוסיפים פריט חדש לפרוייקט ,יש לבחור otherויפתח
החלון הבא:
24
תוכנית המקבלת פרמטרים
פניה לאובייקט ה request -וקבלת
ערכי הפרמטרים שהועברו
© Keren Kalif
25
הפעלת תוכנית המקבלת פרמטרים
העברת פרמטרים אחרי ?
והפרדת כל פרמטר עם &
© Keren Kalif
26
וכאשר לא מועברים הפרמטרים..
אם הפרמטר לא הועבר יוחזר null
אם הפרמטר הועבר ללא ערך תוחזר מחרוזת ריקה
© Keren Kalif
27
© Keren Kalif
28
נוסף המקבל פרמטריםservlet
© Keren Kalif
29
BMI המחשבservlet -דוגמאת הרצה ל
הפעלת ה servlet -מhtml -
לחיצה על sendתגרום להפעלת ה servlet -ותשלח
אליו את הפרמטרים שהוכנסו בתיבות הinput -
© Keren Kalif
30
נשים לב איך להריץ את הhtml -
יש להריץ את קובץ ה html -דרך ה localhost -ולא
דרך המסלול המלא במחשב ,אחרת הוא לא יגיע ל-
servletשאותו הוא צריך להפעיל ,כי אין פניה לשרת
© Keren Kalif
31
הפרמטר action
© Keren Kalif
ערכו של הפרמטר actionב html -צריך להיות זהה לערכו של
הפרמטר url-patternבקובץ :web.xml
32
הפרמטר methodבhtml -
© Keren Kalif
33
ערכו של פרמטר זה יכול להיות getאו ( postברירת המחדל היא
)get
שימוש ב get -לעומת בpost -
get
post
האם הפרמטרים מופיעים
בשורת הכתובת
+
-
אורך מקסימלי לשורת
הפרמטרים
מוגבל באורכו
אינו מוגבל
אבטחה
פחותה עקב חשיפת הפרמטרים
וערכם
יותר גבוהה עקב הסתרת
הפרמטרים וערכם
debug
יותר קל לדבג
טיפה יותר קשה לדבג
היכן נשלחים הנתונים
בURL -
בתוך ה*request -
ניתן לשלוח למישהו את הURL -
עצמו עם נתונים ספציפיים
* למשל ,שליחת קובץ :לא ניתן להעביר נתוניו בשורת ה URL -עקב גודל מוגבל
34
© Keren Kalif
השיטות doGetוdoPost -
© Keren Kalif
35
ראינו כי מחלקה היורשת מ HttpServlet -מממשת את השיטה
processRequestהמופעלת כאשר מריצים את הservlet -
במחלקה HttpServletישנן 2שיטות נוספות שאנחנו דורסים,
שכב"מ ב NetBeans -מפעילות את doGet :processRequest
וdoPost -
ב eclipse -למשל המימוש שלהן ריק ויש לממש אותן בעצמנו)
כאשר מריצים את ה servlet -למעשה מורצת המתודה service
המפעילה אחת משתיהן בהתאם לסוג בקשת ה http -שנשלח
(נקבע בפרמטר )method
הדבר מאפשר לנו לבצע עבודה שונה בכל אחד מהמקרים (למרות
שלרוב אין צורך)
© Keren Kalif
36
doPost לעומתdoGet
© Keren Kalif
עבודה עם web.xmlלעומת annotation
37
ראינו כי קובץ ה web.xml -מגדיר אילו 'servletים מוגדרים ב-
web application
היה נהוג לעבוד בצורה זו עד גרסא 2.5
החל מגרסא 3קובץ ה web.xml -הוחלף במנגנון הannotation -
הסרבר צריך לדעת באיזו גרסא הוא תומך:
למשל סרבר גרסא 3יתמוך בשתי הצורות בעוד שסרבר בגרסא 2.5
ומטה יתמוך רק בתצורה של קובץ הweb.xml -
יצירת servletעם annotations
© Keren Kalif
כדי לייצר אותו נשים לב בעת יצירת ה servlet -לא לסמן את
התיבה הבאה:
38
© Keren Kalif
39
annotation עםservlet
web.xml מהקובץurl-patterm מקביל לשדה
יתרון בעבודה עם annotation
© Keren Kalif
40
ניתן להגדיר את ערכו של ה url-pattern -בקבוע וכך להשתמש בו
במקומות שונים תוך כדי שמירת השם במיקום ריכוזי אחד
© Keren Kalif
41
servlet מתי נוצר אובייקט
מאחורי הקלעים
© Keren Kalif
42
ניתן לראות שבקריאות שונות ל servlet -ה counter -אותחל פעם
אחת בלבד
זאת משום שהשרת טוען את ה servlet -עם הפניה הראשונה אליו
ומשאיר אותו טעון בזיכרון
כאשר הזיכון מלא ,יתכן והשרת יבחר להוריד את הservlet -
לכן בדוגמא הקודמת ה counter -לא התאפס מקריאה אחת
לאחרת
כאשר השרת מעלה את ה ,servlet -רצה ב servlet -המתודה
,initוכאשר הוא יורד מופעלת המתודה .destroy
© Keren Kalif
43
destroy - וinit המתודות
הפלט בסרבר: destroy - וinit המתודות
© Keren Kalif
44
קריאת נתוני איתחול מהweb.xml -
© Keren Kalif
45
ניתן לקרוא נתוני איתחול וקונפיגורציה עבור המתודה initמתוך ה-
web.xml
קריאת נתוני איתחול מהweb.xml -
ניתן לדרוס את initכך שתקבל
כפרמטר את אובייקט הקונפיגורציה
© Keren Kalif
()2
46
© Keren Kalif
קריאת נתוני איתחול באמצעות annotation
47
thread
השרת יוצר מופע אחד של ה servlet -ומופע עבור כל בקשת http
ל servlet -ב thread -נפרד
ז"א שניתן לפנות ל servlet -מכמה 'threadים בו-זמנית
ה servlet -יכול למממש את הממשק SingleThreadModelכך
שכל פעם ירוץ מופע אחד (השאר יכנסו לתור)
לא מומלץ ויש להבין כי שימוש באופן זה יאט את הביצועים
במקרה הצורך ,יש לדאוג לסינכרון של קטעי קוד קריטי
48
© Keren Kalif
© Keren Kalif
Load on Startup
49
ראינו שנוצר מופע של ה servlet -עם הפעלתו הראשונה
ייתכן וישנו servletשזמן הטעינה שלו ארוך ,ולכן נרצה לטעון אותו
עם העלייה של הWeb Conatiner -
© Keren Kalif
50
GlassFish - – הקונסול של הLoad On Startup
© Keren Kalif
51
Servlet Context לחלוק מידע
Web -'ים שונים בservlet במידה ונרצה לחלוק נתונים בין
ServletContext - נשים אותם ב,Application
© Keren Kalif
52
ServletContext1 הפעלת
© Keren Kalif
53
ServletContext2 הפעלת
להפנות מ servlet -אחד לאחר
© Keren Kalif
למשל כאשר עבור תוצאות שונות של חישוב מסויים רוצים להציג
תוצאה שונה
ניתן ע"י משפט תנאי לייצר htmlשונה ,אך גם ניתן להפנות ל-
servletאחר
54
להפנות מ servlet -אחד
כאשר מבצעים ,forwardאין לשנות את ה-
PrintWriterב servlet -המקורי .ניסיון הוספה אליו
לאחר יצירת תשובה ב servlet -אחר לא יתעדכן.
לאחר ()2
© Keren Kalif
55
© Keren Kalif
56
)3( לאחר
אחדservlet -להפנות מ
© Keren Kalif
57
הפלט
להפנות מ servlet -לhtml -
נשים לב כי forwardמעביר את הבקשה
בשרת ,בעוד ש sendRedirect -מחזיר
תשובה ללקוח ששולח בקשה חדשה
© Keren Kalif
58
לשתול servletאחד באחר
למשל יתכן ונרצה שיהיה קוד משותף בכמה 'servletים
לא נרצה לשכפל את הקוד בין ה'servlet -ים השונים
נשים לב שאנחנו רק מעדכנים את האובייקט outולא סוגרים
אותו ,כדי לאפשר המשך שירשור של נתונים ב servlet -המקור
© Keren Kalif
59
© Keren Kalif
60
include - המשתמש בservlet -ה
תרגיל
.1
.2
.3
.4
.5
.6
.7
© Keren Kalif
61
כתבו מחלקת Calculatorובה שיטה סטטית calcהמקבלת 2
מספרים וסימן ,ומחזירה את תוצאת החישוב
כתבו servletהמקבל כנתונים 2מספרים וסימן ,מפעיל את
השיטה מסעיף ,1ומחזיר HTMLעם תוצאת החישוב
כתבו htmlהקורא 2מספרים וסימן ומפעיל את הservlet -
מסעיף 2
הוסיפו ל init_param -את הצבע בו תרצו להציג את התשובה
מהservlet -
שמרו את תוצאת החישוב בservlet context -
כתבו servletהקורא את הערך האחרון שנשמר בסעיף 5והציגו
את הערך בריבוע
במידה והתוצאה בסעיף 6גדולה מ ,100 -יש להציג servletעם
ההודעה !This is Your Lucky Day
שימוש בcookies -
© Keren Kalif
62
יתכן ונרצה לקבל מידע מהשרת באופן ספציפי ל session -שלנו
למשל:
בדוגמא שספרה את מספר הפעמים שה servlet -הופעל ,נרצה לדעת
עבור כל לקוח באופן ייחודי את מספר הפעמים שהוא לחץ
בדוגמא שראינו המונה היה מושתף לכל הלקוחות
הפתרון הראשון הוא העברת cookieב response -וכך נקבל את
ה cookie -ב request -הבא ונוכל להשתמש בערכיו
הערכים על ה cookie -הם keyו value -מטיפוס מחרוזת
ניתן להשתמש בכלי זה רק אם הלקוח לא חסם שמירת cookies
דוגמא
פה יכתבו נתונים נוספים לresponse -
יצירת cookie
והוספתו לresponse -
ה cookie -יפוג אם לא יהיו שתי
גישות רציפות בטווח זמנים זה
© Keren Kalif
63
דוגמא -המשך
קבלת ה cookies -שהועברו בrequest -
בדיקה האם הועברו עוגיות על ה.request -
אלו 3בדיקות שונות מאחר וכל דפדפן שולח
את המידע באופן שונה.
יצירת cookieנוסף והוספתו לresponse -
הדפסת ה cookies -שהגיעו בrequest -
© Keren Kalif
64
© Keren Kalif
פלט
65
עבור כל דפדפן יש cookiesנפרדים.
פתיחה כמה לשוניות מדפדפן אחד תחלוק את אותן .cookies
chrome
Explorer
FireFox
© Keren Kalif
66
chrome - בcookies -צפייה בערכי ה
:developer tool - תפתח את הF12 לחיצה על
בתוקףcookie -עד מתי ה
עבודה עם HttpSession
© Keren Kalif
עבודה עם אובייקט HttpSessionתחליף את השימוש ב-
cookies
אובייקט זה יודע לייצר לבד את ה id -של ה ,session -ולכן אין
צורך לייצר אותו בעצמנו בקוד
יתרון נוסף הוא שניתן לשמור עליו אובייקטים ולא רק מחרוזות
67
דוגמא לשימוש בHttpSession -
כדי לייצר idל session -במידה ואינו קיים
בדיקה האם ה session -חדש
© Keren Kalif
68
© Keren Kalif
69
סיום יזום של
session
בפלט נראה כי אחרי שה counter -יגיע ל 3 -נקבל
sessionIdחדש ,ולכן הספירה תחל מחדש מ0 -
© Keren Kalif
ובכל זאת הבדל בין עבודה עם cookieלsession -
במידה והשרת ביצע :restart
.1כאשר עובדים עם :sessionכל הבקשות שיגיעו מ'session -ים
שהיו קיימים לא יזוהו וה'session -ים יאותחלו מחדש
אלא אם בירידת השרת במתודה destoryשומרים את המידע וטוענים
אותו מחדש בinit -
.2כאשר עובדים עם :cookiesמאחר והמידע נשמר בקבצים אצל
הלקוח ,הנתונים לא ילכו לאיבוד
70
תרגיל על session
© Keren Kalif
71
כתוב servletהמדמה את משחק הניחושים:
ה servlet -יגריל עבור כל בקשה מספר בין 0ל 100 -והמשתמש
ישלח ניחוש
יש להחזיר תשובה האם הערך שהוכנס גדול או קטן מהמספר
המבוקש ,וכן לאפשר הכנסת ערך נוסף
עם זיהוי המספר ,יש להציג למשתמש תוך כמה מהלכים הוא ניחש
את התשובה
guessGame.html
תרגיל על )2( session
© Keren Kalif
72
שדרג את התרגיל הקודם כך במקום לשים על הsession -
טיפוסים בסיסיים ,נשים עליו אובייקט Playerשיכיל את שמוף,
המספר הסודי ומספר הניחושים.
guessGameWithPlayer.html
© Keren Kalif
73
:ביחידה זו למדנו
Web Container -מנגנון ה
servlet מהו
web.xml עבודה עם קובץ הקונפיגורציה
המקבל פרמטריםservlet
html - מservlet הפעלת
get/post :action
annotation עבודה עם
Load On Startup
ServletContext 'ים באמצעותservlet העברת נתונים בין
נוסףservlet -שימוש ב/העברה
Cookies
session