JavaRush /בלוג Java /Random-HE /חלק 5. Servlets, Java servlet API. כתיבת יישום אינטרנט פש...

חלק 5. Servlets, Java servlet API. כתיבת יישום אינטרנט פשוט

פורסם בקבוצה
חומר זה הוא חלק מסדרת "מבוא לפיתוח ארגוני". מאמרים קודמים: חלק 5. Servlets, Java servlet API.  כתיבת יישום אינטרנט פשוט - 1האם אתה כבר יודע איך לכתוב יישומי Java שמוציאים טקסט לקונסולה, אבל אתה עדיין לא באמת יודע איך ליצור את יישום האינטרנט הראשון שלך? מעולה, תרגישי בנוח. במאמר זה נערוך היכרות עם servlets ונכתוב אפליקציה שתוכל להשוויץ בה בפני חבריך מבלי לשלוח להם jarnik או לאלץ אותם להוריד Java. בוא נכתוב יישום אינטרנט . אם אתה עדיין לא מכיר את הגישות המשמשות בתכנות אינטרנט, אני ממליץ לך להתחיל לקרוא מהמאמר הראשון בסדרה " מבוא לפיתוח ארגוני ".

מה זה סרבלט

ראשית, בואו נבין מה זה servlet ולמה אתה שומע עליו לעתים קרובות כל כך. Java Servlet API הוא API סטנדרטי המיועד להטמעה בשרת ולעבודה עם הלקוח באמצעות סכימת תגובה לבקשה. servlet הוא מחלקה שיכולה לקבל בקשות מלקוח ולהחזיר לו תגובות. כן, servlets ב-Java הם בדיוק האלמנטים שאיתם בנויה ארכיטקטורת שרת-לקוח. אם אתם זוכרים, כבר דיברנו על זה באחת הכתבות בסדרה. בואו לא נסתער: בואו נכתוב קוד מיד.

מה אתה צריך כדי ליצור יישום אינטרנט

כדי לעבוד בנוחות עם servlets ב-Java, תצטרך Intellij IDEA Ultimate Edition. זה בתשלום, אבל אתה יכול להפעיל תקופת ניסיון של 30 יום או להשתמש בגרסת הגישה המוקדמת - זה תמיד בחינם. התקן גם את שרת היישומים שלנו - Apache Tomcat. Tomcat הוא מיכל servlet: הוא זה שמעבד בקשות נכנסות מבחוץ ומעביר אותן לאפליקציה שלנו. אתה יכול להוריד את Tomcat מהקישור הזה .

יצירת יישום האינטרנט הראשון

אם הכל מוכן, בואו ניצור פרויקט של מייבן. אם אינכם מכירים את Maven, שימו לב למאמר הקודם . בואו נתחיל!
  1. ב-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();
       }
    }
  2. כדי להפעיל את האפליקציה, עליך ליצור תצורת Tomcat:

    חלק 5. Servlets, Java servlet API.  כתיבת יישום אינטרנט פשוט - 2 חלק 5. Servlets, Java servlet API.  כתיבת יישום אינטרנט פשוט - 3

  3. לאחר מכן, אנו מציינים באיזו גרסה של Tomcat נשתמש, את כתובת האתר שבאמצעותה נוכל לגשת לשרת, ואת הפורט. אתה אמור לקבל משהו כזה:

    חלק 5. Servlets, Java servlet API.  כתיבת יישום אינטרנט פשוט - 4
  4. כל שנותר הוא לציין את החפץ (הפרויקט המורכב לארכיון צנצנת), שייפרס במיכל. אתה יכול ללחוץ על כפתור התיקון ולבחור war exploded : זה אומר שאחרי שהפרויקט נבנה מחדש, החפץ יוצב אוטומטית במיכל ה-servlet. חלק 5. Servlets, Java servlet API.  כתיבת יישום אינטרנט פשוט - 5

  5. ההקשר של היישום מוגדר ל- servlets_war_exploded כברירת מחדל , מה שאומר שיש לגשת ליישום בכתובת: http://localhost:8080/servlets_war_exploded .

    למה אנחנו צריכים טקסט נוסף? בוא נסיר דברים מיותרים. כעת כתובת היישום שלנו היא: http://localhost:8080 .

    חלק 5. Servlets, Java servlet API.  כתיבת יישום אינטרנט פשוט - 6

  6. לחץ על אישור. אנו רואים שיש לנו כעת הזדמנות להשיק את האפליקציה:

    חלק 5. Servlets, Java servlet API.  כתיבת יישום אינטרנט פשוט - 7

    כעת, כאשר אתה מפעיל את היישום, הדפדפן אמור להיפתח ולהציג שגיאת 404. זה הגיוני, כי בכתובת http://localhost:8080/ אמור להיות servlet עם המיפוי "/", ולסרבלט היחיד שלנו יש את המיפוי "/hello" .

  7. אנו יוצרים איתו קשר בכתובת http://localhost:8080/hello ומקבלים את התגובה הצפויה - המחרוזת "Hello"!

אם הכל עובד, בואו נסתכל על הקוד. כדי ליצור servlet http ממחלקה רגילה , עליך לרשת אותו מהמחלקה HttpServlet. מעל המחלקה אנו מציינים את ההערה @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?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");
   }
}

שורה תחתונה

אפליקציית האינטרנט הראשונה שלך מוכנה. במאמר הבא תלמדו כיצד לפרוס אותו מבלי להשתמש ב- Intellij IDEA. כתבנו אפליקציה שמעבדת רק בקשות GET. שאר שיטות ה-http מעובדות באותו אופן - עוקף את השיטות המתאימות של מחלקת האב. באמצעות servlets פשוטים כאלה, אתה יכול לבנות יישומי אינטרנט מורכבים ועשירים. כמובן, באמצעות מסגרות גדולות כמו Spring, זה הרבה יותר קל לעשות. אבל אם אתה באמת רוצה להתעמק בכל היכולות של servlets ביתר פירוט, אתה יכול לקרוא את המפרט הרשמי . חלק 6. מיכלי Servlet חלק 7. מבוא לתבנית MVC (Model-View-Controller) חלק 8. כתיבת אפליקציה קטנה בקפיץ-מגף
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION