מה זה סרבלט?
ראשית, בואו נבין מהם servlets ולמה אתה שומע עליהם לעתים קרובות כל כך. Java Servlet API הוא API סטנדרטי המיועד ליישום בשרת. הוא מקיים אינטראקציה עם לקוחות על פי סכמת תגובה לבקשה. servlet הוא מחלקה שיכולה לקבל בקשות מלקוח ולהחזיר תשובות ללקוח . למעשה, servlets הם בדיוק אבני הבניין שבהן אנו משתמשים כדי ליצור ארכיטקטורת שרת-לקוח ב-Java. אתם אולי זוכרים שכבר דיברנו על הארכיטקטורה הזו באחד אחר מהמאמרים בסדרה. אנחנו לא הולכים לנצח: בוא נכתוב קוד מיד.מה אתה צריך כדי ליצור יישום אינטרנט
לנוחות מירבית בעת עבודה עם שרתים של Java, אתה צריך IntelliJ IDEA Ultimate Edition. זה מוצר בתשלום, אבל אתה יכול להפעיל ניסיון של 30 יום או להשתמש בגרסת הגישה המוקדמת, שהיא תמיד בחינם. כמו כן, התקן את Apache Tomcat - שרת האפליקציה שלנו. Tomcat הוא מיכל servlet: הוא מעבד בקשות נכנסות ומעביר אותן לאפליקציה שלנו. הורד את Tomcat כאן .בואו ניצור את יישום האינטרנט הראשון שלנו
אם הכל מוכן, צור פרויקט של מייבן. אם אינך מכיר את מייבן, עיין במאמר הקודם . בואו נתחיל!-
ב-pom.xml, הוסף תלות javax.servlet-api וציין אריזת WAR:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>servlets</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> </dependencies> </project>
שיעור servlet פשוט:
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet("/hello") public class MainServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter printWriter = resp.getWriter(); printWriter.write("Hello!"); printWriter.close(); } }
-
כדי להפעיל את האפליקציה, עליך ליצור תצורת Tomcat:
-
לאחר מכן, אנו מציינים באיזו גרסה של Tomcat נשתמש, ואת כתובת האתר והיציאה לתקשורת עם השרת. אמור להיות לך משהו כזה:
-
עכשיו אנחנו רק צריכים לציין את החפץ (הפרויקט המורכב בארכיון JAR) שייפרס בקונטיינר. אתה יכול ללחוץ על כפתור התיקון ולבחור war exploded : זה אומר שלאחר בניית הפרויקט מחדש, החפץ יוצב אוטומטית במיכל ה-servlet.
-
ערך ברירת המחדל עבור ההקשר של היישום הוא servlets_war_exploded . משמעות הדבר היא שאנו ניגשים ליישום בכתובת: http://localhost:8080/servlets_war_exploded .
למה שנרצה טקסט נוסף? בוא נמחק את מה שמיותר. כעת, הכתובת של יישום האינטרנט שלנו היא: http://localhost:8080 .
-
לחץ על אישור. אנו רואים שאנו יכולים כעת להפעיל את האפליקציה:
כעת כאשר אתה פותח את היישום בדפדפן שלך, אתה אמור לקבל שגיאה 404. זה הגיוני, כי הכתובת http://localhost:8080/ זקוקה ל-servlet שממפה ל-"/", אבל ה-servlet היחיד שלנו ממפה ל -"/hello" .
-
נוכל לגשת אליו בכתובת http://localhost:8080/hello . ברגע שנעשה זאת, נקבל את התשובה הצפויה - המחרוזת "שלום"!
@WebServlet()
ההערה. זה המקום שבו אנו קושרים (או ממפים) את ה-servlet לנתיב מסוים ("/hello"). הערה זו הופיעה רק ב-Java Servlet API 3.0, כך שלאינטרנט יש הרבה דוגמאות שבהן מיפוי servlet מתרחש באמצעות קובץ XML. זה כבר לא נחוץ. כדי לטפל בבקשות GET , אנו עוקפים את doGet()
השיטה. שימו לב לפרמטרים של השיטה: HttpServletRequest
ו HttpServletResponse
. החפץ HttpServletRequest
מספק לנו את כל המידע הדרוש לגבי הבקשה. ב- HttpServletResponse
, אנו כותבים את התגובה שלנו ומגדירים את הכותרות הנחוצות.
עבודה עם פרמטרים ופגישה
בואו נשפר את ה-servlet שלנו כך שיוכל לעבד פרמטרים של בקשות ולעבוד עם הפעלה:import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/hello")
public class MainServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
Integer visitCounter = (Integer) session.getAttribute("visitCounter");
if (visitCounter == null) {
visitCounter = 1;
} else {
visitCounter++;
}
session.setAttribute("visitCounter", visitCounter);
String username = req.getParameter("username");
resp.setContentType("text/html");
PrintWriter printWriter = resp.getWriter();
if (username == null) {
printWriter.write("Hello, Anonymous" + "<br>");
} else {
printWriter.write("Hello, " + username + "<br>");
}
printWriter.write("Page was visited " + visitCounter + " times.");
printWriter.close();
}
}
כעת ה-servlet עובד עם הפעלה, ומגדיל את הערך של visitCounter
כל פעם שהדף מבקר. אם visitCounter
התכונה עדיין לא נוצרה (בביקור הראשון בדף), השיטה getAttribute()
מחזירה null, ולכן עלינו לבדוק את null. אותו דבר לגבי פרמטרי בקשה. אם המשתמש לא יעביר את פרמטר שם המשתמש, הערך שלו יהיה null. במקרה זה, אנו מברכים את המשתמש כמבקר אנונימי. כדי להעביר פרמטר בבקשת GET, נעשה שימוש במחרוזת שאילתה. לדוגמה, נוכל להשתמש בכתובת האתר הבאה: http:// localhost:8080/hello?
שם משתמש=פול. עוד על בקשות HTTP תוכלו לקרוא במאמר הקודם
בסדרה. לאפליקציה שלנו כרגע אין הרבה היגיון, אבל זה קצת מעצבן שאנחנו מקבלים שגיאה 404 בנתיב השורש. כדי לתקן זאת, ניצור servlet נוסף ונמפה אותו לדף ההתחלה: @WebServlet("/")
. המטרה של servlet זה היא להפנות בקשות לנתיב "/hello". ישנן שתי דרכים לעשות זאת: באמצעות "העבר" או "הפניה מחדש". אולי כדאי להבין את ההבדל ביניהם. העברה מאציל את עיבוד הבקשה לשרת אחר בשרת. הלקוח אינו מעורב. כדי לעשות זאת, הוסף את הקוד הבא לשיטת doGet() של השרת החדש:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
בקוד זה, אנו ניגשים להקשר של servlet, מקבלים את שולח הבקשות עבור ה-servlet הרלוונטי, ומבקשים ממנו לעבד בקשה ספציפית עם הארגומנטים שצוינו (req, resp). הפניה מחדש מחזירה ללקוח את הכתובת שבה הלקוח חייב להשתמש כדי לעבד את בקשתו. רוב הדפדפנים מנווטים אוטומטית לכתובת האתר המוחזרת. כדי ליישם הפניה מחדש, עליך להוסיף את הקוד הזה:
resp.sendRedirect(req.getContextPath() + "/hello");
אנו קוראים למתודה redirect()
על הפרמטר HttpServletResponse
ומעבירים לה את הכתובת שהלקוח צריך להשתמש בה. הנה פרט חשוב: יש להוסיף פרמטרים של HTTP גם בסוף נתיב ההפניה המלא, וזה לא מאוד נוח. במצב שלנו, עדיף להשתמש ב- forward
, אבל לפעמים השימוש redirect
עדיף. אם אתה מבין את ההבדל באופן שבו הם פועלים, לא תבחר לא נכון. הקוד של ה-servlet החדש נראה כך:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/")
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// getServletContext().getRequestDispatcher("/hello").forward(req, resp);
resp.sendRedirect(req.getContextPath() + "/hello");
}
}
GO TO FULL VERSION