מזהה אזור
REGION_ID הוא קוד מקוצר ש-Google מקצה על סמך האזור שבוחרים כשיוצרים את האפליקציה. הקוד לא תואם למדינה או למחוז, למרות שחלק ממזהי האזורים עשויים להיראות דומים לקודים נפוצים של מדינות ומחוזות. באפליקציות שנוצרו אחרי פברואר 2020, המחרוזת REGION_ID.r כלולה בכתובות ה-URL של App Engine. באפליקציות קיימות שנוצרו לפני התאריך הזה, מזהה האזור הוא אופציונלי בכתובת ה-URL.
אפליקציות אינטרנט ב-Java משתמשות בקובץ תיאור פריסה כדי לקבוע איך כתובות URL ממופות ל-servlets, אילו כתובות URL דורשות אימות ומידע נוסף. שם הקובץ הוא web.xml, והוא חלק ממפרט ה-servlet לאפליקציות אינטרנט.
מידע נוסף על web.xml קובץ תיאור פריסה זמין במפרט של Jakarta Servlet.
קובצי תיאור פריסה
קובץ תיאור הפריסה של אפליקציית אינטרנט מתאר את המחלקות, המשאבים וההגדרות של האפליקציה, ואיך שרת האינטרנט משתמש בהם כדי לטפל בבקשות אינטרנט. כאשר שרת האינטרנט מקבל בקשה לאפליקציה, הוא משתמש בקובץ תיאור הפריסה כדי למפות את כתובת ה-URL של הבקשה לקוד שאמור לטפל בבקשה.
קובץ תיאור הפריסה הוא קובץ בשם web.xml. הוא נמצא בקובץ ה-WAR של האפליקציה בספרייה WEB-INF/. הקובץ הוא קובץ XML שרכיב הבסיס שלו הוא <web-app>.
בדוגמה הבאה web.xml ממופים כל נתיבי כתובות ה-URL (/*) למחלקת ה-servlet mysite.server.ComingSoonServlet עבור Jakarta EE 10, EE 11 ב-servlet 6.0 ו-Java EE 8. כדי להשתמש בגרסה הנתמכת האחרונה בהגדרת ברירת המחדל, צריך לעדכן את ה-servlet של האפליקציה ואת התלות כדי לכלול את מרחב השמות Jakarta. למידע נוסף על אפשרויות ההגדרה, אפשר לעיין במאמר שדרוג אפליקציה קיימת.
Jakarta EE 11
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_1.xsd"
version="6.1">
<servlet>
<servlet-name>comingsoon</servlet-name>
<servlet-class>mysite.server.ComingSoonServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>comingsoon</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
Jakarta EE 10
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
version="6.0">
<servlet>
<servlet-name>comingsoon</servlet-name>
<servlet-class>mysite.server.ComingSoonServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>comingsoon</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
Java EE 8
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>comingsoon</servlet-name>
<servlet-class>mysite.server.ComingSoonServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>comingsoon</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
אם מחלקים את האפליקציה לשירותים, לכל שירות יש פרמטרים משלו להגדרה.
גישה לחבילות שירותים
אם אתם מבצעים העברה מ-Java 8 ואתם צריכים להשתמש בשירותים הישנים שצורפו לגרסה העדכנית הנתמכת של Java, אתם צריכים להוסיף את ההגדרה <app_engine_bundled_services> ולציין רשימה של שירותים ספציפיים שצורפו לקובץ web.xml.
מציינים את אחד מהשירותים הנתמכים הבאים שכלולים בחבילה בהגדרה הזו:
- זהות האפליקציה:
app_identity_service - Blobstore:
blobstore - יכולות:
capability_service - Datastore:
datastore_v3 - תמונות:
images - מרחבי שמות:
namespaces - חיפוש:
search - נדחה:
deferred - אימייל:
mail - Memcache:
memcache - מודולים:
modules - תורי משימות:
taskqueue - אחזור כתובת URL:
urlfetch - משתמש:
user
לדוגמה:
<app-engine-bundled-services>
<api>memcache</api>
<api>datastore_v3</api>
<api>modules</api>
<api>search</api>
<api>urlfetch</api>
<api>user</api>
<api>blobstore</api>
<api>images</api>
<api>mail</api>
<api>taskqueue</api>
<api>capability_service</api>
<api>app_identity_service</api>
</app-engine-bundled-services>
אפשר גם להגדיר את הרכיב <app-engine-apis> בקובץ web.xml כדי לקבל גישה לכל השירותים בחבילה. אם מציינים את השדה הזה, אי אפשר להשתמש בהגדרה <app_engine_bundled_services>.
Servlets ונתיבים של כתובות URL
web.xml מגדיר מיפויים בין נתיבי כתובות URL לבין הסרוולטים שמטפלים בבקשות עם הנתיבים האלה. שרת האינטרנט משתמש בהגדרה הזו כדי לזהות את ה-servlet לטיפול בבקשה נתונה, וקורא לשיטת המחלקה שמתאימה לשיטת הבקשה. לדוגמה: ה-method doGet() לבקשות HTTP GET.
כדי למפות כתובת URL ל-servlet, צריך להצהיר על ה-servlet באמצעות האלמנט <servlet>, ואז להגדיר מיפוי מנתיב כתובת ה-URL להצהרה על servlet באמצעות האלמנט <servlet-mapping>.
רכיב <servlet> מכריז על ה-servlet, כולל שם שמשמש להתייחסות ל-servlet על ידי רכיבים אחרים בקובץ, המחלקה שבה יש להשתמש עבור ה-servlet ופרמטרים של אתחול. אפשר להצהיר על כמה סרוולטים באמצעות אותה מחלקה עם פרמטרים שונים של אתחול. השם של כל servlet חייב להיות ייחודי בתוך קובץ תיאור הפריסה.
<servlet> <servlet-name>redteam</servlet-name> <servlet-class>mysite.server.TeamServlet</servlet-class> <init-param> <param-name>teamColor</param-name> <param-value>red</param-value> </init-param> <init-param> <param-name>bgColor</param-name> <param-value>#CC0000</param-value> </init-param> </servlet> <servlet> <servlet-name>blueteam</servlet-name> <servlet-class>mysite.server.TeamServlet</servlet-class> <init-param> <param-name>teamColor</param-name> <param-value>blue</param-value> </init-param> <init-param> <param-name>bgColor</param-name> <param-value>#0000CC</param-value> </init-param> </servlet>
רכיב <servlet-mapping> מציין תבנית URL ואת השם של סרוולט מוצהר לשימוש בבקשות שכתובת ה-URL שלהן תואמת לתבנית. בתבנית של כתובת ה-URL אפשר להשתמש בכוכבית (*) בתחילת התבנית או בסופה כדי לציין אפס תווים או יותר מכל תו. דפוס כתובת ה-URL לא תומך בתווים כלליים באמצע מחרוזת, ולא מאפשר שימוש בכמה תווים כלליים בדפוס אחד. התבנית תואמת לנתיב המלא של כתובת ה-URL, החל מהלוכסן (/) שאחרי שם הדומיין, כולל הלוכסן. נתיב כתובת ה-URL לא יכול להתחיל בנקודה (.).
<servlet-mapping> <servlet-name>redteam</servlet-name> <url-pattern>/red/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>blueteam</servlet-name> <url-pattern>/blue/*</url-pattern> </servlet-mapping>
בדוגמה הזו, בקשה לכתובת ה-URL https://www.example.com/blue/teamProfile מטופלת על ידי המחלקה TeamServlet, כשהפרמטר teamColor שווה ל-blue והפרמטר bgColor שווה ל-#0000CC. הסרוולט יכול לקבל את החלק של נתיב כתובת ה-URL שתואם לתו כללי באמצעות השיטה getPathInfo() של האובייקט ServletRequest.
הסרוולט יכול לגשת לפרמטרים של ההפעלה שלו באמצעות קבלת ההגדרה של הסרוולט באמצעות השיטה getServletConfig() שלו, ואז קריאה לשיטה getInitParameter() באובייקט ההגדרה באמצעות שם הפרמטר כארגומנט.
String teamColor = getServletConfig().getInitParameter("teamColor");
JSPs
אפליקציה יכולה להשתמש ב-JavaServer Pages (JSP) כדי להטמיע דפי אינטרנט. קובצי JSP הם סרוולטים שמוגדרים באמצעות תוכן סטטי, כמו HTML, שמעורב עם קוד Java.
App Engine תומך בהידור אוטומטי ובמיפוי של כתובות URL עבור קובצי JSP. קובץ JSP ב-WAR של האפליקציה (מחוץ ל-WEB-INF/) ששם הקובץ שלו מסתיים ב-.jsp עובר הידור אוטומטי למחלקת servlet, וממופה לנתיב כתובת ה-URL ששווה לנתיב לקובץ ה-JSP משורש ה-WAR. לדוגמה, אם באפליקציה יש קובץ JSP בשם start.jsp בספריית משנה בשם register/ ב-WAR שלה, App Engine מהדר אותו וממפה אותו לנתיב כתובת ה-URL /register/start.jsp.
אם רוצים לקבל יותר שליטה על המיפוי של JSP לכתובת URL, אפשר לציין את המיפוי באופן מפורש על ידי הצהרה עליו באמצעות רכיב <servlet> בתיאור הפריסה. במקום אלמנט <servlet-class>, מציינים אלמנט <jsp-file> עם הנתיב לקובץ ה-JSP משורש ה-WAR. האלמנט <servlet> של JSP יכול להכיל פרמטרים של אתחול.
<servlet> <servlet-name>register</servlet-name> <jsp-file>/register/start.jsp</jsp-file> </servlet> <servlet-mapping> <servlet-name>register</servlet-name> <url-pattern>/register/*</url-pattern> </servlet-mapping>
אפשר להתקין ספריות תגים של JSP באמצעות הרכיב <taglib>. ספריית תגים כוללת נתיב לקובץ המתאר של ספריית התגים של JSP (TLD) (<taglib-location>) ו-URI שדפי JSP משתמשים בו כדי לבחור את הספרייה לטעינה (<taglib-uri>). שימו לב ש-App Engine מספקת את ספריית התגים הרגילה של JavaServer Pages (JSTL), ואין צורך להתקין אותה.
<taglib> <taglib-uri>/escape</taglib-uri> <taglib-location>/WEB-INF/escape-tags.tld</taglib-location> </taglib>
אבטחה ואימות
אפליקציית App Engine יכולה להשתמש בחשבונות Google לאימות משתמשים. האפליקציה יכולה להשתמש ב-Google Accounts API כדי לזהות אם המשתמש מחובר, לקבל את כתובת האימייל של המשתמש שמחובר כרגע וליצור כתובות URL לכניסה ויציאה. אפליקציה יכולה גם לציין הגבלות גישה לנתיבי כתובות URL על סמך חשבונות Google, באמצעות מתאר הפריסה.
רכיב <security-constraint> מגדיר אילוצי אבטחה לכתובות URL שתואמות לתבנית. אם משתמש ניגש לכתובת URL שהנתיב שלה כולל הגבלת אבטחה והמשתמש לא מחובר, App Engine מפנה אותו אוטומטית לדף הכניסה לחשבונות Google. אחרי שהמשתמש נכנס לחשבון Google או רושם חשבון חדש, הוא מופנה חזרה לכתובת ה-URL של האפליקציה. האפליקציה לא צריכה לבצע פעולות נוספות כדי להבטיח שרק משתמשים מחוברים יוכלו לגשת לכתובת ה-URL.
מגבלת אבטחה כוללת מגבלת הרשאה שמציינת לאילו משתמשים עם חשבון Google יש גישה לנתיב. אם מגבלת ההרשאה מציינת תפקיד משתמש של *, כל משתמש שמחובר לחשבון Google יכול לגשת לכתובת ה-URL. אם המגבלה מציינת תפקיד משתמש של admin, רק מפתחים רשומים של האפליקציה יכולים לגשת לכתובת ה-URL. התפקיד admin מאפשר ליצור בקלות קטעים באתר שזמינים רק לאדמינים.
<security-constraint> <web-resource-collection> <web-resource-name>profile</web-resource-name> <url-pattern>/profile/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>*</role-name> </auth-constraint> </security-constraint> <security-constraint> <web-resource-collection> <web-resource-name>admin</web-resource-name> <url-pattern>/admin/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> </auth-constraint> </security-constraint>
App Engine לא תומך בתפקידי אבטחה בהתאמה אישית (<security-role>) או במנגנוני אימות חלופיים (<login-config>) בתיאור הפריסה.
הגבלות האבטחה חלות על קבצים סטטיים וגם על סרוולטים.
כתובות URL מאובטחות
App Engine תומך בחיבורים מאובטחים עם HTTPS לכתובות URL באמצעות הדומיין REGION_ID.r.appspot.com. כשבקשה ניגשת לכתובת URL באמצעות HTTPS, וכתובת ה-URL הזו מוגדרת לשימוש ב-HTTPS בקובץ web.xml, גם נתוני הבקשה וגם נתוני התגובה מוצפנים על ידי השולח לפני שהם מועברים, ומפוענחים על ידי הנמען אחרי שהם מתקבלים. חיבורים מאובטחים שימושיים להגנה על נתוני לקוחות, כמו פרטים ליצירת קשר, סיסמאות והודעות פרטיות.
כדי להצהיר שצריך להשתמש ב-HTTPS עבור כתובת URL, מגדירים אילוץ אבטחה בקובץ תיאור הפריסה (כפי שמתואר במאמר אבטחה ואימות) עם <user-data-constraint> שבו <transport-guarantee> הוא CONFIDENTIAL.
לדוגמה:
<security-constraint> <web-resource-collection> <web-resource-name>profile</web-resource-name> <url-pattern>/profile/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>
בקשות שמשתמשות ב-HTTP (לא מאובטח) לכתובות URL שההעברה שלהן מובטחת ב-CONFIDENTIAL מופנות אוטומטית לאותה כתובת URL באמצעות HTTPS.
כל כתובת URL יכולה להשתמש בהבטחת ההעברה CONFIDENTIAL, כולל קובצי JSP וקובצי סטטיים.
שרת פיתוח להצגה באינטרנט (development web server) לא תומך בחיבורי HTTPS. הוא מתעלם מההבטחה לגבי ההעברה, כך שאפשר לבדוק נתיבים שמיועדים לשימוש עם HTTPS באמצעות חיבורי HTTP רגילים לשרת האינטרנט של הפיתוח.
כשבודקים את אמצעי הטיפול ב-HTTPS של האפליקציה באמצעות כתובת URL עם גרסה ב-appspot.com, כמו https://1.latest.your_app_id.REGION_ID.r.appspot.com/, הדפדפן מציג אזהרה שאישור ה-HTTPS לא נחתם עבור נתיב הדומיין הספציפי הזה. אם תאשרו את האישור לדומיין הזה, הדפים ייטענו בהצלחה. המשתמשים לא יראו את אזהרת האישור כשהם ייגשו אל https://your_app_id.REGION_ID.r.appspot.com/.
אפשר גם להשתמש בפורמט חלופי של כתובת ה-URL עם הגרסה ב-appspot.com, שנועד למנוע את הבעיה הזו. כדי לעשות את זה, צריך להחליף את הנקודות שמפרידות בין רכיבי תת-הדומיין במחרוזת -dot-. לדוגמה, אפשר לגשת לדוגמה הקודמת ללא אזהרה לגבי אישור בכתובת https://VERSION_ID-dot-default-dot-PROJECT_ID.REGION_ID.r.appspot.com.
הכניסה לחשבונות Google והיציאה מהם מתבצעות תמיד באמצעות חיבור מאובטח, ואין קשר בין זה לבין האופן שבו כתובות ה-URL של האפליקציה מוגדרות.
כמו שצוין למעלה, מגבלות האבטחה חלות על קבצים סטטיים וגם על סרוולטים. האחריות הזו כוללת את האחריות על המשלוח.
הערה: Google ממליצה
להשתמש בפרוטוקול HTTPS כדי לשלוח בקשות לאפליקציה. Google לא מנפיקה אישורי SSL לדומיינים עם שני תווי כוכבית שמתארחים ב-appspot.com. לכן, כשמשתמשים ב-HTTPS, צריך להשתמש במחרוזת '-dot-' במקום בנקודה '.' כדי להפריד בין תתי-דומיינים, כמו בדוגמאות שלמטה. אפשר להשתמש בנקודה פשוטה '.' עם דומיין מותאם אישית משלכם או עם כתובות HTTP.
רשימת הקבצים של הודעת הפתיחה
כשכתובות ה-URL של האתר מייצגות נתיבים לקבצים סטטיים או ל-JSP ב-WAR, מומלץ בדרך כלל שהנתיבים לספריות יעשו גם הם משהו שימושי. משתמש שנכנס לנתיב כתובת ה-URL /help/accounts/password.jsp כדי לקבל מידע על סיסמאות לחשבון, עשוי לנסות להיכנס ל-/help/accounts/ כדי למצוא דף שמציג את התיעוד של מערכת החשבונות. קובץ תיאור הפריסה יכול לציין רשימה של שמות קבצים שהשרת צריך לנסות כשהמשתמש ניגש לנתיב שמייצג ספריית משנה של WAR שלא ממופה כבר באופן מפורש ל-servlet. במפרט ה-servlet, הרשימה הזו נקראת welcome file list.
לדוגמה, אם המשתמש ניגש לנתיב כתובת ה-URL /help/accounts/, הרכיב <welcome-file-list> הבא בקובץ תיאור הפריסה מציין לשרת לבדוק את help/accounts/index.jsp ואת help/accounts/index.html לפני שהוא מדווח שכתובת ה-URL לא קיימת:
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>מסננים
מסנן הוא מחלקה שפועלת על בקשה כמו סרוולט, אבל יכולה לאפשר לטיפול בבקשה להמשיך עם מסננים או סרוולטים אחרים. מסנן יכול לבצע משימה משנית, כמו רישום ביומן, ביצוע בדיקות אימות מיוחדות או הוספת הערות לאובייקטים של הבקשה או התגובה לפני הקריאה ל-servlet. המסננים מאפשרים לכם ליצור משימות לעיבוד בקשות מתוך קובץ תיאור הפריסה.
בדוגמה הבאה להטמעה של מסנן, הודעה נרשמת ביומן והשליטה מועברת בהמשך השרשרת, שעשויה לכלול מסננים אחרים או servlet, כפי שמתואר בקובץ תיאור הפריסה לגרסה 21 ואילך ב-EE10 (ברירת מחדל), לגרסה 21 ב-EE8 ולגרסה 17 ואילך. כדי להשתמש בגרסה העדכנית ביותר שנתמכת בהגדרת ברירת המחדל, צריך לעדכן את רכיבי ה-servlet של האפליקציה ואת התלות שלהם כך שיכללו את מרחב השמות Jakarta. מידע נוסף על אפשרויות ההגדרה זמין במאמר בנושא שדרוג אפליקציה קיימת.
גרסה 21 ואילך (EE10)
במחלקה הזו של המסנן מוטמע הממשק jakarta.servlet.Filter עם המתודה doFilter().
package mysite.server;
import java.io.IOException;
import java.util.logging.Logger;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
public class LogFilterImpl implements Filter {
private FilterConfig filterConfig;
private static final Logger log = Logger.getLogger(LogFilterImpl.class.getName());
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
log.warning("Log filter processed a " + getFilterConfig().getInitParameter("logType")
+ " request");
filterChain.doFilter(request, response);
}
public FilterConfig getFilterConfig() {
return filterConfig;
}
public void init(FilterConfig filterConfig) {
this.filterConfig = filterConfig;
}
public void destroy() {}
}
v21 (EE8)
במחלקה הזו של המסנן מוטמע הממשק javax.servlet.Filter עם המתודה doFilter().
package mysite.server;
import java.io.IOException;
import java.util.logging.Logger;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class LogFilterImpl implements Filter {
private FilterConfig filterConfig;
private static final Logger log = Logger.getLogger(LogFilterImpl.class.getName());
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
log.warning("Log filter processed a " + getFilterConfig().getInitParameter("logType")
+ " request");
filterChain.doFilter(request, response);
}
public FilterConfig getFilterConfig() {
return filterConfig;
}
public void init(FilterConfig filterConfig) {
this.filterConfig = filterConfig;
}
public void destroy() {}
}
גרסה 17 וגרסאות קודמות
במחלקה הזו של המסנן מוטמע הממשק javax.servlet.Filter עם המתודה doFilter().
package mysite.server;
import java.io.IOException;
import java.util.logging.Logger;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class LogFilterImpl implements Filter {
private FilterConfig filterConfig;
private static final Logger log = Logger.getLogger(LogFilterImpl.class.getName());
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
log.warning("Log filter processed a " + getFilterConfig().getInitParameter("logType")
+ " request");
filterChain.doFilter(request, response);
}
public FilterConfig getFilterConfig() {
return filterConfig;
}
public void init(FilterConfig filterConfig) {
this.filterConfig = filterConfig;
}
public void destroy() {}
}
בדומה ל-servlets, מגדירים מסנן בקובץ תיאור פריסה על ידי הצהרה על המסנן באמצעות רכיב <filter>, ואז מיפוי שלו לתבנית URL באמצעות רכיב <filter-mapping>. אפשר גם למפות מסננים ישירות לסרוולטים אחרים.
הרכיב <filter> מכיל רכיבים <filter-name>, <filter-class> ורכיבים אופציונליים <init-param>.
<filter> <filter-name>logSpecial</filter-name> <filter-class>mysite.server.LogFilterImpl</filter-class> <init-param> <param-name>logType</param-name> <param-value>special</param-value> </init-param> </filter>
האלמנט <filter-mapping> מכיל את האלמנט <filter-name> שתואם לשם של מסנן מוצהר, ואת האלמנט <url-pattern> להחלת המסנן על כתובות URL, או את האלמנט <servlet-name> שתואם לשם של servlet מוצהר להחלת המסנן בכל פעם שה-servlet נקרא.
<!-- Log for all URLs ending in ".special" --> <filter-mapping> <filter-name>logSpecial</filter-name> <url-pattern>*.special</url-pattern> </filter-mapping> <!-- Log for all URLs that use the "comingsoon" servlet --> <filter-mapping> <filter-name>logSpecial</filter-name> <servlet-name>comingsoon</servlet-name> </filter-mapping>
טיפול בשגיאות
אפשר להתאים אישית את מה שהשרת שולח למשתמש כשמתרחשת שגיאה, באמצעות קובץ תיאור הפריסה. השרת יכול להציג מיקום חלופי של דף כשהוא עומד לשלוח קוד סטטוס של HTTP מסוים, או כשסרוולט מעלה חריג Java מסוים.
האלמנט <error-page> מכיל אלמנט <error-code> עם ערך של קוד שגיאת HTTP (למשל 500), או אלמנט <exception-type> עם שם המחלקה של החריגה הצפויה (למשל java.io.IOException). הוא מכיל גם אלמנט <location> עם נתיב כתובת ה-URL של המשאב שיוצג כשהשגיאה מתרחשת.
<error-page> <error-code>500</error-code> <location>/errors/servererror.jsp</location> </error-page>
אי אפשר להגדיר מטפלים מותאמים אישית בשגיאות עבור תנאי השגיאה הבאים:
404תגובה לדף כשלא מוגדר מיפוי של servlet לכתובת URL.- דף שגיאת מכסה
403 500דף שגיאת שרת שמופיע אחרי שגיאה פנימית ב-App Engine.
תכונות שלא נתמכות ב-web.xml
התכונות הבאות של web.xml לא נתמכות ב-App Engine:
- App Engine תומך ברכיב
<load-on-startup>להצהרות על סרוולטים. עם זאת, הטעינה מתרחשת בפועל במהלך הבקשה הראשונה שמטופלת על ידי מופע שרת האינטרנט, ולא לפני כן. - חלק מרכיבי תיאור הפריסה יכולים לקבל שם מוצג קריא, תיאור וסמל לשימוש בסביבות פיתוח משולבות (IDE). App Engine לא משתמש בהן ומתעלם מהן.
- App Engine לא תומך במשתני סביבה של JNDI (
<env-entry>). - App Engine לא תומך במשאבי EJB (
<resource-ref>). - אין תמיכה בהודעה על השמדה של סרוולטים, הקשר של סרוולט או מסננים.
- המערכת מתעלמת מהרכיב
<distributable>. - אין תמיכה בתזמון של Servlet באמצעות
<run-at>.