CodeGym /בלוג Java /Random-HE /חלק 5. Servlets ו-Java Servlet API. כתיבת יישום אינטרנט פ...
John Squirrels
רָמָה
San Francisco

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

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

מה זה סרבלט?

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

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

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

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

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

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

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

    חלק 5. Servlets ו-Java Servlet API.  כתיבת יישום אינטרנט פשוט - 4
  4. עכשיו אנחנו רק צריכים לציין את החפץ (הפרויקט המורכב בארכיון JAR) שייפרס בקונטיינר. אתה יכול ללחוץ על כפתור התיקון ולבחור 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 שממפה ל-"/", אבל ה-servlet היחיד שלנו ממפה ל -"/hello" .

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

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

סיכום

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