טכנולוגיית JSP: איך זה עובד?

‏ • 7 ביוני, 2004

איך יודע השרת לקחת את דף ה-JSP שלנו, לקרוא אותו ולהציג את תוכנו כמתבקש ?

כידוע, סיומת הקובץ (JSP) רומזת לשרת לקרוא את תוכנו ולבצע את המבוקש בו עוד לפני שהציגו למשתמש. זאת אומרת, כשמשתמש שגולש לאתר ומבקש את דף ה- jsp שלנו, סדר הפעולות שמבצע השרת הן כדלקמן:

  1. השרת מקבל את הבקשה של הגולש לדף ה- jsp.
  2. השרת מבין שזהו קובץ jsp ולכן עליו לבדוק את תוכנו לפני שיציגו לגולש.
  3. השרת קורא את תוכן הדף, מזהה את חלקי הקוד הכתובים ב- JAVA ומנסה להפעילם.
  4. במידה והצליח השרת להפעיל את כל קטעי הקוד, הוא מחליף את כל המקומות בו נכתבו בקוד ה- JAVA פקודות הדפסה, בתוצאת ההדפסה (אם למשל התבקשה הדפסת משתנה, השרת יחליף את הפקודה בדף, בערכו של המשתנה).
  5. השרת מכין דף HTML חדש ובו פקודות ה- HTML שהיו בדף המקורי, בתוספת תוצאות ההדפסה והלוגיקה שנכתבו בקוד ה- JAVA בדף המקורי, כך שבדף החדש שמכין השרת כתוב אך ורק קוד HTML נקי. (ניתן לבדוק זאת ע"י כתיבת דף JSP שמבצע משהו, כמו באחת מהדוגמאות בפרק הקודם, וכשהדף עולה בדפדפן, להפעיל את האופציה view-source בדפדפן שתתן את קוד המקור של הדף, ללא פקודות ה-JAVA שלנו, אלא אחרי שהשרת "טיפל" בדף).
  6. הדף מוצג למשתמש כאילו היה דף HTML רגיל (המשתמש לא מודע לכך שהתבצעו בדף פקודות ג'אווה לפני שהגיע אליו.

עפ"י סדר הפעולות הכתובות לעיל, ניתן להבין שהדף המוצג למשתמש אינו "אינטראקטיבי", כלומר, לא ניתן בעזרת JSP לייצר דף שיוכל להפעיל פקודות בזמן שהגולש לוחץ על כפתור למשל. בשביל פעולות כאלה, קיימת שפת JavaScript שהיא איננה קשורה ל- JSP , ליכולותיו ולמטרותיו. אם כך, הפקודות שאנו נותנים בתוך תגי JSP יתבצעו לפני הגעת הדף אל הגולש, ולכן פקודות אלה אמורות לבצע פעולות "קדם". דוגמא לפעולה כזו היא למש,ל אם אנו רוצים להציג דף למשתמש, שמציג את השעה הנוכחית בשרת ה- web בכל פעם שהמשתמש ייכנס לדף (הצגת השעה לא תשתנה אם המשתמש לא יטען את הדף שוב).

כל שעלינו לעשות הוא, להכניס פקודת JAVA שתדפיס את השעה הנוכחית אל תוך דף ה- HTML . השרת יקבל את הבקשה לדף כשמשתמש יגלוש אליו, יראה את הפקודות בדף שאומרות לו להכניס את השעה הנוכחית פנימה, יבצע אותן, יכין דף HTML חדש עם תוצאת השעה הנוכחית ויחזיר את הדף החדש לגולש.

הנה דוגמא לדף JSP עם היכולת הנ"ל:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15  

<html>

<head>
    <title>current time</title>
</head>

<body>
<%
    java.util.Date d = new java.util.Date();
%>

    now the time is:<br/>
    <%= d %>
</body>

</html>

התוצאה האמורה להתקבל היא:
now the time is:


1  

Sat Nov 11 19:11:07 GMT+02:00 2003

שמנו בתוך תגי JSP את הפקודה:


1  

java.util.Date d = new java.util.Date();

שיצרה את המשתנה d מטיפוס java.util.Date . כשלא מציינים דבר ב-constructor של java.util.Date נוצר אובייקט שמכיל את השעה והתאריך הנוכחיים.
שורה אחר כך (מחוץ לתגי JSP) שמנו את פקודת ה- HTML <br> כדי לרדת שורה אחת למטה בדף, ואז שוב בתוך תגי JSP הגורמים להדפסת ערך המשתנה, כתבנו: <%= d %> והתכוונו להגיד לשרת, שידפיס כאן את ערך המשתנה d. תוצאת בקשת הדף של הגולש תהיה ככתוב למעלה.

בואו נראה דוגמה נוספת לדף JSP:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19  

<html>

<head>
    <title>my number</title>
</head>

<body>
<%
    int myNumber = 15;
%>

    my number is:<br />
    <%= myNumber %>
<%
    myNumber = 28;
%>

</body>

</html>

כאן, יצרנו משתנה מטיפוס int ושמו myNumber והצבנו בו את הערך 15. בהמשך, הכרזנו שאנו רוצים להדפיס את ערך המשתנה myNumber (שוב, ע"י הפקודה: <%= myNumber %>) ופקודה אחת אחרי כן, החלטנו שאנו רוצים לשנות את ערכו של myNumber ל- 28.
השאלה היא: מה יוצג לגולש כאשר יגלוש לדף שלנו?

האם יוצג הפלט:


1
2  

my number is:
15

או שמא:


1
2  

my number is:
28

שאלה טובה, נכון? בוא נחשוב ביחד. השרת מקבל את בקשת הדף מהגולש, מבין שזה דף JSP ומנסה לקרוא את הפקודות בתוכו ולבצען. הוא נתקל בפקודה המגדירה משתנה בשם myNumber ואכן מגדיר אותו ומאתחל אותו לערך המבוקש 15. עכשיו הוא רואה את הפקודה שמבקשת להדפיס את ערך המשתנה myNumber, ולכן מדפיס את הערך הנוכחי של המשתנה שהוא 15. עכשיו השרת נתקל בפקודה הבאה המבקשת ממנו לשנות את ערכו של myNumber להיות 28, והוא מבצע כבקשתנו, ומחליף את ערכו של המשתנה myNumber להיות 28. אך שורה לפני זה הוא כבר הדפיס את ערכו הקודם של myNumber לדף ה- HTML אותו הוא עומד להחזיר לגולש. האם ערך זה ישתנה לפתע? ודאי שלא. כל פקודה שבוצעה, בוצעה, ואינה ניתנת לשינוי. אם הודפס הערך 15, זה מה שיוצג לגולש גם אם מאוחר יותר ערכו של המשתנה השתנה ל- 28. אם לאחר הצבת הערך 28 ב- myNumber היינו כותבים שוב פקודת הדפסה למשתנה, כמובן שהיה מודפס בהדפסה השנייה הערך החדש 28.

יש לזכור שהשרת קורא את פקודות ה- JSP שורה אחר שורה ומבצע אותן בסדר הופעתן (על יוצאים מן הכלל נדבר בהמשך).

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

כל דף שמתבקש מגולש, נבדק על ידי השרת כנאמר לעיל. אך לפני שהשרת מבצע את פקודות ה JAVA הכתובות בדף ה- JSP, הוא מבצע פעולה נוספת, מסובכת מעט, המקלה עליו את פעולת קריאת וביצוע פקודות ה- JSP. השרת לוקח כל דף JSP ויוצר קובץ JAVA רגיל לחלוטין מסוג SERVLET (מה זה? ידובר במאמרים הבאים). קובץ ה- SERVLET הזה הוא SERVLET רגיל לכל דבר, רק הקוד הכתוב בו הוא אוסף של פקודות ה- JSP שאנחנו הכנסנו, עם אוסף של פקודות הדפסת HTML (השרת הופך את פקודות ה- HTML שלנו וממיר אותן כדי שיופיעו כקוד JAVA רגיל). אז מבצע השרת את פקודות ה- JSP (ובעצם את כל הפקודות הכתובות כרגע ב- SERVLET שיצר) ומהם יוצר דף HTML חדש אותו הוא מחזיר למשתמש (כנאמר למעלה).

המעוניינים לבדוק כיצד הפך קובץ ה- JSP שלהם לקובץ JAVA (SERVLET) יכולים לבדוק במיקום הבא:


1  

tomcat_dirworkStandalonelocalhost_

ולמצוא שם קבצי קוד מקור (java) וקבצי תוצר (class) של קובץ ה- JSP שלהם.

תגיות: ,

עדי לב

מנהל פורום HTPC ב HOMETHEATER הישראלימקים ומנהל אתר חלם www.chelem.org.il  הבלוג שלי ובשבילכם

תגובות בפייסבוק