JavaRush /Блоги Java /Random-TG /Қисми 5. Сервлетҳо, API серверҳои Java. Навиштани як барн...

Қисми 5. Сервлетҳо, API серверҳои Java. Навиштани як барномаи оддии веб

Дар гурӯҳ нашр шудааст
Ин мавод як қисми силсилаи «Муқаддима ба рушди корхона» мебошад. Мақолаҳои қаблӣ: Қисми 5. Сервлетҳо, API serverҳои Java.  Навиштани як барномаи оддии веб - 1Оё шумо аллакай медонед, ки чӣ тавр навиштани замимаҳои Java, ки матнро ба консол мебароранд, аммо шумо то ҳол намедонед, ки чӣ гуна аввалин веб-барнома эҷод кунед? Аҷаб, худро роҳат кунед. Дар ин мақола мо бо сервлетҳо шинос мешавем ва барномае менависем, ки шумо метавонед ба дӯстони худ бе фиристодани jarnik ё маҷбур кардани онҳо барои зеркашии Java намоиш диҳед. Биёед як барномаи веб нависед . Агар шумо то ҳол бо равишҳое, ки дар барномасозии веб истифода мешаванд, ошно набошед, ман ба шумо маслиҳат медиҳам, ки хонданро аз мақолаи аввали силсилаи " Муқаддима ба рушди корхона " оғоз кунед.

Сервлет чист

Аввалан, биёед бифаҳмем, ки сервлет чист ва чаро шумо дар бораи он зуд-зуд мешунавед. Java Servlet API як API-и стандартишудаест, ки барои татбиқ дар server ва кор бо муштарӣ бо истифода аз схемаи посух ба дархост пешбинӣ шудааст. Сервлет синфест, ки метавонад дархостҳоро аз муштарӣ қабул кунад ва посухҳоро ба он баргардонад. Бале, сервлетҳо дар Java маҳз унсурҳое мебошанд, ки бо онҳо меъмории муштарӣ-server сохта шудааст. Агар дар хотир дошта бошед, мо дар ин бора дар яке аз мақолаҳои силсила сӯҳбат карда будем. Биёед, дар атрофи бутта назанем: биёед фавран code нависем.

Барои сохтани веб-барнома чӣ ба шумо лозим аст

Барои кори бароҳат бо сервлетҳо дар Java, ба шумо Intellij IDEA Ultimate Edition лозим аст. Он пулакӣ аст, аммо шумо метавонед як давраи озмоишии 30-рӯзаро фаъол созед ё versionи дастрасии барвақтро истифода баред - он ҳамеша ройгон аст. Ҳамчунин 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. Сервлетҳо, API serverҳои Java.  Навиштани як барномаи оддии веб - 2 Қисми 5. Сервлетҳо, API serverҳои Java.  Навиштани веб-барномаи оддӣ - 3

  3. Баъдан, мо нишон медиҳем, ки кадом versionи Tomcat-ро истифода мебарем, URL-еро, ки тавассути он мо метавонем ба server дастрасӣ пайдо кунем ва портро. Шумо бояд чизе монанди ин гиред:

    Қисми 5. Сервлетҳо, API serverҳои Java.  Навиштани як барномаи оддии веб - 4
  4. Танҳо муайян кардани артефакт (лоиҳаи ҷамъшуда ба бойгонии кӯза), ки дар контейнер ҷойгир карда мешавад, боқӣ мемонад. Шумо метавонед тугмаи Ислоҳро пахш кунед ва war exploded -ро интихоб кунед : ин маънои онро дорад, ки пас аз барқарор кардани лоиҳа, артефакт ба таври худкор дар контейнери сервлет ҷойгир карда мешавад. Қисми 5. Сервлетҳо, API serverҳои Java.  Навиштани як барномаи оддии веб - 5

  5. Контексти Ариза бо нобаёнӣ ба servlets_war_exploded муқаррар карда шудааст, ки маънои онро дорад, ки ба барнома бояд дар суроғаи: http://localhost:8080/servlets_war_exploded дастрас шавад .

    Чаро ба мо матни иловагӣ лозим аст? Биёед чизҳои нолозимро хориҷ кунем. Ҳоло суроғаи дархости мо ин аст: http://localhost:8080 .

    Қисми 5. Сервлетҳо, API serverҳои Java.  Навиштани як барномаи оддии веб - 6

  6. OK-ро пахш кунед. Мо мебинем, ки мо ҳоло имкони оғоз кардани барномаро дорем:

    Қисми 5. Сервлетҳо, API serverҳои Java.  Навиштани як барномаи оддии веб - 7

    Ҳоло, вақте ки шумо барномаро оғоз мекунед, браузер бояд хатои 404-ро кушояд ва нишон диҳад. Ин мантиқист, зеро дар суроғаи http://localhost:8080/ бояд сервлет бо харитасозии "/" мавҷуд бошад ва ягона сервлети мо харитасозии "/hello" дорад .

  7. Мо бо он дар http://localhost:8080/hello тамос мегирем ва посухи интизорӣ - сатри "Салом" -ро мегирем!

Агар ҳама чиз кор кунад, биёед codeро бубинем. Барои сохтани serverи http аз синфи муқаррарӣ , шумо бояд онро аз синфи HttpServlet мерос гиред. Дар болои синф мо тавзеҳи @WebServlet()-ро муайян мекунем, ки дар он мо сервлетро ба роҳи мушаххас мепайвандем (харита мекунем) (“/салом”). Ин эзоҳ танҳо дар Java Servlet API 3.0 пайдо шудааст, аз ин рӯ дар Интернет мисолҳои зиёде мавҷуданд, ки харитасозии сервлет тавассути файли XML сурат мегирад. Акнун ин лозим нест. Барои коркарди дархостҳои GET , мо усули doGet()-ро бекор мекунем. Ба аргументҳои усул диққат диҳед - HttpServletRequest ва HttpServletResponse. Аз an objectи 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" равона карда шаванд. Ду роҳи ин кор вуҷуд дорад: бо истифода аз пеш ё масир. Шояд фаҳмидани он ки фарқияти байни онҳо чӣ гуна аст. forward - намояндагон коркардро ба сервлети дигар дар server дархост мекунанд, муштарӣ иштирок намекунад. Барои ин, шумо бояд рамзи зеринро ба усули doGet()-и сервлети нав илова кунед:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
Дар ин code, мо ба контексти сервлет дастрасӣ пайдо мекунем, мудири дархости сервлети дилхоҳро аз он мегирем ва аз он хоҳиш мекунем, ки дархости мушаххасро бо параметрҳои муайяншуда коркард кунад (req, resp). масир - ба муштарӣ суроғаеро, ки барои коркарди дархости ӯ лозим аст, бармегардонад. Аксари браузерҳо ба истиноди интиқолшуда ба таври худкор мераванд. Барои амалӣ кардани масир шумо бояд ин codeро илова кунед:
resp.sendRedirect(req.getContextPath() + "/hello");
Дар HttpServletResponse мо усули redirect() -ро меномем ва ба он суроғаеро, ки муштарӣ бояд тамос гирад, мегузарем. Як ҷузъиёти муҳим: параметрҳои http низ бояд дар охири роҳи масир пурра илова карда шаванд, ки он чандон қулай нест. Дар шароити мо, истифодаи пешрафт афзалтар аст, аммо чунин мешавад, ки истифодаи масир беҳтар аст. Агар шумо фарқияти кори онҳоро дарк кунед, шумо бо интихоби худ хато намекунед. Рамзи сервлети нав чунин менамояд:
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, ин кор осонтар аст. Аммо агар шумо дар ҳақиқат хоҳед, ки тамоми қобorятҳои сервлетҳоро муфассалтар омӯзед, шумо метавонед тавсифи расмиро хонед . Қисми 6. Контейнерҳои сервлет Қисми 7. Муқаддима ба намунаи MVC (Model-View-Controller) Қисми 8. Навиштани барномаи хурд дар spring-boot
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION