JavaRush /Java блогы /Random-KK /Java сервлеттерін пайдаланатын бірінші қолданбаңыз

Java сервлеттерін пайдаланатын бірінші қолданбаңыз

Топта жарияланған
Бәріңе сәлем! Бұл мақалада сіз сервлеттердің веб-әзірлеудің негізгі тұжырымдамасымен танысасыз және олардың көмегімен қарапайым қосымшаны жаза аласыз. Java сервлеттерін пайдаланатын бірінші қолданбаңыз - 1Қажетсіз қадамдарды болдырмау үшін біз нөлден бастамаймыз және күту күйі туралы алдыңғы мақаламдағы қолданбамызбен жұмыс істеуді жалғастырамыз . Дегенмен, біз сервлеттермен енді ғана жұмыс істей бастағандықтан, мен қолданбадан Auto класына қатысты барлық нәрсені алып тастадым және тек Пайдаланушы сыныбы мен оның әрекеттерін қалдырдым. Жоба құрылымы келесідей болады: Java сервлеттерін пайдаланатын бірінші қолданбаңыз - 2Сонымен, сервлеттер! Wikipedia былай дейді: "Сервлет Java интерфейсі болып табылады, оның орындалуы serverдің функционалдығын кеңейтеді. Сервлет сұраныс-жауап принципі арқылы клиенттермен әрекеттеседі." Және шынымен де солай. Бұл жерде біз ең алдымен «клиент-server қолданбалы архитектурасы» түсінігін кездестіреміз. Оның мәні өте қарапайым және бір суретке сәйкес келеді ( осы жерден алынған ).
Java сервлеттерін пайдаланатын алғашқы қолданбаңыз - 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. Контейнер сервлетті жою қажет болған жағдайда, ол сервлетті қызметтен алып тастайтын 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 сыныптарының кіріс нысандары ретінде, яғни serverге жіберілген сұрауды және клиент алатын жауапты қабылдайды. Әдістердің ішінде UserService класының қажетті әдістері орындалады, клиент үшін жауап жасалады, содан кейін /users мекенжайына қайта бағытталады. Мысалы, doGet() әдісінде біз барлық пайдаланушылардың тізімін аламыз. Әрі қарай, Http сұрауына нысандарды қосуға, сондай-ақ оны белгілі бір ресурсқа (мысалы, клиенттің 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 беті. <сервлет> - UserSimpleServlet сыныбын сервлет ретінде тіркеу. <servlet-mapping> - өте маңызды тег. Ол сервлет өңдейтін URL мекенжайларын анықтайды. Біздің жағдайда бұл барлық URL мекенжайлары, сондықтан біз жай ғана «/» көрсетеміз. Бірақ, мысалы, егер бізде пайдаланушылар мен олардың машиналары бар қолданба болса, біз екінші сервлетті жасай аламыз - SimpleAutoServlet. Содан кейін пайдаланушы сервлеті үшін салыстыру «/пайдаланушылар» (яғни өңдеу пайдаланушыларына қатысты сұраулар), ал автосервлет үшін «/autos» болады. Соңында, <сүзгі>. Ол org.springframework.web.filter.HiddenHttpMethodFilter класының нысанын ішкі анықтайды. Мақала Көктемге қатысты емес, сондықтан мен бұл туралы егжей-тегжейлі айтпаймын. Ол біздің қосымшамызға қосымша мүмкіндік ретінде ғана тіркелгенін айтайын. Мәселе мынада, біз клиенттік жағын жасау үшін JSP беттерін қолданамыз. Біздің деректер бетте пайдаланушылар тізімі бар кесте түрінде көрсетіледі. JSP беттерінің ішінде HTML <form/> тегтері пайдаланылады. Және деректерді <form/> жіберу үшін тек HTTP GET және POST сұрауларын пайдалануға болады. Яғни, барлық үш операция үшін - жаңарту, жою және пайдаланушыны құру - бізге тек POST сұрауларын пайдалану керек еді. PUT және DELETE сұрауларын пайдалану бізге қолжетімді болмайды. Және, негізінен, бұл қалыпты және жүзеге асыру оңай, бірақ 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 беті) мәтіннің екі түрін қамтиды: мәтін пішімдерінің (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 нұсқасын қолданамын). Әрі қарай, Tomcat арқылы қолданбаны іске қосу үшін IDEA конфигурациясын жасауымыз керек. Мұны істеу үшін «Конфигурацияларды өңдеу» қойындысын ашыңыз, Java сервлеттерін пайдаланатын алғашқы қолданбаңыз - 4жаңа конфигурация жасаңыз Java Servlets пайдаланатын бірінші қолданбаңыз - 5және Tomcat Server Local таңдаңыз. Қолданбалар serverі қойындысында Tomcat орналасқан қалтаға жолды көрсетіңіз.Одан Java сервлеттерін пайдаланатын алғашқы қолданбаңыз - 6кейін Орналастыру қойындысына өтіңіз. Ваше первое приложение с использованием Java-сервлетов - 7Мұнда біз жергілікті serverде қолданбаны орналастыруды конфигурациялаймыз. «+» түймесін басыңыз, «Артефакт» таңдаңыз -> Жоба аты: соғыс (біз қолданбаны соғыс файлына жинаймыз). Ваше первое приложение с использованием Java-сервлетов - 8Негізінен солай! «Сервер» бетінде дәл сол қолданбаның «http://localhost:8080/» мекенжайында жұмыс істейтінін көруге болады. Осы конфигурацияны сақтаңыз және оны бір нәрсе деп атаңыз (менің конфигурация атым – «Томми»). Әрі қарай, IDEA ішіндегі Maven қойындысында (оң жақта) жобамызды соғыс файлына құру үшін соғыс плагинін қолданамыз (Плагиндер -> соғыс -> соғыс: соғыс). Ваше первое приложение с использованием Java-сервлетов - 9Ваше первое приложение с использованием Java-сервлетов - 10Жетістік! Бастапқы бет іске қосылды. Енді «Дерекқормен жұмысты бастау» түймесін басыңыз. Біздің JSP бет index.jsp server өңдейтін GET сұрауын жасайды. Сервер жауапты жасайды және оны бізге барлық бар пайдаланушылардың тізімі түрінде қайтарады (егер олар, әрине, дерекқорда болса). Міне, олар! Ваше первое приложение с использованием Java-сервлетов - 12Пайдаланушылардың бірін жоюға тырысайық: Ваше первое приложение с использованием Java-сервлетов - 13Ол да жұмыс істейді! Сонымен, біз бірінші қосымшамызды сервлеттерді пайдаланып жаздық. Көріп отырғаныңыздай, бәрі соншалықты қиын емес :) Үй тапсырмасы ретінде сіз, мысалы, алдыңғы мақаладағы автокөліктермен жұмыс істеу функционалдығын қолданбаға қайтара аласыз. Анау. автокөліктерге арналған жеке сервлет пен jsp беттерін жасаңыз және біздің қолданбаға пайдаланушының көліктерінің тізімін көрсетуге, оған жаңа көліктер қосуға, сондай-ақ оларды өңдеуге және жоюға үйретіңіз. PS Servlets және JSP - бұл өте көне технологиялар және Интернетте сіз «бұл қоқыс кімге керек?» Рухындағы пікірлерді жиі таба аласыз. Жауап өте қарапайым - бұл, ең алдымен, нақты жобалармен жұмыс істейтіндерге қажет, олардың көмегімен көптеген codeтар жазылуы мүмкін. «Ескі заттарды» оның қалай жұмыс істейтінін түсінбей, жаңа нәрсеге айналдыру - бәрібір ғанибет :) JSP және сервлеттер тақырыбын тереңірек зерттеу үшін сіз «Бірінші сервлеттер және JSP» кітабын пайдалана аласыз . Тек ағылшын тілі). Оны көптеген адамдар үшін сапаның кепілі бола алатын әйгілі «Бас Бірінші Java» суперкітапымен бірдей авторлар жазған :) Бұл мақала оқырмандар үшін пайдалы болды деп үміттенемін! Жаңа мақалалар көргіңіз келсе, авторға «Лайк» басып, байқауда қолдау көрсетуді ұмытпаңыз. Немесе жақсырақ – «Маған бұл өте ұнайды» :) Назарларыңызға рахмет, оқуларыңызға сәттілік!
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION