JavaRush /Java блогу /Random-KY /Java сервлеттерин колдонгон биринчи колдонмоңуз
Джон Дориан
Деңгээл

Java сервлеттерин колдонгон биринчи колдонмоңуз

Группада жарыяланган
Баарына салам! Бул макалада сиз сервлеттердин веб-иштеп чыгуунун негизги концепциясы менен таанышып, аларды колдонуу менен жөнөкөй тиркемени жаза аласыз. Керексиз кадамдарды болтурбоо үчүн, биз нөлдөн баштабайбыз жана Hibernate жөнүндөJava сервлеттерин колдонгон биринчи колдонмоңуз - 1 мурунку макаламдагы колдонмобуздун үстүндө иштей беребиз . Бирок, биз сервлеттерди жаңыдан баштап жаткандыктан, мен тиркемеден Auto классына тиешелүү нерселердин баарын алып салдым жана Колдонуучу классын жана анын аракеттерин гана калтырдым. Долбоордун структурасы мындай болот: Ошентип, сервлеттер! Wikipedia мындай дейт: "Сервлет бул Java интерфейси, анын ишке ашырылышы serverдин функционалдуулугун кеңейтет. Сервлет суроо-жооп принциби аркылуу кардарлар менен өз ара аракеттенет." Жана чындап эле ошондой. Бул жерде биз биринчи жолу "кардар-serverдик колдонмо архитектурасы" түшүнүгүнө туш болобуз. Анын маңызы абдан жөнөкөй жана бир сүрөткө туура келет ( бул жерден алынган ). Java сервлеттерин колдонгон биринчи колдонмоңуз - 2
Java Servlets колдонгон биринчи колдонмоңуз - 3
Кардар HTTP сурам жөнөтүү аркылуу server менен байланышат. Сервер керектүү маалыматтарды генерациялайт (мисалы, аны маалымат базасынан алат) жана аны кардарга кайтарып берет. Эң жөнөкөй мисал: белгилүү бир социалдык тармакта сиз "Достор" баскычын басып, serverге суроо-талап жөнөтөсүз. Сервер маалымат базасындагы досторуңуздун тизмесин текшерет жана аны сизге (кардарга) кайтарып берет. HTTP суроо-талаптарынын тизмеси абдан чоң, бирок сиз аларды эч качан жолуктурбасаңыз, анда жакшыраак түшүнүү үчүн алар жөнүндө окуганыңыз жакшы, мисалы, бул жерде . Биздин милдет: Сервлеттерди колдонуу менен CRUD тиркемесин түзүү. Колдонмо HTTP суроо-талаптарын иштеткен сервлеттин жардамы менен маалымат базасынан колдонуучуларды түзө, өзгөртүп жана жок кыла алышы керек. Биздин Hibernate жөнүндө макаладагы тиркеме муну кантип жасоону мурунтан эле билген, бирок ал түздөн-түз Java codeунан, тагыраагы, main() ыкмасынан башкарылчу. Бул жерде суроо-талаптар кардар тарабынан жөнөтүлөт, башкача айтканда, сиз :) Биринчиден, биздин pom.xml файлыбызга жаңы көз карандылыктарды кошуу керек.
<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>com.itis4</groupId>
    <artifactId>UsersDaoProject</artifactId>
    <version>1.0-SNAPSHOT</version>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.6</version>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <!-- PostgreSQL  -->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.4.1212.jre7</version>
        </dependency>

        <!-- Hibernate 5.2.6 Final -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.6.Final</version>
        </dependency>

        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.4.RELEASE</version>
        </dependency>

    </dependencies>

</project>
Биз 3 көз карандылыкты коштук:
  1. javax.servlet-api китепканасынын өзү;
  2. JSTL тэг китепканасы. Бул кардар тарабын, тактап айтканда JSP баракчаларын түзүү үчүн керек болот;
  3. Spring-WebMVC. Бизге бир Жазгы класс керек болот, ал тууралуу бир аздан кийин сүйлөшөбүз.
Сервлеттердин иштөөсү сервлет контейнери тарабынан башкарылат. Биздин учурда биз Apache Tomcat колдонобуз. Абдан популярдуу нерсе жана сиз ал жөнүндө уккандырсыз :) Сервлеттин жашоо цикли төмөнкү кадамдардан турат:
  1. Контейнерде сервлет жок болсо.
    • Сервлет классы контейнер тарабынан жүктөлөт.
    • Контейнер сервлет классынын мисалын түзөт.
    • Контейнер init() ыкмасын чакырат. Бул ыкма сервлетти инициализациялайт жана сервлет суроо-талаптарды тейлөөгө чейин биринчи чакырылат. init() методу бүткүл жашоо циклинде бир гана жолу чакырылат.
  2. Кардардын суроо-талабын тейлөө. Ар бир суроо өзүнчө жипте иштетилет. Контейнер ар бир суроо үчүн service() ыкмасын чакырат. Бул ыкма келип түшкөн суроо-талаптын түрүн аныктайт жана аны суроо-талапты иштетүү үчүн ушул түргө туура келген ыкмага бөлүштүрөт. Сервлетти иштеп чыгуучу бул ыкмаларды ишке ашырууну камсыз кылышы керек. Эгерде сурам кабыл алынса, ал үчүн метод ишке ашпаса, ата-эне класстын ыкмасы чакырылат жана адатта ката сурамчыга кайтарылып берилет.
  3. Контейнер сервлетті жок кылышы керек болгон учурда, ал serverлетті кызматтан алып салган destroy() ыкмасын чакырат. init() ыкмасы сыяктуу эле, бул ыкма да бүт сервлет циклинин ичинде бир жолу чакырылат.
Биздин сервлет абдан жөнөкөй көрүнөт:
package servlets;

import models.User;
import services.UserService;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
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 UserSimpleServlet extends HttpServlet {

    private UserService service = new UserService();

    public void init(ServletConfig servletConfig) {
        try {
            super.init(servletConfig);
        } catch (ServletException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        List<User> users = service.findAllUsers();
        req.setAttribute("users", users);
        RequestDispatcher dispatcher = req.getRequestDispatcher("/showUsers.jsp");
        dispatcher.forward(req, resp);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        String name = req.getParameter("name");
        int age = Integer.parseInt(req.getParameter("age"));
        User user = new User(name, age);
        service.saveUser(user);
        resp.sendRedirect("/users");

    }

    @Override
    protected void  doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        int id = Integer.parseInt(req.getParameter("id"));
        User user = service.findUser(id);
        user.setName(req.getParameter("name"));
        user.setAge(Integer.parseInt(req.getParameter("age")));
        service.updateUser(user);
        resp.sendRedirect("/users");
    }

    @Override
    protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        int id = Integer.parseInt(req.getParameter("id"));
        service.deleteUser(service.findUser(id));
        resp.sendRedirect("/users");
    }
}
Көрүнүп тургандай, ал жогоруда сүрөттөлгөн init() ыкмасын камтыйт жана төрт HTTP сурамына дал келген 4 ыкманы ишке ашырат - doGet(), doPost(), doPut() жана doDelete(). Алардын ар бири бизге колдонуучуларды кабыл алууга, түзүүгө, түзөтүүгө жана жок кылууга мүмкүндүк берет. Методдор javax.servlet.http.HttpServletRequest жана javax.servlet.http.HttpServletResponse класстарынын киргизүү an objectилери катары кабыл алынат - башкача айтканда, serverге жөнөтүлгөн суроо-талап жана кардар алган жооп. Методдордун ичинде UserService классынын керектүү методдору аткарылып, кардар үчүн жооп түзүлүп, андан кийин /users дарегине багытталат. Мисалы, doGet() методунда биз бардык колдонуучулардын тизмесин алабыз. Андан кийин, биз Http сурамына an objectтерди кошууга, ошондой эле аны белгилүү бир ресурска (мисалы, кардар JSP барагына) багыттоого мүмкүндүк берүүчү RequestDispatcher классынын an objectин түзөбүз. doPut() методунда (колдонуучунун маалыматтарын жаңыртуу) биз HTTP сурамын иштеп чыгабыз, андан идентификаторду, аты-жөнүн жана жашынын параметрлерин чыгарып алабыз, көрсөтүлгөн идентификатору бар колдонуучуну табабыз, ага аны менен бирге келген атын жана жашын дайындайбыз. сураныч жана баракка кайтуу / колдонуучулар. Бирок, бардык бул ыкмалар туура иштеши үчүн, биз сервлетти конфигурациялашыбыз керек. Бул үчүн биз WEB-INF папкасындагы web.xml файлын колдонобуз.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1"
         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <servlet>
        <servlet-name>UserSimpleServlet</servlet-name>
        <servlet-class>servlets.UserSimpleServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>UserSimpleServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <filter>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <servlet-name>UserSimpleServlet</servlet-name>
    </filter-mapping>

</web-app>
Бул файлдагы бардык тэгдер, негизинен, интуитивдик, бирок аларды ырааттуу карап көрөлү. <саламдашуу-файл тизмеси> - баштапкы JSP барагы көрсөтүлөт, ал тиркеме ишке киргенде биринчи ачылат. Биздин учурда, бул index.jsp барагы. <servlet> - UserSimpleServlet классыбызды сервлет катары каттоо. <servlet-mapping> абдан маанилүү теги. Ал сервлет тарабынан иштетиле турган URL'дерди аныктайт. Биздин учурда, бул бардык URL даректери, ошондуктан биз жөн гана "/" көрсөтөбүз. Бирок, мисалы, бизде колдонуучулар жана алардын машиналары бар тиркеме болсо, анда биз экинчи сервлетти түзө алабыз - SimpleAutoServlet. Анда колдонуучунун сервлетинин картасы "/users" (башкача айтканда, колдонуучуларды иштетүүгө байланышкан суроо-талаптар), ал эми автосервлет үчүн "/autos" болмок. Акыры, <фильтр>. Ал org.springframework.web.filter.HiddenHttpMethodFilter классынын an objectисин ички аныктайт. Макала Жазга тиешеси жок, ошондуктан мен ал жөнүндө кеңири сөз кылбайм. Айта кетейин, ал биздин тиркемеге кошумча функция катары гана тиркелет. Кеп, биз кардар тарабын түзүү үчүн JSP баракчаларын колдонобуз. Биздин маалыматтар баракта колдонуучулардын тизмеси менен table катары көрсөтүлөт. JSP баракчаларынын ичинде HTML <form/> тегдери колдонулат. Жана гана HTTP GET жана POST сурамдары <form/>дан берorштерди жөнөтүү үчүн колдонулушу мүмкүн. Башкача айтканда, бардык үч операция үчүн - жаңыртуу, жок кылуу жана колдонуучуну түзүү - биз POST сурамдарын гана колдонушубуз керек. PUT жана DELETE сурамдарын колдонуу биз үчүн жеткorксиз болмок. Жана, негизинен, бул нормалдуу жана ишке ашыруу оңой, бирок HiddenHttpMethodFilter классы аларды колдонууга мүмкүндүк берет. Бул колдонмодогу операциялардын ортосундагы айырмачылыктарды окурманга айкыныраак кылат. Акырында, кардар тарапка өтөбүз. Ал беш JSP баракчасы менен көрсөтүлгөн. index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Здравствуйте!</title>
</head>
<body>
Если вы хотите начать работу с базой данных пользователей - <br>
нажмите кнопку ниже:

<form action = "users" method="get">
    <input type="submit" value="Начать работу с базой данных">
</form>
</body>
</html>
addUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Добавить нового пользователя</title>
</head>
<body>
<form action = "/users" method="post">
    <input required type="text" name="name" placeholder="Name">
    <input required type="text" name="age" placeholder="Возраст">
    <input type="submit" value="Сохранить">
</form>
</body>
</html>
deleteUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Удалить пользователя</title>
</head>
<body>

Вы действительно хотите удалить пользователя ${param.id}?

&lform action="/users/${param.id}" method="post">
    <input type="hidden" name="id" value="${param.id}">
    <input type="hidden" name="_method" value="delete">
    <input type="submit" value="Удалить">
</form>

</body>
</html>
showUsers.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Список пользователей</title>
</head>
<body>
<table border="2">
    <tr>
        <td>ID</td>
        <td>Name</td>
        <td>Возраст</td>
        <td>Действия</td>
    </tr>
    <c:forEach items="${users}" var = "user">
        <tr>
            <td>${user.getId()}</td>
            <td>${user.getName()}</td>
            <td>${user.getAge()}</td>
            <td>
                <form action = "updateUser.jsp" method="post">
                    <input type="hidden" name="id" value="${user.getId()}">
                    <input type="hidden" name="name" value="${user.getName()}">
                    <input type="hidden" name="age" value="${user.getAge()}">
                    <input type="submit" value="Изменить" style="float:left">
                </form>
                <form action="deleteUser.jsp" method="post">
                    <input type="hidden" name="id" value="${user.getId()}">
                    <input type="submit" value="Удалить" style="float:left">
                </form></td>
        </tr>
    </c:forEach>
</table>

<form action = "addUser.jsp">
    <input type="submit" value="Добавить нового пользователя">
</form>
</body>
</html>
updateUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Изменить данные пользователя</title>
</head>
<body>

Редактировать пользователя

<form action="/users/${param.id}" method="post">
    <input type="hidden" name = "id" value="${param.id}">
    <input type="text" name="name" value="${param.name}" placeholder=${param.name}>
    <input type="text" name="age" value="${param.age}" placeholder=${param.age}>
    <input type="hidden" name="_method" value="put">
    <input type="submit" value="Обновить">
</form>

</body>
</html>
JSP барагы (Java Server Page) тексттин эки түрүн камтыйт: текст форматтарынын биринде (HTML, SVG, WML же XML) болушу мүмкүн болгон статикалык булак маалыматтары жана динамикалык мазмунду түзүүчү JSP элементтери. JSP деген эмне экенин түшүнүү үчүн, мен бир автордун абдан жакшы макаласын көчүрүп, чаптоого уруксат берем ( бул жерден ). "Негизи, JSP биринчи жолу киргенде сервлетке айландырылат жана сервлет катары иштейт. Муну түшүнүү абдан маанилүү. JSP HTML баракчасына окшоп барак ЭМЕС - бул жаңы баштаган программист үчүн муну так түшүнүшү маанилүү. бул дагы бир сервлет - анын чыгарылышын программалоонун кереги жок.Аны жөн эле тарта аласыз.Жана маалыматтарды керектүү жерлерге алмаштырсаңыз болот.Бирок JSP барагы жок дегенде кандайдыр бир деңгээлде HTMLге окшош болгондуктан, дизайнерге оңой болот. Жана мен дагы бир жолу башталгычтарга катуу айтам - JSP бул SERVLET . Ал serverдеги бардык маалыматтар менен даярдалган. Бул жерде бардык маалыматтар киргизилет. Жана колдонуучу браузерде даяр HTML баракчасын алат, ал эмес. JAVA белгилери бар." JSP баракчасы чындап эле сервлет экенин өзүңүз көрө аласыз, анткени ар бир баракта аткарылышы керек болгон метод бар. Мисалы, index.jsp баштапкы бетинде "Базасы менен иштөөнү баштоо" баскычын басканда, method="get" аткарылат деп айтылат. Жаңы колдонуучуну түзүүгө жооптуу болгон addUser.jsp бетинде, сактоо баскычын басканда, method="post" аткарылат. JSPтин калган бөлүгү кадимки статикалык HTML белгилөөдөн турат, ошондуктан биз аларга майда-чүйдөсүнө чейин токтолбойбуз - бул өзүнчө макаланын темасы, алар Интернетте көп. Ошентип, биз колдонмобузду түздүк, болгону аны иш жүзүндө сынап көрүү гана калды! Бул үчүн бизге жогоруда айтылган Apache Tomcat сервлет контейнери керек болот. Сиз мышыкты расмий веб-сайттан жүктөп алсаңыз болот (мен 8-versionны колдоном). Андан кийин, Tomcat аркылуу колдонмобузду иштетүү үчүн IDEAда конфигурация түзүшүбүз керек. Бул үчүн, "Конфигурацияларды түзөтүү" өтмөгүн ачып, Java Servlets колдонгон биринчи колдонмоңуз - 4жаңы конфигурацияны түзүп Java Servlets колдонгон биринчи колдонмоңуз - 5, Tomcat Server Local тандаңыз. Колдонмо serverи өтмөгүндө, Tomcat жайгашкан папкага жолду көрсөтүңүз.Андан Java Servlets колдонгон биринчи колдонмоңуз - 6кийин Жайгаштыруу өтмөгүнө өтүңүз. Ваше первое приложение с использованием Java-сервлетов - 7Бул жерде биз локалдык serverде биздин тиркеменин жайгаштырылышын конфигурациялайбыз. "+" чыкылдатып, "Артефактты" тандаңыз -> Долбооруңуздун аты: согуш (биз тиркемени согуш файлына чогултабыз). Ваше первое приложение с использованием Java-сервлетов - 8Негизинен ушундай! "Сервер" барагында ошол эле колдонмо "http://localhost:8080/" дарегинде иштей турганын көрө аласыз. Бул конфигурацияны сактап, аны бир нерсе деп атаңыз (менин конфигурация атым "Томми"). Андан кийин, IDEAдагы Maven өтмөгүндө (оң жакта) биз долбоорубузду согуш файлына куруу үчүн согуш плагинин колдонобуз (Plugins -> war -> war: war). Ваше первое приложение с использованием Java-сервлетов - 9Ваше первое приложение с использованием Java-сервлетов - 10Ийгorк! Башталгыч бет ачылды. Эми "База менен иштөөнү баштоо" баскычын чыкылдатыңыз. JSP баракчабыз index.jsp server тарабынан иштетиле турган GET сурамын жаратат. Сервер жоопту жаратып, аны бизге бардык колдонуучулардын тизмеси түрүндө кайтарып берет (эгер алар, албетте, маалымат базасында болсо). Жана алар мына! Ваше первое приложение с использованием Java-сервлетов - 12Келгиле, колдонуучулардын бирин жок кылууга аракет кылалы: Ваше первое приложение с использованием Java-сервлетов - 13Ал да иштейт! Ошентип, биз биринчи колдонмобузду сервлеттерди колдонуп жаздык. Көрүнүп тургандай, баары анчалык деле кыйын эмес :) Үй тапшырмасы катары, мисалы, мурунку макаладагы унаалар менен иштөө функциясын тиркемеге кайтара аласыз. Ошол. унаалар үчүн өзүнчө сервлет жана jsp баракчаларын түзүп, биздин тиркемеге колдонуучунун унааларынын тизмесин көрсөтүүгө, ага жаңы унааларды кошууга, ошондой эле аларды түзөтүп жана жок кылууга үйрөтүңүз. PS Servlets жана JSP - бул абдан байыркы технологиялар жана Интернетте сиз көп учурда "бул таштанды кимге керек?" Жооп абдан жөнөкөй - бул, биринчи кезекте, аларды колдонуу менен жазылган codeдор көп болушу мүмкүн болгон реалдуу долбоорлордо иштей тургандарга керек. Ал эми анын кантип иштээрин түшүнбөстөн, "эски нерселерди" жаңы нерсеге айландыруу дагы эле ырахат :) JSP жана сервлеттер темасын кылдат изилдөө үчүн "Head First Servlets and JSP" китебин колдонсоңуз болот . Англисче гана). Бул көпчүлүк үчүн сапаттын кепилдиги боло турган атактуу "Head First Java" супер китеби сыяктуу эле авторлор тарабынан жазылган :) Бул макала окурмандар үчүн пайдалуу болду деп ишенем! Жаңы макалаларды көргүңүз келсе, сынакта авторду колдоп "Лайк" басууну унутпаңыз. Же андан да жакшысы - "Мага абдан жагат" :) Көңүл бурганыңыз үчүн рахмат, окууңузга ийгorк!
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION