JavaRush /Java блогы /Random-KK /5-бөлім. Сервлеттер, Java сервлет API. Қарапайым веб-қосы...

5-бөлім. Сервлеттер, Java сервлет API. Қарапайым веб-қосымшаны жазу

Топта жарияланған
Бұл материал «Кәсіпорынның дамуына кіріспе» сериясының бөлігі болып табылады. Алдыңғы мақалалар: 5-бөлім. Сервлеттер, Java сервлет API.  Қарапайым веб-қосымшаны жазу - 1Сіз консольге мәтін шығаратын Java қолданбаларын қалай жазу керектігін білесіз бе, бірақ сіз әлі де бірінші веб-қосымшаны қалай жасау керектігін білмейсіз бе? Керемет, өзіңізді жайлы етіңіз. Бұл мақалада біз сервлеттермен танысамыз және достарыңызға жарник жібермей немесе оларды Java жүктеуге мәжбүрлемей көрсете алатын қосымша жазамыз. Веб қосымшасын жазайық . Егер сіз веб-бағдарламалауда қолданылатын тәсілдермен әлі таныс болмасаңыз, мен сізге « Кәсіпорынның дамуына кіріспе » сериясының бірінші мақаласынан оқуды бастауға кеңес беремін .

Сервлет дегеніміз не

Алдымен сервлет деген не екенін және ол туралы неге жиі еститінін анықтап алайық. Java Servlet API serverде іске асыруға және сұраныс-жауап схемасын пайдаланып клиентпен жұмыс істеуге арналған стандартталған API болып табылады. Сервлет - бұл клиенттен сұрауларды қабылдай алатын және оған жауаптарды қайтаратын класс. Иә, Java-дағы сервлеттер клиент-server архитектурасы құрастырылған элементтер болып табылады. Естеріңізде болса, біз бұл туралы сериядағы мақалалардың бірінде айтқан болатынбыз. Бұтаның айналасында ұрып-соғуға болмайды: бірден codeты жазайық.

Веб-қосымшаны жасау үшін не қажет

Java serverіндегі сервлеттермен ыңғайлы жұмыс істеу үшін сізге Intellij IDEA Ultimate Edition қажет болады. Бұл ақылы, бірақ сіз 30 күндік сынақ мерзімін белсендіре аласыз немесе ерте қол жеткізу нұсқасын пайдалана аласыз - ол әрқашан тегін. Сондай-ақ біздің қолданба serverімізді орнатыңыз - Apache Tomcat. Tomcat - бұл сервлет контейнері: ол сырттан келіп түсетін сұрауларды өңдейтін және оларды біздің қолданбаға жіберетін. Tomcat қолданбасын мына сілтемеден жүктеп алуға болады .

Бірінші веб-қосымшаны құру

Егер бәрі дайын болса, Maven жобасын жасайық. Егер сіз Maven-пен таныс болмасаңыз, алдыңғы мақалаға назар аударыңыз . Бастайық!
  1. pom.xml ішінде javax.servlet-api тәуелділігін қосыңыз және бума соғысын орнатыңыз:

    <?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>org.example</groupId>
       <artifactId>servlets</artifactId>
       <version>1.0-SNAPSHOT</version>
       <packaging>war</packaging>
    
       <dependencies>
           <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>javax.servlet-api</artifactId>
               <version>4.0.1</version>
           </dependency>
       </dependencies>
    </project>

    Қарапайым сервлет класы:

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    @WebServlet("/hello")
    public class MainServlet extends HttpServlet {
    
       @Override
       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           resp.setContentType("text/html");
           PrintWriter printWriter = resp.getWriter();
           printWriter.write("Hello!");
           printWriter.close();
       }
    }
  2. Қолданбаны іске қосу үшін Tomcat конфигурациясын жасау керек:

    5-бөлім. Сервлеттер, Java сервлет API.  Қарапайым веб-қосымшаны жазу - 2 5-бөлім. Сервлеттер, Java сервлет API.  Қарапайым веб-қосымшаны жазу - 3

  3. Содан кейін біз Tomcat-тың қай нұсқасын қолданатынымызды, serverге кіруге болатын URL мекенжайын және портты көрсетеміз. Сіз келесідей нәрсені алуыңыз керек:

    5-бөлім. Сервлеттер, Java сервлет API.  Қарапайым веб-қосымшаны жазу - 4
  4. Контейнерде орналастырылатын артефактты (жинақталған жобаны банка мұрағатына) көрсету ғана қалады. Түзету түймесін басып , соғыс жарылды параметрін таңдауға болады : бұл жоба қайта құрылғаннан кейін артефакт автоматты түрде сервлет контейнеріне орналастырылатынын білдіреді. 5-бөлім. Сервлеттер, Java сервлет API.  Қарапайым веб-қосымшаны жазу – 5

  5. Қолданба мәтінмәні әдепкі бойынша servlets_war_exploded мәніне орнатылған , бұл қолданбаға мына мекенжайда кіру керек екенін білдіреді: http://localhost:8080/servlets_war_exploded .

    Неліктен бізге қосымша мәтін қажет? Керек емес заттарды алып тастаймыз. Енді біздің қолданба мекенжайымыз: http://localhost:8080 .

    5-бөлім. Сервлеттер, Java сервлет API.  Қарапайым веб-қосымшаны жазу – 6

  6. OK түймесін басыңыз. Енді бізде қосымшаны іске қосу мүмкіндігі бар екенін көреміз:

    5-бөлім. Сервлеттер, Java сервлет API.  Қарапайым веб-қосымшаны жазу – 7

    Енді қолданбаны іске қосқан кезде браузер 404 қатесін ашып, көрсетуі керек. Бұл қисынды, себебі http://localhost:8080/ мекенжайында «/» салыстыруымен сервлет болуы керек, ал біздің жалғыз сервлетімізде «/hello» салыстыруы бар .

  7. Біз онымен http://localhost:8080/hello мекенжайы бойынша хабарласамыз және күтілетін жауапты аламыз – «Сәлеметсіз бе» жолын!

Егер бәрі жұмыс істесе, codeты қарастырайық. Кәдімгі сыныптан http сервлетін жасау үшін оны HttpServlet сыныбынан мұраға алу керек. Сыныптың үстінде @WebServlet() annotationсын көрсетеміз, онда сервлетті белгілі бір жолға («/сәлем») байланыстырамыз (карталаймыз). Бұл annotation тек Java Servlet API 3.0 нұсқасында пайда болды, сондықтан Интернетте сервлет салыстыру XML файлы арқылы орындалатын көптеген мысалдар бар. Енді бұл қажет емес. GET сұрауларын өңдеу үшін doGet() әдісін қайта анықтаймыз. Әдіс аргументтеріне назар аударыңыз - HttpServletRequest және HttpServletResponse. HttpServletRequest нысанынан біз сұрау туралы барлық қажетті ақпаратты ала аламыз, HttpServletResponse ішінде біз өз жауабымызды жазып, қажетті тақырыптарды орната аламыз.

Параметрлермен және сеанспен жұмыс

Сервлет сұрау параметрлерін өңдей алатындай және сеанспен жұмыс істей алатындай етіп жетілдірейік:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/hello")
public class MainServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       HttpSession session = req.getSession();
       Integer visitCounter = (Integer) session.getAttribute("visitCounter");
       if (visitCounter == null) {
           visitCounter = 1;
       } else {
           visitCounter++;
       }
       session.setAttribute("visitCounter", visitCounter);
       String username = req.getParameter("username");
       resp.setContentType("text/html");
       PrintWriter printWriter = resp.getWriter();
       if (username == null) {
           printWriter.write("Hello, Anonymous" + "<br>");
       } else {
           printWriter.write("Hello, " + username + "<br>");
       }
       printWriter.write("Page was visited " + visitCounter + " times.");
       printWriter.close();
   }
}
Сервлет қазір сеансты іске қосуда, бетке кірген сайын visitCounter санын көбейтеді. Егер visitCounter төлсипаты әлі жасалмаған болса (бетке бірінші рет кіргенде), getAttribute() әдісі нөлді қайтарады, сондықтан нөлді тексеру керек. Бұл сұрау параметрлеріне де қатысты. Егер пайдаланушы пайдаланушы аты параметрін өткізбесе, оның мәні бос болады. Бұл жағдайда біз пайдаланушымен анонимді түрде амандасамыз. GET сұрауында параметрді беру үшін жол айнымалылары пайдаланылады, яғни http://localhost:8080/hello?username=Pavel сілтемесіне кіру керек . http сұраулары туралы толығырақ серияның алдыңғы мақаласынан оқи аласыз . Енді біздің қолданбада минималды логика бар, бірақ түбірлік жолдағы 404 қатесі аздап тітіркендіреді. Оны түзету үшін басқа сервлет жасап, оны @WebServlet("/") бастапқы бетіне салыстырайық. Бұл сервлеттің жұмысы сұрауларды «/hello» жолына қайта бағыттау болып табылады. Мұны істеудің екі жолы бар: алға немесе қайта бағыттауды пайдалану. Мүмкін, олардың арасындағы айырмашылық неде екенін түсіну керек. алға жіберу – делегаттар serverдегі басқа сервлетке сұранысты өңдеуге, клиент қатыспайды. Ол үшін жаңа сервлеттің doGet() әдісіне келесі codeты қосу керек:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
Бұл codeта біз сервлет контекстіне қол жеткіземіз, одан қалаған сервлеттің сұрау менеджерін аламыз және көрсетілген параметрлермен (req, resp) белгілі бір сұрауды өңдеуді сұраймыз. қайта бағыттау – клиентке оның сұранысын өңдеу үшін хабарласу керек мекен-жайды қайтарады. Көптеген браузерлер жіберілген сілтемеге автоматты түрде өтеді. Қайта бағыттауды жүзеге асыру үшін мына codeты қосу керек:
resp.sendRedirect(req.getContextPath() + "/hello");
HttpServletResponse бағдарламасында біз redirect() әдісін шақырамыз және оған клиент байланысуы қажет мекенжайды береміз. Маңызды деталь: http параметрлерін толық қайта бағыттау жолының соңына қосу керек, бұл өте ыңғайлы емес. Біздің жағдайымызда алға пайдалану жақсырақ, бірақ қайта бағыттауды қолданған дұрыс. Егер сіз олардың жұмысындағы айырмашылықты түсінсеңіз, таңдауыңыздан жаңылмайсыз. Жаңа сервлет codeы келесідей болады:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/")
public class IndexServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        getServletContext().getRequestDispatcher("/hello").forward(req, resp);
       resp.sendRedirect(req.getContextPath() + "/hello");
   }
}

Төменгі сызық

Сіздің бірінші веб-қосымшаңыз дайын. Келесі мақалада сіз оны Intellij IDEA қолданбай қалай орналастыру керектігін білесіз. Біз тек GET сұрауларын өңдейтін қолданба жаздық. Қалған http әдістері дәл осылай өңделеді - ата-аналық сыныптың сәйкес әдістерін жоққа шығару. Осындай қарапайым сервлеттерді пайдалана отырып, сіз күрделі, бай веб-қосымшаларды құра аласыз. Әрине, Spring сияқты үлкен фреймворктарды пайдалану, мұны істеу әлдеқайда оңай. Бірақ егер сіз шынымен сервлеттердің барлық мүмкіндіктерін толығырақ зерттегіңіз келсе, ресми сипаттаманы оқи аласыз . 6-бөлім. Сервлет контейнерлері 7-бөлім. MVC (Model-View-Controller) үлгісіне кіріспе 8-бөлім. Spring-boot жүйесінде шағын қолданбаны жазу
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION