ישומוני שרת יוכלו לקדם דרישות או לכלול תוכן חיצוני על ידי שימוש ב-RequestDispatcher.
ניתן להשיג זאת על ידי קריאה ל-getRequestDispatcher של
ServletContext ולספק כתובת URL יחסית לתיקיית
השורש של השרת כך:
RequestDispatcher
dispatcher=getServletContext().getRequestDispatcher(url); |
לאחר מכן יש להשתמש ב-forward כדי להעביר
שליטה מלאה ל-URL שצוין ולהשתמש
ב-include כדי להוציא פלט של תוכן URL
שצוין. ב- 2 המקרים יש לספק את הארגומנטים
HttpServletRequest
ו-HttpServletResponse.
שני ה-methods מודיעים על
ServletException ו-IOException.
שימוש במשאבים סטטיים
במקרים מסוימים בהם נרצה לשלוח את הדרישה לדף
HTML סטטי כל שיש לעשות הוא לספק את כתובת הדף HTML
כארגומנט ל-getRequestDispatcher בדרישות GET.
לעומת זאת
ב-POST אי אפשר לעשות זאת. כדי להתגבר על זה עליך לשנות
את סיומת שם הדף לסיומת JSP.
אספקת נתונים לדפי היעד
אם יישומון מעוניין לקדם את הדרישה לדף JSP, כל שעליו לעשות הוא להשיג RequestDispatcher על ידי
קריאה ל-getRequestDispatcher method של
ServletContext ולקרוא ל-forward יחד עם
הנתונים, וכן לספק את הארגומנטים HttpServletRequest ו-HttpServletResponse.
שיטה זו דורשת מדף היעד לקרוא את הנתונים הדרושים לו מתוך
HttpServletRequest. ישנם שני מקומות עיקריים שיישומון השרת יכול
לאחסן בהם נתונים לשימוש דפי JSP:
ב-HttpServletRequest וכ-Bean
במיקום ספציפי לתכונה scope של jsp:useBean.
יישומון השרת המקורי יאחסן אובייקטים שרירותיים כ-HttpServletRequest
על ידי שימוש בפקודה הבאה:
request.setAttribute("key1",value1);
|
לעומת זאת ניתן לעשות זאת טוב יותר על ידי שימוש ב-bean ואחסונו במיקום שנקבע על ידי jsp:useBean
עבור Beans משותפים. כדי ליצור bean
נגיש לכל יישומוני השרת או דפי JSP שבשרת או ביישום
Web, יישומון השרת הקורא יכיל את הקוד הבא:
Type1 value1=computeValueFromRequest(request);
getServletContext().setAttribute("key1",value1");
|
דף היעד מסוג
JSP ייגש לרוב
לערך שנשמר קודם לכן על ידי שימוש ב-jsp:useBeans בצורה
הבאה:
<jsp:useBean id="key1" class="Type1" scope="application"/>
|
לחילופין, דף היעד יכול להשתמש ברכיב תסריט כדי לקרוא
במפורש ל-
application.getAttribute("key1")
|
ולהעביר את התוצאה ל-Type1.
דרך שלישית לשליחת נתונים לדף היעד כשמשתמשים בדרישות
GET: ניתן להוסיף את נתוני השאילתה
ל-URL
לדוגמא:
String
Address="/path/resource.jsp?newParam=value";
RequestDispatcher
dispatcher=getServletContext().getRequestDispatcher(address);
dispatcher.forward(request,response);
|
שילוב URLs
יחסיים בדף היעד
יישומון שרת יכול לקדם את
הדרישה למקומות שרירותיים באותו שרת. אך התהליך שונה משימוש ב-sendRedirect
method של HttpservletResponse: ראשית
sendRedirect דורש מהלקוח להתחבר למשאב חדש ואילו ה-forward method של RequestDispatcher
מטופלת כולה בשרת. שנית sendRedirect לא שומר אוטומטית את
כל נתוני הדרישה ואילו forward כן שומר אוטומטית. שלישית,
שימוש ב-sendRedirect מביא לכתובת URL
סופית שונה ואילו בשימוש ב-forward כתובת ה-URL
של יישומון השרת המקורי נשארת כמות שהיא.
דרכים חלופיות להשגת
RequestDispatcher
ניתן להשתמש ב:
request.getRequestDispatcher("file")
|
או על ידי
getNameDispatcher של ServletContext כדי
לגשת אליהם לפי שמם ולא לפי נתיב המיקום שלהם.
הכללת תוכן סטטי או
דינאמי
אם יישומון השרת משתמש ב-forward method של RequestDispatcher
הוא לא יכול לשלוח פלט ללקוח - זה יעשה על ידי דף היעד. אם יישומון השרת צריך ליצור
חלק מהתוכן בעצמו אך הוא משתמש בדף JSP או במסמך
HTML סטטי בחלקים אחרים של התוצאה, יישומון השרת יכול לחילופין
להשתמש ב-include method של RequestDispatcher
יחד עם HttpServletRequest ו-HttpServletResponse.
השוני בשימוש ב-include הוא בכך שתוכל לשלוח תוכן לדפדפן
לפני שתיצור את הקריאה וכן שהשליטה חוזרת ליישומון השרת לאחר סיום הקריאה
include .include דומה מאוד ל-forward אך יכולה לעשות דבר
ש-foraward
לא יכול: היא מגדירה אוטומטית תכונות באובייקט
HttpServletRequest אשר מתארות את נתיב הדרישה המקורית במקרה
שיישומון השרת או דף JSP יזדקקו לנתון זה. תכונות אלו
שהמשאב הכלול יכול לקרוא להן על ידי קריאה ל-getAttribute
של HttpServletRequest הן:
javax.servlet.include.request_uri
javax.servlet.include.context_path
javax.servlet.include.servlet_path
javax.servlet.include.path_info
javax.servlet.include.query_string
|
קידום דרישות מדפי
JSP
בדרך כלל הדרישה מגיעה
במקור מיישומון שרת ויישומון שרת מקדם אותה לדף JSP, אך
ניתן לפעול אחרת. ניתן לקבוע שדף היעד יהיה יישומון שרת. כדי לשלוח דרישות
ליישומוני שרת במקום לדפי JSP אין צורך לבצע שינויים בשימוש
ב-RequestDispatcher, עם זאת ישנה תמיכה תחבירית מיוחדת
בקידום דרישות מדפי JSP. ב-JSP
הפעולה jsp:forward פשוטה וניתן ליישם אותה על ידי הפקודה
הבאה:
<jsp:forward page="Relative URL"/>
|
התכונה page
יכולה להכיל ביטויי JSP כך שניתן לחשב את דף היעד
בזמן הדרישה.
|