Hamıya salam! Bu yazıda siz servletlərin əsas veb inkişaf konsepsiyası ilə tanış olacaqsınız və onlardan istifadə edərək sadə proqram yaza biləcəksiniz. Lazımsız addımların qarşısını almaq üçün biz sıfırdan başlamayacağıq və Hibernate haqqında əvvəlki məqaləmdən tətbiqimiz üzərində işləməyə davam edəcəyik . Bununla belə, biz servletlərlə yenicə başladığımız üçün mən Auto sinfi ilə bağlı hər şeyi tətbiqdən sildim və yalnız İstifadəçi sinfini və onun hərəkətlərini tərk etdim. Layihə strukturu belə görünəcək: Beləliklə, servletlər! Vikipediyada deyilir: "Servlet tətbiqi serverin funksionallığını genişləndirən Java interfeysidir. Servlet sorğu-cavab prinsipi vasitəsilə müştərilərlə qarşılıqlı əlaqədə olur." Və həqiqətən də belədir. Burada ilk olaraq “klient-server tətbiqi arxitekturası” anlayışı ilə qarşılaşırıq. Onun mahiyyəti olduqca sadədir və bir şəkilə uyğundur ( burdan götürülmüşdür ).
Müştəri HTTP sorğusu göndərməklə serverlə əlaqə saxlayır. Server lazımi məlumatları yaradır (məsələn, verilənlər bazasından alır) və müştəriyə qaytarır. Ən sadə misal: müəyyən sosial şəbəkədə siz “Dostlar” düyməsini sıxırsınız və bununla da serverə sorğu göndərirsiniz. Server verilənlər bazasındakı dostlarınızın siyahısını yoxlayır və onu sizə (müştəri) qaytarır. HTTP sorğularının siyahısı olduqca böyükdür, lakin onlarla heç vaxt qarşılaşmamısınızsa, daha yaxşı başa düşmək üçün onlar haqqında oxumaq daha yaxşıdır, məsələn, burada . Bizim vəzifəmiz: Servletlərdən istifadə edərək CRUD proqramı yaradın. Tətbiq HTTP sorğularını emal edən servletdən istifadə edərək verilənlər bazasından istifadəçiləri yarada, dəyişdirə və silə bilməlidir. Hibernate haqqında məqalədəki tətbiqimiz artıq bunu necə edəcəyini bilirdi, lakin o, birbaşa Java kodundan, daha dəqiq desək, main() metodundan idarə olunurdu. Burada sorğular müştəri, yəni siz tərəfindən göndəriləcək :) Bizim etməli olduğumuz ilk şey pom.xml faylımıza yeni asılılıqlar əlavə etməkdir.
<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 asılılıq əlavə etdik:
- javax.servlet-api kitabxanasının özü;
- JSTL etiket kitabxanası. Müştəri tərəfini, yəni JSP səhifələrini yaratmaq üçün lazım olacaq;
- Spring-WebMVC. Bir az sonra danışacağımız bir Bahar dərsinə ehtiyacımız olacaq.
- Konteynerdə servlet yoxdursa.
- Servlet sinfi konteyner tərəfindən yüklənir.
- Konteyner servlet sinfinin nümunəsini yaradır.
- Konteyner init() metodunu çağırır. Bu üsul servleti işə salır və servlet sorğulara xidmət etməzdən əvvəl ilk olaraq çağırılır. init() metodu bütün həyat dövrü ərzində yalnız bir dəfə çağırılır.
- Müştəri sorğusuna xidmət. Hər bir sorğu öz ayrı-ayrılıqda işlənir. Konteyner hər sorğu üçün service() metodunu çağırır. Bu üsul daxil olan sorğunun növünü müəyyən edir və sorğunun işlənməsi üçün bu tipə uyğun olan metoda paylayır. Servlet tərtibatçısı bu metodlar üçün tətbiqləri təmin etməlidir. Metodun həyata keçirilmədiyi sorğu alınarsa, ana sinfin metodu çağırılır və adətən xətanın sorğuçuya qaytarılması ilə başa çatır.
- Konteyner servleti silməli olarsa, o, servleti xidmətdən çıxaran destroy() metodunu çağırır. init() metodu kimi, bu metod da bütün servlet dövrü ərzində bir dəfə çağırılır.
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");
}
}
Gördüyünüz kimi, o, yuxarıda təsvir edilmiş init() metodunu ehtiva edir və dörd HTTP sorğusu ilə üst-üstə düşən 4 metodu tətbiq edir - doGet(), doPost(), doPut() və doDelete(). Onların hər biri bizə müvafiq olaraq istifadəçiləri qəbul etmək, yaratmaq, redaktə etmək və silmək imkanı verəcək. Metodlar javax.servlet.http.HttpServletRequest və javax.servlet.http.HttpServletResponse siniflərinin giriş obyektləri kimi qəbul edilir - yəni serverə göndərilən sorğu və müştərinin aldığı cavab. Metodların içərisində UserService sinifinin lazımi metodları yerinə yetirilir, müştəri üçün cavab yaradılır və sonra /users ünvanına yönləndirilir. Məsələn, doGet() metodunda biz bütün istifadəçilərin siyahısını alırıq. Sonra, biz Http sorğusuna obyektləri daxil etməyə, həmçinin onu xüsusi resursa (məsələn, müştəri JSP səhifəsinə) yönləndirməyə imkan verən RequestDispatcher sinifinin obyektini yaradırıq. DoPut() metodunda (istifadəçi məlumatlarının yenilənməsi) biz HTTP sorğusunu emal edirik, ondan id, ad və yaş parametrlərini çıxarırıq, göstərilən id ilə istifadəçini tapırıq, ona onunla birlikdə gələn adı və yaşı təyin edirik. tələb edin və səhifəyə / istifadəçilərə qayıdın. Lakin bütün bu üsulların düzgün işləməsi üçün servleti konfiqurasiya etməliyik. Bunun üçün biz WEB-INF qovluğunda olan web.xml faylından istifadə edirik.
<?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>
Bu fayldakı bütün etiketlər, prinsipcə, intuitivdir, lakin gəlin onları ardıcıllıqla nəzərdən keçirək. <welcome-file-list> - proqram işə salındıqda ilk olaraq açılacaq başlanğıc JSP səhifəsi müəyyən edilir. Bizim vəziyyətimizdə bu, index.jsp səhifəsidir. <servlet> - UserSimpleServlet sinfimizi servlet kimi qeydiyyatdan keçiririk. <servlet-mapping> çox vacib teqdir. Servlet tərəfindən işlənəcək URL-ləri müəyyən edir. Bizim vəziyyətimizdə bunlar hamısı URL-lərdir, ona görə də biz sadəcə olaraq “/” işarəsini göstəririk. Lakin, məsələn, istifadəçilər və onların maşınları ilə bir proqramımız olsaydı, o zaman ikinci bir servlet yarada bilərdik - SimpleAutoServlet. Sonra istifadəçi servleti üçün xəritəçəkmə “/users” (yəni istifadəçilərin işlənməsi ilə bağlı sorğular), avtomatik servlet üçün isə “/autos” olacaqdır. Və nəhayət, <filtr>. O, daxili olaraq org.springframework.web.filter.HiddenHttpMethodFilter sinfinin obyektini müəyyən edir. Məqalə Bahara aid deyil, ona görə də bu barədə ətraflı danışmayacağam. Sadəcə onu deyim ki, o, bizim tətbiqimizə yalnız əlavə xüsusiyyət kimi əlavə olunub. Məsələ ondadır ki, biz müştəri tərəfini yaratmaq üçün JSP səhifələrindən istifadə edəcəyik. Məlumatlarımız səhifədə istifadəçilərin siyahısı ilə cədvəl şəklində göstəriləcək. JSP səhifələrində HTML <form/> teqləri istifadə olunacaq. Və yalnız HTTP GET və POST sorğuları <form/>-dan məlumat göndərmək üçün istifadə edilə bilər. Yəni, hər üç əməliyyat üçün - yeniləmə, silmə və istifadəçi yaratmaq - yalnız POST sorğularından istifadə etməli olardıq. PUT və DELETE sorğularından istifadə bizim üçün əlçatan olmayacaq. Və prinsipcə, bu olduqca normaldır və həyata keçirilməsi asandır, lakin HiddenHttpMethodFilter sinfi onlardan istifadə etməyə imkan verir. Bu, tətbiqdəki əməliyyatlar arasındakı fərqləri oxucuya daha aydın göstərəcək. Nəhayət, müştəri tərəfinə keçək. Beş JSP səhifəsi ilə təmsil olunur. 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>
silUser.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 səhifəsi (Java Server Səhifəsi) iki növ mətndən ibarətdir: mətn formatlarından birində (HTML, SVG, WML və ya XML) ola bilən statik mənbə məlumatları və dinamik məzmunu yaradan JSP elementləri. JSP-nin nə olduğunu başa düşmək üçün özümə bir müəllifin çox yaxşı məqaləsini kopyalayıb yapışdırmağa icazə verəcəyəm ( buradan ). "Əsasən, JSP ilk dəfə daxil olanda servletə çevrilir və servlet kimi işləyir. Bunu başa düşmək çox vacibdir. JSP HTML səhifəsi kimi bir səhifə DEYİL - təcrübəsiz bir proqramçının aydın şəkildə başa düşməsi vacibdir ki, bu başqa bir servletdir - sadəcə onun çıxışını proqramlaşdırmağa ehtiyac yoxdur.Onu sadəcə çəkə bilərsiniz.Və verilənləri lazımi yerlərdə əvəz edə bilərsiniz.Lakin JSP səhifəsi heç olmasa bir şəkildə HTML-yə bənzədiyindən dizayner üçün aydın olacaq. Və mən bir daha yeni başlayanlara qəti şəkildə deyirəm - JSP bir SERVLETdir.O , serverdəki bütün verilənlərlə hazırlanır.Bura bütün məlumatlar daxil edilir.İstifadəçi isə brauzerdə hazır HTML səhifəsini alır ki,bu da bunu etmir. JAVA əlamətləri var." JSP səhifəsinin həqiqətən də servlet olduğunu özünüz görə bilərsiniz, çünki hər bir səhifə icra edilməli olan metodu ehtiva edir. Məsələn, index.jsp başlanğıc səhifəsində qeyd olunur ki, siz “Verilənlər bazası ilə işə başla” düyməsini kliklədiyiniz zaman method="get" yerinə yetiriləcək. Yeni istifadəçinin yaradılmasına cavabdeh olan addUser.jsp səhifəsində saxla düyməsini sıxdığınız zaman method="post" yerinə yetiriləcək. JSP-nin qalan hissəsi adi statik HTML işarələrindən ibarətdir, buna görə də biz onlara ətraflı toxunmayacağıq - bu, İnternetdə çox olan ayrı bir məqalənin mövzusudur. Beləliklə, tətbiqimizi yaratdıq, qalan şey onu hərəkətdə sınamaqdır! Bunun üçün yuxarıda qeyd olunan Apache Tomcat servlet konteynerinə ehtiyacımız olacaq. Siz pişiyi rəsmi internet saytından yükləyə bilərsiniz (mən versiya 8-dən istifadə edirəm). Sonra, Tomcat vasitəsilə tətbiqimizi işə salmaq üçün IDEA-da konfiqurasiya yaratmalıyıq. Bunu etmək üçün "Konfiqurasiyaları redaktə et" sekmesini açın, yeni konfiqurasiya yaradın və Tomcat Server Local seçin. Tətbiq Serveri sekmesinde Tomcat-ın yerləşdiyi qovluğa gedən yolu göstərin.Daha sonra Yerləşdirmə tabına keçin. Burada tətbiqimizin yerli serverdə yerləşdirilməsini konfiqurasiya edirik. "+" düyməsinə klikləyin, "Artifakt" seçin -> Layihənizin adı: müharibə (biz tətbiqi müharibə faylına yığacağıq). Əsasən budur! "Server" səhifəsində eyni proqramın "http://localhost:8080/" ünvanında işləyəcəyini görə bilərsiniz. Bu konfiqurasiyanı yadda saxlayın və ona nəsə ad verin (mənim konfiqurasiya adım “Tommy”dir). Sonra IDEA-dakı Maven sekmesinde (sağ tərəfdə) layihəmizi müharibə faylına çevirmək üçün war plaginindən istifadə edəcəyik (Plugins -> war -> war:war). Uğurlar! Başlanğıc səhifəsi fəaliyyətə başlayıb. İndi "Verilənlər bazası ilə işə başla" düyməsini basın. JSP səhifəmiz index.jsp server tərəfindən emal ediləcək GET sorğusu yaradacaq. Server cavab yaradacaq və onu bütün mövcud istifadəçilərin siyahısı şəklində bizə qaytaracaq (əlbəttə ki, onlar verilənlər bazasındadırsa). Və buradadırlar! İstifadəçilərdən birini silməyə çalışaq: O da işləyir! Beləliklə, servletlərdən istifadə edərək ilk tətbiqimizi yazdıq. Gördüyünüz kimi, hər şey o qədər də çətin olmadığı ortaya çıxdı :) Ev tapşırığı olaraq, məsələn, əvvəlki məqalədən avtomobillərlə işləmə funksiyasını tətbiqə qaytara bilərsiniz. Bunlar. avtomobillər üçün ayrıca servlet və jsp səhifələri yaradın və tətbiqimizə istifadəçinin avtomobillərinin siyahısını göstərməyi, ona yeni avtomobillər əlavə etməyi, həmçinin onları redaktə etməyi və silməyi öyrədin. PS Servlets və JSP olduqca qədim texnologiyalardır və İnternetdə tez-tez "bu zibil kimə lazımdır?" ruhunda şərhlər tapa bilərsiniz. Cavab olduqca sadədir - bu, ilk növbədə real layihələrdə işləyəcək şəxslərə lazımdır ki, onlardan istifadə edərək çoxlu kod yazılması mümkündür. Və necə işlədiyini başa düşmədən "köhnə əşyaları" yeni bir şeyə çevirmək hələ də xoşdur :) JSP və servletlər mövzusunu daha ətraflı öyrənmək üçün "Head First Servlets və JSP" kitabından istifadə edə bilərsiniz . Yalnız ingiliscə). Çoxları üçün keyfiyyətin qarantiyası ola bilən məşhur "Head First Java" super kitabı ilə eyni müəlliflər tərəfindən yazılmışdır :) Ümid edirəm ki, bu məqalə oxucular üçün faydalı oldu! Yeni məqalələr görmək istəyirsinizsə, müsabiqədə müəllifə "Bəyən" edərək dəstək olmağı unutmayın. Və ya daha yaxşısı - “Çox xoşuma gəlir” :) Diqqətinizə görə təşəkkür edirik, dərslərinizdə uğurlar!
GO TO FULL VERSION