מה זה סרבלט
ראשית, בואו נבין מה זה servlet ולמה אתה שומע עליו לעתים קרובות כל כך. Java Servlet API הוא API סטנדרטי המיועד להטמעה בשרת ולעבודה עם הלקוח באמצעות סכימת תגובה לבקשה. servlet הוא מחלקה שיכולה לקבל בקשות מלקוח ולהחזיר לו תגובות. כן, servlets ב-Java הם בדיוק האלמנטים שאיתם בנויה ארכיטקטורת שרת-לקוח. אם אתם זוכרים, כבר דיברנו על זה באחת הכתבות בסדרה. בואו לא נסתער: בואו נכתוב קוד מיד.מה אתה צריך כדי ליצור יישום אינטרנט
כדי לעבוד בנוחות עם servlets ב-Java, תצטרך Intellij IDEA Ultimate Edition. זה בתשלום, אבל אתה יכול להפעיל תקופת ניסיון של 30 יום או להשתמש בגרסת הגישה המוקדמת - זה תמיד בחינם. התקן גם את שרת היישומים שלנו - Apache Tomcat. Tomcat הוא מיכל servlet: הוא זה שמעבד בקשות נכנסות מבחוץ ומעביר אותן לאפליקציה שלנו. אתה יכול להוריד את Tomcat מהקישור הזה .יצירת יישום האינטרנט הראשון
אם הכל מוכן, בואו ניצור פרויקט של מייבן. אם אינכם מכירים את Maven, שימו לב למאמר הקודם . בואו נתחיל!-
ב-pom.xml, הוסף את התלות javax.servlet-api והגדר את מלחמת האריזה:
<?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 נשתמש, את כתובת האתר שבאמצעותה נוכל לגשת לשרת, ואת הפורט. אתה אמור לקבל משהו כזה:
-
כל שנותר הוא לציין את החפץ (הפרויקט המורכב לארכיון צנצנת), שייפרס במיכל. אתה יכול ללחוץ על כפתור התיקון ולבחור war exploded : זה אומר שאחרי שהפרויקט נבנה מחדש, החפץ יוצב אוטומטית במיכל ה-servlet.
-
ההקשר של היישום מוגדר ל- servlets_war_exploded כברירת מחדל , מה שאומר שיש לגשת ליישום בכתובת: http://localhost:8080/servlets_war_exploded .
למה אנחנו צריכים טקסט נוסף? בוא נסיר דברים מיותרים. כעת כתובת היישום שלנו היא: http://localhost:8080 .
-
לחץ על אישור. אנו רואים שיש לנו כעת הזדמנות להשיק את האפליקציה:
כעת, כאשר אתה מפעיל את היישום, הדפדפן אמור להיפתח ולהציג שגיאת 404. זה הגיוני, כי בכתובת http://localhost:8080/ אמור להיות servlet עם המיפוי "/", ולסרבלט היחיד שלנו יש את המיפוי "/hello" .
-
אנו יוצרים איתו קשר בכתובת http://localhost:8080/hello ומקבלים את התגובה הצפויה - המחרוזת "Hello"!
עבודה עם פרמטרים ופגישה
בואו נשפר את ה-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?username=Pavel . עוד על בקשות http תוכלו לקרוא במאמר הקודם בסדרה. עכשיו לאפליקציה שלנו יש היגיון מינימלי, אבל שגיאת 404 בנתיב השורש קצת מעצבנת. כדי לתקן את זה, בואו ניצור servlet נוסף ונמפה אותו לעמוד הראשוני @WebServlet("/"). תפקידו של servlet זה הוא להפנות בקשות לנתיב "/hello". ישנן שתי דרכים לעשות זאת: באמצעות העברה או הפניה מחדש. אולי כדאי להבין מה ההבדל ביניהם. קדימה - מאציל עיבוד בקשות לשרת אחר בשרת, הלקוח אינו מעורב. כדי לעשות זאת, עליך להוסיף את הקוד הבא לשיטת doGet() של ה-servlet החדש:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
בקוד זה, אנו ניגשים להקשר של servlet, מקבלים ממנו את מנהל הבקשות של ה-servlet הרצוי ומבקשים ממנו לעבד בקשה ספציפית עם הפרמטרים שצוינו (req, resp). הפניה מחדש - מחזירה ללקוח את הכתובת אליה הוא צריך לפנות כדי לטפל בבקשתו. רוב הדפדפנים עוברים לקישור המועבר באופן אוטומטי. כדי ליישם את ההפניה מחדש, עליך להוסיף את הקוד הזה:
resp.sendRedirect(req.getContextPath() + "/hello");
ב-HttpServletResponse אנו קוראים לשיטת redirect() ומעבירים לה את הכתובת שהלקוח צריך לפנות אליה. פרט חשוב: יש להוסיף גם פרמטרים של 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