מבוא ל- Java Servlets

1. סקירה כללית

במאמר זה נבחן היבט ליבה של פיתוח אתרים ב- Java - Servlets.

2. הסרוולט והמיכל

במילים פשוטות, Servlet הוא מחלקה המטפלת בבקשות, מעבד אותן ומשיב בחזרה עם תגובה.

לדוגמה, אנו יכולים להשתמש ב- Servlet כדי לאסוף קלט ממשתמש באמצעות טופס HTML, לשאול רשומות ממסד נתונים וליצור דפי אינטרנט באופן דינמי.

Servlets נמצאים בשליטת יישום ג'אווה אחר הנקרא a מיכל סרבל. כאשר יישום הפועל בשרת אינטרנט מקבל בקשה, השרת מעביר את הבקשה למיכל סרוולט - אשר בתורו מעביר אותה לסרוולט היעד.

3. תלות Maven

כדי להוסיף תמיכה ב- Servlet באפליקציית האינטרנט שלנו, ג'אווה.servlet-api נדרשת תלות:

 javax.servlet javax.servlet-api 3.1.0 

התלות האחרונה ב- maven נמצאת כאן.

כמובן שנצטרך להגדיר מיכל Servlet שיפרוס אליו; זהו מקום טוב להתחיל כיצד לפרוס מלחמה ב- Tomcat.

4. מחזור חיים של סרוולט

בואו נעבור על מכלול השיטות המגדירות את מחזור החיים של סרוולט.

4.1. init ()

ה init השיטה נועדה להיקרא פעם אחת בלבד. אם מופע של סרוולט אינו קיים, מיכל האינטרנט:

  1. טוען את כיתת הסרוולט
  2. יוצר מופע של מחלקת סרוולט
  3. מאתחל אותו על ידי התקשרות ל init שיטה

ה init על השיטה להסתיים בהצלחה לפני ש- servlet יכול לקבל בקשות כלשהן. מיכל ה- servlet אינו יכול להכניס את ה- servlet לשירות אם init או שיטה זורקת א ServletException או לא חוזר בתוך פרק זמן שהוגדר על ידי שרת האינטרנט.

init () מבטל ריק זורק ServletException {// קוד אתחול כמו הגדרת מסד נתונים וכו '....}

4.2. שֵׁרוּת()

שיטה זו נקראת רק לאחר סרוולט init () השיטה הושלמה בהצלחה.

המכולה מכנה את שֵׁרוּת() שיטה לטיפול בבקשות המגיעות מהלקוח, מפרש את סוג בקשת HTTP (לקבל, הודעה, לָשִׂים, לִמְחוֹקוכו ') ושיחות doGet, doPost, doPut, מחקוכו 'שיטות לפי הצורך.

שירות חלל ציבורי (בקשת ServletRequest, תגובת ServletResponse) זורק ServletException, IOException {// ...}

4.3. להרוס()

נקרא על ידי מיכל סרוולט להוציא את סרוולט משירות.

שיטה זו נקראת רק פעם אחת כל האשכולות בתוך סרוולט שֵׁרוּת השיטה יצאה או לאחר שחלפה תקופת הפסקה. לאחר שהמיכל קורא לשיטה זו, הוא לא יקרא ל- שֵׁרוּת שיטה שוב ב- Servlet.

חלל ציבורי להרוס () {//}

5. דוגמה לסולט

בואו נקבע דוגמה מלאה של טיפול במידע באמצעות טופס.

כדי להתחיל, בואו נגדיר סרוולט עם מיפוי / CalcServlet אשר יתפוס את המידע שפורסם על ידי הטופס ויחזיר את התוצאה באמצעות RequestDispatcher:

@WebServlet (name = "FormServlet", urlPatterns = "/ CalcServlet") בכיתה ציבורית FormServlet מרחיב את HttpServlet {@Override מוגן בטל doPost (HttpServletRequest בקשה, HttpServletResponse תגובה) זורק ServletException, IOException {בקשה גובה = Stringar =. ; משקל מחרוזת = request.getParameter ("משקל"); נסה {כפול bmi = חישוב BMI (Double.parseDouble (משקל), Double.parseDouble (גובה)); request.setAttribute ("bmi", bmi); response.setHeader ("מבחן", "הצלחה"); response.setHeader ("BMI", String.valueOf (bmi)); משגר RequestDispatcher = request.getRequestDispatcher ("index.jsp"); dispatcher.forward (בקשה, תגובה); } לתפוס (חריג e) {respons.sendRedirect ("index.jsp"); }} כפול פרטי CalcBMI (משקל כפול, גובה כפול) {משקל חזרה / (גובה * גובה); }}

כפי שמוצג לעיל, שיעורים רושמים עם @WebServlet חייב להאריך את javax.servlet.http.HttpServlet מעמד. חשוב לציין ש @WebServlet ביאור זמין רק מג'אווה EE 6 ואילך.

ה @WebServlet ההערה מעובדת על ידי המכולה בזמן הפריסה, וה- servlet המתאים זמין בדפוסי ה- URL שצוינו. ראוי לשים לב כי על ידי שימוש בהערה להגדרת דפוסי URL, אנו יכולים להימנע משימוש במתאר פריסת XML בשם. web.xml למיפוי סרוולט שלנו.

אם ברצוננו למפות את סרוולט ללא ביאור, נוכל להשתמש במסורת המסורתית web.xml במקום:

  FormServlet com.root.FormServlet FormServlet / CalcServlet 

לאחר מכן, בואו ניצור HTML בסיסי טופס:

המשקל שלך (ק"ג):
גובהך (מ '):

$ {bmi}

לסיום - כדי לוודא שהכל עובד כמצופה, בואו נכתוב גם מבחן מהיר:

מחלקה ציבורית FormServletLiveTest {@Test ציבורית בטל כאשר PostRequestUsingHttpClient_thenCorrect () זורק חריג {לקוח HttpClient = DefaultHttpClient חדש (); שיטת HttpPost = HttpPost חדש ("// localhost: 8080 / calcinServlet"); רשימת nvps = ArrayList חדש (); nvps.add (חדש BasicNameValuePair ("גובה", String.valueOf (2))); nvps.add (BasicNameValuePair חדש ("משקל", String.valueOf (80))); method.setEntity (UrlEncodedFormEntity חדש (nvps)); HttpResponse httpResponse = client.execute (שיטה); assertEquals ("הצלחה", httpResponse .getHeaders ("מבחן") [0] .getValue ()); assertEquals ("20.0", httpResponse .getHeaders ("BMI") [0] .getValue ()); }}

6. Servlet, HttpServlet ו- JSP

חשוב להבין זאת טכנולוגיית Servlet אינה מוגבלת לפרוטוקול HTTP.

בפועל זה כמעט תמיד, אבל סרוולט הוא ממשק כללי ו- HttpServlet הוא הרחבה של ממשק זה - הוספת תמיכה ספציפית ל- HTTP - כגון doGet ו doPost, וכו.

לבסוף, טכנולוגיית Servlet היא גם המניע העיקרי למספר טכנולוגיות אינטרנט אחרות כמו JSP - דפי JavaServer, Spring MVC וכו '.

7. מסקנה

במאמר מהיר זה הצגנו את היסודות של Servlets ביישום אינטרנט של Java.

ניתן להוריד ולהפעיל את פרויקט הדוגמה כפי שהוא כפרויקט GitHub.