מה זה JSP? מבוא לדפי JavaServer

JavaServer Pages (JSP) היא טכנולוגיית תקן Java המאפשרת לך לכתוב דפים דינמיים מונעי נתונים עבור יישומי האינטרנט שלך ב- Java. JSP בנוי על גבי מפרט Java Servlet. שתי הטכנולוגיות פועלות בדרך כלל יחד, במיוחד ביישומי אינטרנט ישנים יותר של Java. מנקודת מבט של קידוד, ההבדל הברור ביותר ביניהם הוא שעם servlets כותבים קוד Java ואז משבצים סימון בצד הלקוח (כמו HTML) בקוד זה, ואילו עם JSP מתחילים בסקריפט או בסימון בצד הלקוח ואז משבצים תגי JSP כדי לחבר את הדף שלך ל- backend של Java.

JSP קשורה קשר הדוק גם ל- JSF (JavaServer Faces), מפרט Java לבניית יישומי רשת MVC (בקר-מודל-מבט). JSP היא טכנולוגיה יחסית פשוטה וישנה יותר מ- JSF, שהיא הסטנדרט למסגרות אינטרנט של Java כמו Eclipse Mojarra, MyFaces ו- PrimeFaces. אמנם לא נדיר לראות את JSP המשמש כחזית ליישומי JSF ישנים יותר, אך Facelets היא טכנולוגיית התצוגה המועדפת על יישומי JSF מודרניים.

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

מאמר זה יהווה מבוא מהיר לדפי JavaServer, כולל ספריית התגים JSP (JSTL). דוגמאות מראות לך כיצד לכתוב דף HTML פשוט, להטמיע תגי JSP כדי להתחבר לשרת Java, ולהפעיל את הדף במיכל servlet.

ראה מאמרים קודמים בסדרה זו כדי ללמוד עוד על סרוולטים של Java ועל פנים JavaServer.

JSP בג'קרטה EE

לאחר שחרורו של Java EE 8, אורקל העבירה את ניהול האחריות של Java Enterprise Edition (Java EE) לקרן Eclipse. בהמשך, פלטפורמת הארגון של Java זכתה למיתוג מחודש של ג'קרטה EE. יחד עם מפרטי Java Servlet ו- JSF, JSP היא אחת מטכנולוגיות האינטרנט של Java הכלולות לתמיכה ושדרוגים שוטפים בג'קרטה EE.

כתיבת דפי JSP

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

מתיו טייסון

רישום 1 מציג דף JSP פשוט.

רישום 1. דף JSP פשוט

${2 * 2} should equal 4

ברשימה 1, אתה רואה חסימת HTML הכוללת ביטוי JSP , שזו הוראה לשרת Java שנכתבה באמצעות שפת הביטוי (EL). בביטוי " ${2 * 2}", " ${}" הוא תחביר JSP לצורך אינטרפולציה של קוד ל- HTML. כאשר הוא מבוצע, ה- JSP יפיק את תוצאות הביצוע של כל מה שנמצא בתוך הביטוי. במקרה זה, הפלט יהיה המספר 4.

JSP במיכל סרוולט

יש לפרוס דפי JSP בתוך מיכל סרוולט של Java. על מנת לפרוס יישום אינטרנט של Java המבוסס על JSP ו- servlets, תארז את קבצי ה- jsp שלך, קוד Java ומטא נתונים של יישומים בקובץ .war, שהוא קובץ zip פשוט עם מבנה קונבנציונאלי ליישומי אינטרנט.

לאחר שתטען את JSP במיכל ה- servlet שלך, הוא יורכב לסרוולט. JSPs ו- Java servlets חולקים מאפיינים דומים, כולל אפשרות לגשת לאובייקטים מבקשים ולהגיב עליהם. Apache Tomcat 9x הוא יישום הייחוס למפרט Servlet 4.0 ו- JSP 2.3. (שים לב שעדכונים בין JSP 2.2 ו- 2.3 הם מינוריים יחסית.)

מיכל Servlet לעומת שרת יישומים

בעולם ג'אווה, מיכל סרוולט , המכונה גם שרת אינטרנט, הוא כמו גרסת לייט (בירה) של שרת יישומים. מיכל סרוולט מטפל באינטראקציות של בקשה ותגובה ומאפשר לאינטראקציות אלה להתממשק עם קבוצת משנה של יכולות ארגוניות של Java ליישומי אינטרנט. שרת יישומי Java כולל את מיכל ה- servlet כחלק מערמת הארגון המלאה של Java, כולל EJB, JPA, JMS ועוד.

אפליקציה לדוגמא ל- JSP

נשתמש ביישום לדוגמא ב- Tomcat כדי להתחיל בעבודה עם דפי JavaServer. אם טרם התקנת את Tomcat, דלג אל דף ההורדה של Tomcat ובחר בהתקנת Tomcat עבור מערכת ההפעלה שלך. נכון לכתיבת שורות אלה, Tomcat 9 הוא המהדורה הנוכחית, התואמת ל- Servlet 4.0 ו- JSP 2.3.

באפשרותך להתקין את Tomcat כשירות Windows, או להריץ אותו משורת הפקודה עם /bin/catalina.sh startאו /bin/catalina.bat. כך או כך, הפעל את Tomcat ואז עבור localhost:8080לדף הפתיחה של Tomcat המוצג באיור 2.

מתיו טייסון

חפצים מרומזים בטומקט

בדף הפתיחה של Tomcat, לחץ על הקישור דוגמאות , ואז לחץ על דוגמאות JSP .

לאחר מכן, פתח את יישום האינטרנט Implicit Objects Execute . איור 3 מראה פלט ליישום זה. הקדש דקה ללמוד את התפוקה הזו.

מתיו טייסון

בקש פרמטרים

אובייקטים מרומזים הם אובייקטים מובנים הנגישים דרך עמוד JSP. כמפתח דפי אינטרנט, תשתמש באובייקטים אלה כדי ליצור גישה לדברים כמו פרמטרים של בקשה , שהם הנתונים הנשלחים מהדפדפן בעת ​​הנפקת בקשת HTTP. שקול את כתובת האתר של הדפדפן עבור אובייקטים מרומזים:

 //localhost:8080/examples/jsp/jsp2/el/implicit-objects.jsp?foo=bar 

הפארם הוא ?foo=bar, ואתה יכול לראות את זה משתקף בפלט בדף האינטרנט, שם הטבלה מציגה את "EL Expression" והערך הוא "bar". כדי לבדוק זאת, שנה את כתובת האתר ל- //localhost:8080/examples/jsp/jsp2/el/implicit-objects.jsp?foo=zork , הקש Enter , ותראה את השינוי משתקף בפלט.

דוגמה זו היא מבוא פשוט מאוד לשימוש בתגי JSP כדי לגשת לפרמטרים של בקשת צד השרת. במקרה זה, עמוד JSP משתמש באובייקט המובנה (המרומז) הנקרא paramכדי לגשת לפרמטרים של בקשת יישום האינטרנט. paramהאובייקט זמין בתוך תחביר ביטוי JSP שראית מודעת 1.

בדוגמה זו השתמשנו בביטוי כדי לעשות קצת מתמטיקה:, ${2 * 2}איזה פלט 4.

בדוגמה זו, הביטוי משמש לגישה אובייקט ושדה כי האובייקט: ${param.foo}.

JSP ביישום אינטרנט

בדף אובייקטים משתמעים, לחץ על החץ האחורי, ואחריו הקישור מקור . זה יוביל אותך לקוד JSP של אפליקציית האינטרנט Implicit Objects, המוצג ברשימה 2.

רישום 2. קוד JSP לאפליקציית האינטרנט Implicit Objects

     JSP 2.0 Expression Language - Implicit Objects   
    
This example illustrates some of the implicit objects available in the Expression Language. The following implicit objects are available (not all illustrated here):
  • pageContext - the PageContext object
  • pageScope - a Map that maps page-scoped attribute names to their values
  • requestScope - a Map that maps request-scoped attribute names to their values
  • sessionScope - a Map that maps session-scoped attribute names to their values
  • applicationScope - a Map that maps application-scoped attribute names to their values
  • param - a Map that maps parameter names to a single String parameter value
  • paramValues - a Map that maps parameter names to a String[] of all values for that parameter
  • header - a Map that maps header names to a single String header value
  • headerValues - a Map that maps header names to a String[] of all values for that header
  • initParam - a Map that maps context initialization parameter names to their String parameter value
  • cookie - a Map that maps cookie names to a single Cookie object.
Change Parameter foo =

EL Expression Result
\${param.foo} ${fn:escapeXml(param["foo"])}
\${param["foo"]} ${fn:escapeXml(param["foo"])}
\${header["host"]} ${fn:escapeXml(header["host"])}
\${header["accept"]} ${fn:escapeXml(header["accept"])}
\${header["user-agent"]} ${fn:escapeXml(header["user-agent"])}

JSP functions

If you're familiar with HTML, then Listing 2 should look pretty familiar. You have the expected HTML elements, followed by the ${ } JSP expression syntax introduced in Listing 1. But notice the value for param.foo: ${fn:escapeXml(param["foo"])} . The "fn:escapeXML()" is a JSP function.

A JSP function encapsulates a chunk of reusable functionality. In this case, the functionality is to escape XML. JSP offers a variety of functions, and you can also create functions yourself. To use a function, you import its library into your JSP page, then call the function.

In Listing 2, the escapeXML function is included with the line:

The syntax is pretty clear: it imports the required functions and assigns them a prefix (in this case "fn") that can be used in all following expressions.

The JSP Standard Tag Library (JSTL)

The import line in Listing 2 calls taglib, which is short for tag library, or (in this case) JSP Standard Tag Library (JSTL). Tag libraries define reusable bits of functionality for JSP. JSTL is the standard tag library, containing a collection of taglibs that ship with every servlet and JSP implementation, including Tomcat.

The "functions" library is just one of the taglibs included with JSTL. Another common taglib is the core library, which you import by calling:

Like "fn", the "c" designation is conventional, and you will see it across most JSP pages.

Securing JSP pages

An example tag from the core library is


    

which outputs the tag with the XML already escaped. This function is important because outputting content directly to a web page via ${variable} opens the door to script injection attacks. This simple function is used to protect web pages from such attacks.

The core library also includes various tags for iteration and flow control (like IF/ELSE handling).

JSTL tag classifications

There are five sets of tags included in JSTL, each designed for a specific area of web application functionality:

  • JSTL core: Dealing with logic and execution flow; conventional tag: "c"
  • JSTL formatting: Dealing with formatting (like dates) and internationalization; conventional tag: "fmt".
  • JSTL SQL: Dealing with querying SQL databases (this is usually discouraged in the view layer); conventional tag: "sql".
  • JSTL XML: Dealing with working with XML documents; conventional tag: "x".
  • JSTL functions: Dealing primarily with String manipulations; conventional tag: "fn".

Calling taglibs in JSP pages

Now that you've got a handle on JSP basics, let's make a change to the example application. To start, locate the Implicit Object app in your Tomcat installation. The path is: apache-tomcat-8.5.33/webapps/examples/jsp/jsp2/el.

Open this file and locate the functions include:

just below this line, add a new line:

Hit Return and add another new line:

Now reload the page at //localhost:8080/examples/jsp/jsp2/el/implicit-objects.jsp?foo=bar.

אתה אמור לראות את העדכונים שלך משתקפים בפלט.