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











