JavaRush /Java blogi /Random-UZ /Java servletlaridan foydalanadigan birinchi ilovangiz

Java servletlaridan foydalanadigan birinchi ilovangiz

Guruhda nashr etilgan
Hammaga salom! Ushbu maqolada siz servletlarning asosiy veb-ishlab chiqish konsepsiyasi bilan tanishasiz va ular yordamida oddiy dastur yozish imkoniyatiga ega bo'lasiz. Java servletlaridan foydalanadigan birinchi ilovangiz - 1Keraksiz qadamlarning oldini olish uchun biz noldan boshlamaymiz va Hibernate haqidagi avvalgi maqolamdagi ilovamiz ustida ishlashni davom ettiramiz . Biroq, biz endigina servletlar bilan ishlay boshlaganimiz sababli, men dasturdan Auto sinfiga tegishli hamma narsani olib tashladim va faqat User sinfini va uning harakatlarini qoldirdim. Loyiha tuzilishi quyidagicha ko'rinishga ega bo'ladi: Java servletlaridan foydalanadigan birinchi ilovangiz - 2Shunday qilib, servletlar! Vikipediyada shunday deyilgan: "Servlet - bu Java interfeysi bo'lib, uni amalga oshirish server funksionalligini kengaytiradi. Servlet mijozlar bilan so'rov-javob tamoyili orqali o'zaro aloqada bo'ladi." Va haqiqatan ham shunday. Bu erda biz birinchi navbatda "mijoz-server dastur arxitekturasi" tushunchasiga duch kelamiz. Uning mohiyati juda oddiy va bitta rasmga mos keladi ( bu erdan olingan ).
Java Servletlaridan foydalangan birinchi ilovangiz - 3
Mijoz HTTP so'rovini yuborish orqali server bilan bog'lanadi. Server kerakli ma'lumotlarni yaratadi (masalan, ma'lumotlar bazasidan oladi) va uni mijozga qaytaradi. Eng oddiy misol: ma'lum bir ijtimoiy tarmoqda siz "Do'stlar" tugmasini bosasiz va shu bilan serverga so'rov yuborasiz. Server ma'lumotlar bazasidagi do'stlaringiz ro'yxatini tekshiradi va uni sizga (mijoz) qaytaradi. HTTP so'rovlarining ro'yxati juda katta, ammo agar siz ularni hech qachon uchratmagan bo'lsangiz, unda yaxshiroq tushunish uchun ular haqida o'qing, masalan, bu erda . Bizning vazifamiz: Servletlar yordamida CRUD ilovasini yaratish. Ilova HTTP so'rovlarini qayta ishlaydigan servlet yordamida ma'lumotlar bazasidan foydalanuvchilarni yaratish, o'zgartirish va o'chirish imkoniyatiga ega bo'lishi kerak. Hibernate haqidagi maqolamizdagi ilovamiz buni qanday qilishni allaqachon bilar edi, lekin u to'g'ridan-to'g'ri Java kodidan, aniqrog'i main() usulidan boshqariladi. Bu erda so'rovlar mijoz tomonidan yuboriladi, ya'ni siz :) Biz qilishimiz kerak bo'lgan birinchi narsa - pom.xml faylimizga yangi bog'liqliklar qo'shish.
<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>
Biz 3 ta bog'liqlikni qo'shdik:
  1. javax.servlet-api kutubxonasining o'zi;
  2. JSTL teglar kutubxonasi. Mijoz tomonini, ya'ni JSP sahifalarini yaratish uchun kerak bo'ladi;
  3. Spring-WebMVC. Bizga bitta Bahor darsi kerak bo'ladi, bu haqda biroz keyinroq gaplashamiz.
Servletlar ishi servlet konteyneri tomonidan boshqariladi. Bizning holatda biz Apache Tomcat-dan foydalanamiz. Juda mashhur narsa va siz bu haqda allaqachon eshitgansiz :) Servletning hayot aylanishi quyidagi bosqichlardan iborat:
  1. Agar konteynerda servlet bo'lmasa.
    • Servlet klassi konteyner tomonidan yuklanadi.
    • Konteyner servlet sinfining namunasini yaratadi.
    • Konteyner init() usulini chaqiradi. Bu usul servletni ishga tushiradi va servlet so'rovlarga xizmat ko'rsatishdan oldin birinchi chaqiriladi. init() usuli butun hayot aylanish jarayonida faqat bir marta chaqiriladi.
  2. Mijoz so'roviga xizmat ko'rsatish. Har bir so'rov o'zining alohida oqimida qayta ishlanadi. Konteyner har bir so'rov uchun service() usulini chaqiradi. Ushbu usul kiruvchi so'rovning turini aniqlaydi va uni so'rovni qayta ishlash uchun ushbu turga mos keladigan usulga taqsimlaydi. Servlet ishlab chiqaruvchisi ushbu usullar uchun ilovalarni taqdim etishi kerak. Agar usul amalga oshirilmagan so'rov qabul qilinsa, ota-klassning usuli chaqiriladi va odatda so'rovchiga xato qaytarilishi bilan tugaydi.
  3. Agar konteyner servletni o'chirishi kerak bo'lsa, u servletni xizmatdan olib tashlaydigan destroy() usulini chaqiradi. init() usuli singari, bu usul ham butun servlet sikli davomida bir marta chaqiriladi.
Bizning servletimiz juda oddiy ko'rinadi:
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");
    }
}
Ko'rib turganingizdek, u yuqorida tavsiflangan init() usulini o'z ichiga oladi va to'rtta HTTP so'roviga to'g'ri keladigan 4 usulni amalga oshiradi - doGet(), doPost(), doPut() va doDelete(). Ularning har biri bizga mos ravishda foydalanuvchilarni qabul qilish, yaratish, tahrirlash va o'chirish imkonini beradi. Usullar javax.servlet.http.HttpServletRequest va javax.servlet.http.HttpServletResponse sinflarining kirish ob'ektlari sifatida qabul qilinadi - ya'ni serverga yuborilgan so'rov va mijoz qabul qiladigan javob. Usullar ichida UserService sinfining kerakli usullari bajariladi, mijoz uchun javob hosil qilinadi va keyin /users manziliga yo'naltiriladi. Misol uchun, doGet() usulida biz barcha foydalanuvchilar ro'yxatini olamiz. Keyinchalik, biz RequestDispatcher sinfining ob'ektini yaratamiz, bu bizga Http so'roviga ob'ektlarni kiritish, shuningdek, uni ma'lum bir resursga (masalan, mijoz JSP sahifasiga) yo'naltirish imkonini beradi. DoPut() usulida (foydalanuvchi ma'lumotlarini yangilash) biz HTTP so'rovini qayta ishlaymiz, undan id, ism va yosh parametrlarini chiqaramiz, ko'rsatilgan identifikatorga ega foydalanuvchini topamiz, unga u bilan birga kelgan ism va yoshni belgilaymiz. so'rov yuboring va sahifaga / foydalanuvchilarga qayting. Biroq, bu usullarning barchasi to'g'ri ishlashi uchun biz servletni sozlashimiz kerak. Buning uchun biz WEB-INF jildidagi web.xml faylidan foydalanamiz.
<?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>
Ushbu fayldagi barcha teglar, qoida tariqasida, intuitivdir, ammo keling, ularni ketma-ket ko'rib chiqamiz. <welcome-file-list> - boshlang'ich JSP sahifasi ko'rsatilgan, u ilova ishga tushirilganda birinchi bo'lib ochiladi. Bizning holatda, bu index.jsp sahifasi. <servlet> - UserSimpleServlet sinfimizni servlet sifatida ro'yxatdan o'tkazish. <servlet-mapping> juda muhim teg. U servlet tomonidan qayta ishlanadigan URL manzillarini belgilaydi. Bizning holatlarimizda bularning barchasi URL manzillar, shuning uchun biz shunchaki "/" ni ko'rsatamiz. Ammo, masalan, agar bizda foydalanuvchilar va ularning mashinalari bilan dastur mavjud bo'lsa, biz ikkinchi servlet - SimpleAutoServletni yaratishimiz mumkin edi. Keyin foydalanuvchi servleti uchun xaritalash "/foydalanuvchilar" (ya'ni foydalanuvchilarni qayta ishlash bilan bog'liq so'rovlar) va avtomatik servlet uchun "/autos" bo'ladi. Va nihoyat, <filtr>. U org.springframework.web.filter.HiddenHttpMethodFilter sinfining ichki ob'ektini belgilaydi. Maqola Bahorga taalluqli emas, shuning uchun men bu haqda batafsil gapirmayman. Aytmoqchimanki, u bizning ilovamizga faqat qo'shimcha xususiyat sifatida biriktirilgan. Gap shundaki, biz mijoz tomonini yaratish uchun JSP sahifalaridan foydalanamiz. Bizning ma'lumotlarimiz sahifada foydalanuvchilar ro'yxati bilan jadval sifatida ko'rsatiladi. JSP sahifalarida HTML <form/> teglaridan foydalaniladi. <form/> dan ma'lumotlarni yuborish uchun faqat HTTP GET va POST so'rovlaridan foydalanish mumkin. Ya'ni, barcha uchta operatsiya uchun - yangilash, o'chirish va foydalanuvchi yaratish - biz faqat POST so'rovlaridan foydalanishimiz kerak edi. PUT va DELETE so‘rovlaridan foydalanish biz uchun mavjud emas. Va, qoida tariqasida, bu juda normal va amalga oshirish oson, ammo HiddenHttpMethodFilter klassi ulardan foydalanishga imkon beradi. Bu o'quvchiga ilovadagi amallar orasidagi farqlarni yanada aniqroq qiladi. Va nihoyat, mijoz tomoniga o'tamiz. U beshta JSP sahifasi bilan ifodalanadi. 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 sahifasi (Java Server sahifasi) ikki turdagi matnni o'z ichiga oladi: matn formatlaridan birida (HTML, SVG, WML yoki XML) bo'lishi mumkin bo'lgan statik manba ma'lumotlari va dinamik tarkibni yaratuvchi JSP elementlari. JSP nima ekanligini tushunish uchun men o'zimga bitta muallifning juda yaxshi maqolasidan nusxa ko'chirish va joylashtirishga ruxsat beraman ( bu yerdan ). "Aslida, JSP birinchi marta kirishda servletga aylantiriladi va servlet sifatida ishlaydi. Buni tushunish juda muhim. JSP HTML sahifasi kabi sahifa EMAS - bu yangi boshlanuvchi dasturchi uchun buni aniq tushunishi muhim. bu boshqa servlet - siz shunchaki uning chiqishini dasturlashingiz shart emas.Uni shunchaki chizishingiz mumkin.Va ma'lumotlarni kerakli joylarga almashtirishingiz mumkin.Lekin JSP sahifasi hech bo'lmaganda HTMLga o'xshab ketganligi sababli, bu dizayner uchun osonroq bo'lishi aniq. Va men yana bir bor yangi boshlanuvchilarga QAT'ATLI aytaman - JSP bu SERVLET .U serverdagi barcha ma'lumotlar bilan tayyorlanadi.Bu erda barcha ma'lumotlar kiritiladi.Va foydalanuvchi brauzerda tayyor HTML-sahifani oladi. JAVA belgilari bor." JSP sahifasi haqiqatan ham servlet ekanligini o'zingiz ko'rishingiz mumkin, chunki har bir sahifada bajarilishi kerak bo'lgan usul mavjud. Misol uchun, index.jsp boshlang'ich sahifasida "Ma'lumotlar bazasi bilan ishlashni boshlash" tugmachasini bosganingizda, method="get" bajariladi. Yangi foydalanuvchi yaratish uchun mas'ul bo'lgan addUser.jsp sahifasida saqlash tugmasini bosganingizda method="post" bajariladi. JSP-ning qolgan qismi oddiy statik HTML belgilaridan iborat, shuning uchun biz ularga batafsil to'xtalmaymiz - bu Internetda ko'p bo'lgan alohida maqolaning mavzusi. Shunday qilib, biz ilovamizni yaratdik, uni amalda sinab ko'rish qoladi! Buning uchun bizga yuqorida aytib o'tilgan Apache Tomcat servlet konteyneri kerak bo'ladi. Siz mushukni rasmiy veb-saytdan yuklab olishingiz mumkin (men 8-versiyadan foydalanaman). Keyinchalik, Tomcat orqali ilovamizni ishga tushirish uchun IDEA-da konfiguratsiya yaratishimiz kerak. Buning uchun "Konfiguratsiyalarni tahrirlash" yorlig'ini oching, Java Servletlaridan foydalangan birinchi ilovangiz - 4yangi konfiguratsiya yarating Java Servletlaridan foydalanadigan birinchi dasturingiz - 5va Tomcat Server Local-ni tanlang. Ilova serveri yorlig'ida Tomcat joylashgan papkaga yo'lni belgilang.Keyingi Java Servletlaridan foydalangan birinchi dasturingiz - 6, Joylashtirish yorlig'iga o'ting. Ваше первое приложение с использованием Java-сервлетов - 7Bu erda biz dasturimizni mahalliy serverda joylashtirishni sozlaymiz. "+" tugmasini bosing, "Artifakt" -ni tanlang -> Loyiha nomi: urush (biz dasturni urush fayliga yig'amiz). Ваше первое приложение с использованием Java-сервлетов - 8Bu, asosan, shunday! "Server" sahifasida xuddi shu dastur "http://localhost:8080/" da ishlashini ko'rishingiz mumkin. Ushbu konfiguratsiyani saqlang va uni biror narsa deb nomlang (mening konfiguratsiya nomim "Tommy"). Keyinchalik, IDEA-dagi Maven yorlig'ida (o'ng tomonda) biz loyihamizni urush fayliga yaratish uchun urush plaginidan foydalanamiz (Plugins -> war -> war: war). Ваше первое приложение с использованием Java-сервлетов - 9Ваше первое приложение с использованием Java-сервлетов - 10Muvaffaqiyat! Boshlanish sahifasi ishga tushdi. Endi "Ma'lumotlar bazasi bilan ishlashni boshlash" tugmasini bosing. JSP sahifamiz index.jsp server tomonidan qayta ishlanadigan GET so'rovini yaratadi. Server javob hosil qiladi va uni barcha mavjud foydalanuvchilar ro'yxati ko'rinishida bizga qaytaradi (agar ular ma'lumotlar bazasida bo'lsa). Va mana ular! Ваше первое приложение с использованием Java-сервлетов - 12Keling, foydalanuvchilardan birini o'chirishga harakat qilaylik: Ваше первое приложение с использованием Java-сервлетов - 13u ham ishlaydi! Shunday qilib, biz birinchi dasturimizni servletlar yordamida yozdik. Ko'rib turganingizdek, hamma narsa unchalik qiyin emas edi :) Uy vazifasi sifatida siz, masalan, oldingi maqoladagi avtomobillar bilan ishlash funksiyasini ilovaga qaytarishingiz mumkin. Bular. avtomashinalar uchun alohida servlet va jsp sahifalarini yarating va ilovamizga foydalanuvchi avtomobillari roʻyxatini koʻrsatish, unga yangi mashinalar qoʻshish, shuningdek ularni tahrirlash va oʻchirishni oʻrgating. PS Servlets va JSP - bu juda qadimiy texnologiyalar va Internetda siz ko'pincha "bu axlat kimga kerak?" ruhidagi sharhlarni topishingiz mumkin. Javob juda oddiy - bu birinchi navbatda haqiqiy loyihalarda ishlaydiganlarga kerak bo'ladi, bunda ular yordamida juda ko'p kod yozilishi mumkin. Va "eski narsalarni" qanday ishlashini tushunmasdan, yangi narsaga aylantirish - baribir zavq :) JSP va servletlar mavzusini chuqurroq o'rganish uchun siz "Head First Servlets and JSP" kitobidan foydalanishingiz mumkin . faqat inglizcha). Bu ko'pchilik uchun sifat kafolati bo'lishi mumkin bo'lgan mashhur "Head First Java" super-kitobi bilan bir xil mualliflar tomonidan yozilgan :) Umid qilamanki, ushbu maqola o'quvchilar uchun foydali bo'ldi! Yangi maqolalarni ko'rishni istasangiz, muallifni tanlovda "Like" bosib qo'llab-quvvatlashni unutmang. Yoki yaxshiroq - "Menga juda yoqadi" :) E'tiboringiz uchun rahmat, o'qishlaringizga omad!
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION