JavaRush /בלוג Java /Random-HE /יצירת יישום אינטרנט פשוט באמצעות servlets ו-jsp (חלק 2)
Стас Пасинков
רָמָה
Киев

יצירת יישום אינטרנט פשוט באמצעות servlets ו-jsp (חלק 2)

פורסם בקבוצה
יצירת אפליקציית אינטרנט פשוטה באמצעות servlets ו-jsp (חלק 1) רמת הידע הנדרשת להבנת המאמר: כבר פחות או יותר הבנתם את Java Core והייתם רוצים להסתכל על טכנולוגיות JavaEE ותכנות אינטרנט. זה הגיוני ביותר אם אתה לומד כעת את החיפוש של Java Collections, המכסה נושאים קרובים למאמר.
יצירת יישום אינטרנט פשוט באמצעות servlets ו-jsp (חלק 2) - 1

יצירת ישויות

בחבילת entities ניצור מחלקה User , ובה יהיו שני משתני מחרוזת פרטיים שם וסיסמה . בוא ניצור בנאים (ברירת מחדל ואחד שיקבל את שני הערכים), getters/seters, נעקוף את המתודה toString() למקרה הצורך, כמו גם את המתודות equals() ו- hashCode() . כלומר, נעשה כל מה שמפתח ג'אווה הגון עושה בעת יצירת מחלקה.
public class User {
    private String name;
    private String password;

    public User() {
    }

    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        User user = (User) o;

        if (name != null ? !name.equals(user.name) : user.name != null) return false;
        return password != null ? password.equals(user.password) : user.password == null;

    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + (password != null ? password.hashCode() : 0);
        return result;
    }
}
כעת נוכל להתחיל ליצור רשימת משתמשים. נוסיף אליו משתמשים, ומהיכן ניקח אותם לתצוגה. עם זאת, יש בעיה אחת. אנחנו לא יוצרים את אובייקטי ה-servlet שלנו, Tomcat עושה זאת עבורנו . גם השיטות שאנו עוקפים בהן כבר מוגדרות עבורנו, ואין באפשרותנו להוסיף פרמטר. כיצד אם כן נוכל ליצור רשימה משותפת שגלויה לשני הסרבלטים שלנו? אם פשוט ניצור אובייקט רשימה משלנו בכל servlet, יתברר שנוסיף משתמשים לרשימה אחת, ונציג את רשימת המשתמשים המשתמשים ב- ListServlet לרשימה אחרת. מסתבר שאנחנו צריכים אובייקט שיהיה משותף לשני הסרבלטים. באופן כללי, אנו זקוקים לאובייקט שיהיה משותף לכל הכיתות בתוכנית שלנו; האובייקט היחיד עבור התוכנית כולה. אני מקווה ששמעת משהו על דפוסי עיצוב. ואולי, עבור חלק זה הצורך האמיתי הראשון להשתמש בתבנית Singleton בתוכנית שלהם. אתה יכול להיות סוטה וליצור איזה סינגלטון מגניב עם בדיקות כפולות וסנכרון (כן, יש לנו אפליקציה מרובה הליכי, מכיוון ש-Tomcat מריץ servlets בשרשורים שונים), אבל אני אשתמש באפשרות עם אתחול מוקדם, מכיוון שהיא די מתאימה כאן מספיק וזה מתאים למטרות שלנו.

יצירת מודל

בואו ניצור מחלקה (וניישם בה את תבנית הסינגלטון ) בחבילת המודל ונקרא לזה משהו יוצא דופן. נניח דגם . בואו ניצור אובייקט רשימת משתמשים פרטיים במחלקה שלנו, וניישם שתי שיטות: האחת כדי שנוכל להוסיף משתמש, והשנייה כדי להחזיר רשימה של מחרוזות (שמות משתמש). מכיוון שאובייקט המשתמש שלנו מורכב משם וסיסמה, ולא נרצה "לחשוף" סיסמאות משתמש, תהיה לנו רק רשימה של שמות.
public class Model {
    private static Model instance = new Model();

    private List<User> model;

    public static Model getInstance() {
        return instance;
    }

    private Model() {
        model = new ArrayList<>();
    }

    public void add(User user) {
        model.add(user);
    }

    public List<String> list() {
        return model.stream()
                .map(User::getName)
                .collect(Collectors.toList());
    }
}

קצת על mvc

מאז ששמעתם על סינגלטון , אז בטח שמעתם על דפוס עיצובי אחר - MVC (דגם-view-controller, ברוסית model-view-controller, או בדיוק כמו באנגלית model-view-controller). המהות שלו היא להפריד בין ההיגיון העסקי למצגת. כלומר, הפרידו את הקוד שקובע מה לעשות מהקוד שקובע איך להציג. View (תצוגה או פשוט תצוגות) אחראי על הצורה שבה חלק מהנתונים מוצגים. במקרה שלנו, הצפיות הן דפי ה-JSP שלנו. לכן שמתי אותם בתיקייה בשם תצוגות . המודל הוא הנתונים בפועל איתם עובדת התוכנית. במקרה שלנו, מדובר במשתמשים (רשימת משתמשים). ובכן, בקרים הם החוליה המקשרת ביניהם. הם לוקחים נתונים מהמודל ומעבירים אותם לתצוגות (או מקבלים כמה נתונים מטומקט, מעבדים אותם ומעבירים אותם למודל). ההיגיון העסקי (מה בדיוק התוכנית צריכה לעשות) צריך להיות מתואר בהם, ולא במודל או בתצוגה. אז כל אחד עושה את שלו:
  • הדגם מאחסן נתונים;
  • תצוגות מציירות ייצוג יפה של הנתונים;
  • בקרים מטפלים בעיבוד נתונים.
זה מאפשר לתוכנית להיות די פשוטה וניתנת לתחזוקה, במקום dump מפלצתי של כל הקוד במחלקה אחת. MVC מתאים לא רק לתכנות אינטרנט, אלא גם בתחום זה הוא נמצא לעתים קרובות במיוחד (כמעט תמיד). במקרה שלנו, servlets ישמשו כבקרים. זהו תיאור שטחי וקצר מאוד של הדפוס, אך MVC אינו הנושא העיקרי של מאמר זה. מי שרוצה לדעת יותר - גוגל להצלה! צור טופס להוספת משתמש בוא נוסיף לקובץ add.jsp טופס המורכב משני שדות קלט טקסט (אחד רגיל, השני סיסמא) וכפתור לשליחת נתונים לשרת.
<form method="post">
    <label>Name:
        <input type="text" name="name"><br />
    </label>

    <label>Password:
        <input type="password" name="pass"><br />
    </label>
    <button type="submit">Submit</button>
</form>
כאן יש לטופס מאפיין מתודה עם הערך פוסט . המשמעות היא שהנתונים מטופס זה יישלחו לשרת בצורה של בקשת POST. תכונת הפעולה לא צוינה, מה שאומר שהבקשה תישלח לאותה כתובת שבה הלכנו לדף זה ( /add ). לפיכך, הסרבלט שלנו, המחובר לכתובת זו, עם קבלת בקשת GET, מחזיר את ה-jsp הזה עם הטופס להוספת משתמשים, ואם הוא מקבל בקשת POST, זה אומר שהטופס שלח את הנתונים שלו לשם (שאותם נשלף מה- request object בשיטת doPost() ראוי לציין שלשדות הקלט יש פרמטר שם (עבור שדה עם שם יש לו את שם הערך, ולשדה עם סיסמה יש את הערך pass ). זו נקודה די חשובה. מכיוון שכדי לקבל את הנתונים הללו (שם וסיסמה שיוכנסו) מהבקשה (כבר בתוך ה-servlet), נשתמש בדיוק בשם וב- pass . אבל עוד על כך בהמשך. הכפתור לשליחת הנתונים עצמו נעשה שוב בצורת כפתור , ולא כשדה פלט, כמקובל בדרך כלל. אני לא יודע עד כמה האפשרות הזו אוניברסלית, אבל היא עובדת בשבילי (דפדפן כרום).

עיבוד בקשת POST עם servlet

בואו נחזור לשרת AddServlet . הרשו לי להזכיר לכם: על מנת שהסרבלט שלנו יוכל "לתפוס" בקשות GET, דרפנו את שיטת doGet() מהמחלקה HttpServlet . כדי ללמד את ה-servlet שלנו לתפוס גם בקשות POST, עלינו גם לעקוף את שיטת doPost() . הוא מקבל אובייקטי בקשה ותגובה דומים מ- Tomcat , שאיתם נעבוד. ראשית, בואו נחלץ מהבקשה את השם ונעביר פרמטרים שהטופס שלח (אם כיניתם אותם אחרת בטופס, אז אלו השמות שאתם כותבים). לאחר מכן, ניצור את אובייקט המשתמש שלנו באמצעות הנתונים שהתקבלו. לאחר מכן נקבל את אובייקט המודל ונוסיף את המשתמש שנוצר למודל.
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String name = req.getParameter("name");
    String password = req.getParameter("pass");
    User user = new User(name, password);
    Model model = Model.getInstance();
    model.add(user);
}

מעביר נתונים לצפייה

בוא נעבור לשרת ListServlet . השיטה doGet() כבר הוטמעה כאן , אשר פשוט מעבירה את השליטה לתצוגת list.jsp . אם עדיין אין לך את זה, עשה זאת באנלוגיה עם אותה שיטה מה- AddServlet servlet . עכשיו יהיה נחמד לקבל רשימה של שמות משתמש מהדגם ולהעביר אותם לתצוגה, שיקבל אותם ויציג אותם יפה. לשם כך, נשתמש שוב באובייקט הבקשה שקיבלנו מ- Tomcat . אנו יכולים להוסיף תכונה לאובייקט הזה, לתת לו שם כלשהו, ​​ולמעשה, לאובייקט עצמו, אותו נרצה להעביר לתצוגה . בשל העובדה שבעת העברת תהליך הביצוע מ-servlet ל-view, אנו מעבירים לשם את אותם אובייקטי בקשה ותגובה שהסרבל עצמו קיבל, ואז על ידי הוספת רשימת השמות שלנו לאובייקט הבקשה, נוכל לאחר מכן מתוך בקשה זו אובייקט בתצוגה צור את רשימת שמות המשתמש שלנו וקבל. סיימנו עם המחלקה ListServlet , אז הנה הקוד לכל המחלקה:
package app.servlets;

import app.model.Model;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

public class ListServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Model model = Model.getInstance();
        List<String> names = model.list();
        req.setAttribute("userNames", names);

        RequestDispatcher requestDispatcher = req.getRequestDispatcher("views/list.jsp");
        requestDispatcher.forward(req, resp);
    }
}

ביצוע קוד java בקבצי jsp

זה הזמן להתחיל לעבוד על הקובץ list.jsp . זה יבוצע רק כאשר ListServlet יעבור כאן את תהליך הביצוע. בנוסף, באותו servlet כבר הכנו רשימה של שמות משתמשים מהמודל והעברנו אותה כאן באובייקט הבקשה. מכיוון שיש לנו רשימה של שמות, אנחנו יכולים לעבור בה ולהדפיס כל שם. כפי שכבר אמרתי, קבצי jsp יכולים להפעיל קוד java (וזה מה שמבדיל אותם מדפי HTML סטטיים). כדי לבצע קוד כלשהו, ​​מספיק לשים את הקונסטרוקציה הבאה במקום שאנו צריכים:
<!-- html code -->
<%
    // java code
%>
<!-- html code -->
בתוך המבנה הזה יש לנו גישה למספר משתנים:
  • request הוא אובייקט הבקשה שלנו, אותו העברנו מהסרבלט, שם הוא נקרא פשוט req ;
  • אובייקט תגובה - תגובה, הנקרא resp ב-servlet ;
  • out הוא אובייקט מסוג JspWriter (הועבר בירושה מה- Writer הרגיל ), בעזרתו נוכל "לכתוב" משהו ישירות לעמוד ה-html עצמו. הערך out.println("Hello world!") דומה מאוד לערך System.out.println("Hello world!") , אך אל תבלבל בין השניים!
    out.println() "כותב" לעמוד ה-html, ו- System.out.println כותב לפלט המערכת. אם תקרא למתודה jsp System.out.println() בתוך הקטע עם קוד Java , תראה את התוצאות במסוף Tomcat , ולא בדף.

אתה יכול לחפש אובייקטים זמינים אחרים בתוך jsp כאן . באמצעות ה- request object , נוכל לקבל את רשימת השמות שהועברו מה-servlet (צירפנו את התכונה המתאימה לאובייקט זה), ובאמצעות ה- out object , נוכל להציג את השמות הללו. בואו נעשה זאת (בינתיים רק בצורה של רשימת HTML):
<ul>
    <%
        List<String> names = (List<String>) request.getAttribute("userNames");

        if (names != null && !names.isEmpty()) {
            for (String s : names) {
                out.println("<li>" + s + "</li>");
            }
        }
    %>
</ul>
אם אתה צריך להציג רשימה רק אם יש משתמשים, ובדרך אחרת להציג אזהרה שאין משתמשים עדיין, נוכל לשכתב מעט את הסעיף הזה:
<%
    List<String> names = (List<String>) request.getAttribute("userNames");

    if (names != null && !names.isEmpty()) {
        out.println("<ui>");
        for (String s : names) {
            out.println("<li>" + s + "</li>");
        }
        out.println("</ui>");
    } else out.println("<p>There are no users yet!</p>");
%>
כעת, כשנוכל להעביר נתונים מ-servlets לתצוגות, אנו יכולים לשפר מעט את AddServlet שלנו כך שתוצג הודעה כאשר משתמש נוסף בהצלחה. לשם כך, בשיטת doPost() , לאחר הוספת משתמש חדש למודל, נוכל להוסיף את שם המשתמש הזה לתכונות של אובייקט req ולהעביר את השליטה בחזרה לתצוגה של add.jsp . ובו כבר עושים קטע עם קוד Java שבו בודקים אם תכונה כזו נמצאת בבקשה, ואם כן אז פלט הודעה שציינה שהמשתמש נוסף בהצלחה. לאחר השינויים הללו, קוד ה-servlet המלא של AddServlet ייראה בערך כך:
package app.servlets;

import app.entities.User;
import app.model.Model;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class AddServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("views/add.jsp");
        requestDispatcher.forward(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getParameter("name");
        String password = req.getParameter("pass");
        User user = new User(name, password);
        Model model = Model.getInstance();
        model.add(user);

        req.setAttribute("userName", name);
        doGet(req, resp);
    }
}
כאן, בסוף שיטת doPost() , אנו מגדירים תכונה עם שם המשתמש שנוסף למודל, ולאחר מכן אנו קוראים לשיטת doGet() , אליה נעביר את הבקשה והתגובה הנוכחית. ומתודה doGet() כבר מעבירה את השליטה לתצוגה, שם היא שולחת אובייקט בקשה עם שם המשתמש שנוסף מצורף כתכונה. כל מה שנותר הוא לתקן את add.jsp כך שיציג הודעה כזו אם קיימת תכונה כזו. ה-add.jsp האחרון הוא :
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>Add new user</title>
    </head>

    <body>
        <div>
            <h1>Super app!</h1>
        </div>

        <div>
            <%
                if (request.getAttribute("userName") != null) {
                    out.println("<p>User '" + request.getAttribute("userName") + "' added!</p>");
                }
            %>
            <div>
                <div>
                    <h2>Add user</h2>
                </div>

                <form method="post">
                    <label>Name:
                        <input type="text" name="name"><br />
                    </label>
                    <label>Password:
                        <input type="password" name="pass"><br />
                    </label>
                    <button type="submit">Submit</button>
                </form>
            </div>
        </div>

        <div>
            <button onclick="location.href='/'">Back to main</button>
        </div>
    </body>
</html>
גוף העמוד מורכב מ:
  • div-a עם כותרת עליונה;
  • div container לתוכן, הוא בודק אם קיימת תכונה עם שם המשתמש;
  • div עם טופס להוספת משתמשים;
  • ובסוף יש כותרת תחתונה עם כפתור כדי לחזור לעמוד הראשי.
זה אולי נראה כאילו יש יותר מדי divs, אבל נשתמש בהם מאוחר יותר כשנוסיף סגנונות. ה- list.jsp הסופי הוא:
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>Users</title>
    </head>

    <body>
        <div>
            <h1>Super app!</h1>
        </div>

        <div>
            <div>
                <div>
                    <h2>Users</h2>
                </div>
                <%
                    List<String> names = (List<String>) request.getAttribute("userNames");

                    if (names != null && !names.isEmpty()) {
                        out.println("<ui>");
                        for (String s : names) {
                            out.println("<li>" + s + "</li>");
                        }
                        out.println("</ui>");
                    } else out.println("<p>There are no users yet!</p>");
                %>
            </div>
        </div>

        <div>
            <button onclick="location.href='/'">Back to main</button>
        </div>
    </body>
</html>
לפיכך, יש לנו אפליקציית אינטרנט הפועלת במלואה שיכולה לאחסן ולהוסיף משתמשים, כמו גם להציג רשימה של שמותיהם. כל מה שנשאר זה לייפות אותו... :)

הוספת סגנונות. אנו משתמשים במסגרת W3.CSS

כרגע האפליקציה שלנו עובדת, אבל מטורפת לחלוטין. לכן, נוסיף רקע, צבע של טקסט וכפתורים, רשימות סגנונות, נעשה יישור, נוסיף כניסות וכדומה. אם אתה כותב סגנונות באופן ידני, זה יכול לקחת הרבה זמן ועצבים. לכן, אני מציע להשתמש במסגרת W3.CSS CSS. יש לו כבר שיעורים מוכנים עם סגנונות; כל מה שנותר הוא למקם את שיעורי ה-CSS שאנו רוצים ליישם במקומות הנכונים. על מנת להוסיף אותם לדפים שלנו, ראשית נכלול קובץ עם סגנונות. ניתן לעשות זאת בשתי דרכים:
  1. עברו על הדפים שלנו ובמדור ראש הכנסו קישור ישיר לקובץ עם סגנונות

    <link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">

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


  2. אם ברצונך לקבל את כל הסגנונות באופן מקומי ולא להיות תלוי בחיבור לאינטרנט, הורד את הקובץ עם הסגנונות והנח אותו איפשהו בתוך תיקיית האינטרנט (לדוגמה, web/styles/w3.css ), ולאחר מכן עבור על כל הסגנונות שלנו. דפים ( index.html, add.jsp, list.jsp ) והזן קישור לקובץ זה עם סגנונות בתוך החלק הראשי

    <link rel="stylesheet" href="styles/w3.css">

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

index.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Super app!</title>
        <link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
    </head>

    <body class="w3-light-grey">
        <div class="w3-container w3-blue-grey w3-opacity w3-right-align">
            <h1>Super app!</h1>
        </div>

        <div class="w3-container w3-center">
            <div class="w3-bar w3-padding-large w3-padding-24">
                <button class="w3-btn w3-hover-light-blue w3-round-large" onclick="location.href='/list'">List users</button>
                <button class="w3-btn w3-hover-green w3-round-large" onclick="location.href='/add'">Add user</button>
            </div>
        </div>
    </body>
</html>

add.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>Add new user</title>
        <link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
    </head>

    <body class="w3-light-grey">
        <div class="w3-container w3-blue-grey w3-opacity w3-right-align">
            <h1>Super app!</h1>
        </div>

        <div class="w3-container w3-padding">
            <%
                if (request.getAttribute("userName") != null) {
                    out.println("<div class=\"w3-panel w3-green w3-display-container w3-card-4 w3-round\">\n" +
                            "   <span onclick=\"this.parentElement.style.display='none'\"\n" +
                            "   class=\"w3-button w3-margin-right w3-display-right w3-round-large w3-hover-green w3-border w3-border-green w3-hover-border-grey\">×</span>\n" +
                            "   <h5>User '" + request.getAttribute("userName") + "' added!</h5>\n" +
                            "</div>");
                }
            %>
            <div class="w3-card-4">
                <div class="w3-container w3-center w3-green">
                    <h2>Add user</h2>
                </div>
                <form method="post" class="w3-selection w3-light-grey w3-padding">
                    <label>Name:
                        <input type="text" name="name" class="w3-input w3-animate-input w3-border w3-round-large" style="width: 30%"><br />
                    </label>
                    <label>Password:
                        <input type="password" name="pass" class="w3-input w3-animate-input w3-border w3-round-large" style="width: 30%"><br />
                    </label>
                    <button type="submit" class="w3-btn w3-green w3-round-large w3-margin-bottom">Submit</button>
                </form>
            </div>
        </div>

        <div class="w3-container w3-grey w3-opacity w3-right-align w3-padding">
            <button class="w3-btn w3-round-large" onclick="location.href='/'">Back to main</button>
        </div>
    </body>
</html>

list.jsp

<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>Users list</title>
        <link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
    </head>

    <body class="w3-light-grey">
        <div class="w3-container w3-blue-grey w3-opacity w3-right-align">
            <h1>Super app!</h1>
        </div>

        <div class="w3-container w3-center w3-margin-bottom w3-padding">
            <div class="w3-card-4">
                <div class="w3-container w3-light-blue">
                    <h2>Users</h2>
                </div>
                <%
                    List<String> names = (List<String>) request.getAttribute("userNames");

                    if (names != null && !names.isEmpty()) {
                        out.println("<ul class=\"w3-ul\">");
                        for (String s : names) {
                            out.println("<li class=\"w3-hover-sand\">" + s + "</li>");
                        }
                        out.println("</ul>");

                    } else out.println("<div class=\"w3-panel w3-red w3-display-container w3-card-4 w3-round\">\n"
+
                            "   <span onclick=\"this.parentElement.style.display='none'\"\n" +
                            "   class=\"w3-button w3-margin-right w3-display-right w3-round-large w3-hover-red w3-border w3-border-red w3-hover-border-grey\">×</span>\n" +
                            "   <h5>There are no users yet!</h5>\n" +
                            "</div>");
                %>
            </div>
        </div>

        <div class="w3-container w3-grey w3-opacity w3-right-align w3-padding">
            <button class="w3-btn w3-round-large" onclick="location.href='/'">Back to main</button>
        </div>
    </body>
</html>
זה הכל :) אם עדיין יש לך שאלות או הערות, או להיפך, משהו לא מסתדר - השאר תגובה. UPD: אם יש לך בעיות עם שגיאות 404 בעת לחיצה על כפתורים, למרות שהכל נעשה כהלכה, אולי עליך לתקן את תצורת הפריסה ברעיון. לשם כך צריך לעבור ל- Edit configurations (בחלק העליון ליד כפתור ההתחלה), לעבור ללשונית Deployment בצד ימין של החלון ולוודא שבהקשר של Application זה פשוט מצוין / Well, I' אצרף כמה צילומי מסך של מה שיצא מכל זה.
יצירת יישום אינטרנט פשוט באמצעות servlets ו-jsp (חלק 2) - 2
יצירת יישום אינטרנט פשוט באמצעות servlets ו-jsp (חלק 2) - 3
יצירת יישום אינטרנט פשוט באמצעות servlets ו-jsp (חלק 2) - 4
ולבסוף , אם אתה רוצה להתאמן עם הפרויקט הזה, אתה יכול לנסות:
  • צור servlet ו-jsp כדי למחוק משתמש ועוד כמה כדי לשנות/לערוך משתמש קיים. תקבל יישום אינטרנט אמיתי CrUD :) על servlets));
  • החלף את הרשימה (List) בעבודה עם מסד נתונים כדי שמשתמשים שנוספו לא ייעלמו לאחר הפעלה מחדש של השרת :)
בהצלחה!
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION