JavaRush /Блоги Java /Random-TG /Қисми 6: Контейнерҳои сервлет

Қисми 6: Контейнерҳои сервлет

Дар гурӯҳ нашр шудааст
Ин мавод як қисми силсилаи «Муқаддима ба рушди корхона» мебошад. Мақолаҳои қаблӣ: Қисми 6: Контейнерҳои сервлет - 1Дар мақолаи охир мо бо сервлетҳо шинос шуда, бо ёрии онҳо тарзи сохтани веб-барномаҳоро омӯхтем. Вақти он расидааст, ки бодиққат дида бароем, ки ин ҷашн бидуни он - servlet containers ғайриимкон аст.

Мундариҷа:

Контейнери сервлет чист

Ин барномаест, ки дар server кор мекунад ва метавонад бо сервлетҳои эҷодкардаи мо ҳамкорӣ кунад. Ба ибораи дигар, агар мо хоҳем, ки веб-барномаи худро дар server иҷро кунем, мо аввал контейнери сервлетро ҷойгир мекунем ва сипас сервлетҳоро дар он ҷойгир мекунем. Тарзи кори он оддӣ аст: вақте ки муштарӣ бо server тамос мегирад, контейнер дархости ӯро коркард мекунад, муайян мекунад, ки кадом сервлет бояд онро коркард кунад ва ба он интиқол диҳад. Қисми 6. Контейнерҳои сервлет - 2

Чӣ тавр истифода бурдани контейнерҳои сервлет

Илова ба дархостҳои масир, контейнери сервлет дигар вазифаҳоро иҷро мекунад:
  1. Саҳифаҳои HTML-ро аз файлҳои JSP динамикӣ тавлид мекунад.
  2. Паёмҳои HTTPS-ро рамзкушоӣ/рамзкун мекунад.
  3. Барои маъмурияти сервлет дастрасии маҳдудро таъмин мекунад.
Дар маҷмӯъ, ин хуб садо медиҳад, танҳо фаҳмидани он ки чӣ тавр истифода бурдани ин ҳама аст. Хуб, барои омӯхтани тарзи истифода бурдани чизе, ба шумо лозим аст ... кӯшиш кунед, ки онро истифода баред :) Пас, имрӯз мо амал мекунем! Маъмултарин контейнери сервлет Apache Tomcat мебошад . Ин манбаи кушода ва ройгон барои истифода аст. Tomcat-ро барои системаи оператсионии худ аз ин пайванд зеркашӣ кунед ва биёед бубинем, ки чӣ тавр бо контейнерҳо дар амал кор кардан мумкин аст.

Насб ва иҷро кардани Tomcat

  1. Барои насб кардани Tomcat, танҳо бойгонии зеркашидашударо ба директорияи дилхоҳ кушоед.

  2. Лутфан қайд кунед, ки Tomcat барои кор кардан versionи Java 8 ё навтарро талаб мекунад. Боварӣ ҳосил кунед, ки тағирёбандаи муҳити JAVA_HOME ба versionи ҷории jdk дахл дорад.

  3. Минбаъд шумо бояд дастрасии корбарро ба Tomcat танзим кунед . Ин дар файли tomcat-users.xml, ки дар папкаи conf ҷойгир аст, анҷом дода мешавад.

    Tomcat бо чаҳор нақш пешакӣ таъмин карда мешавад:

    • Manager-gui - дастрасӣ ба интерфейси графикӣ ва саҳифаи ҳолати;
    • Manager-скрипт - дастрасӣ ба интерфейси матнӣ ва саҳифаи ҳолати;
    • manager-jmx - дастрасӣ ба JMX ва саҳифаи ҳолати;
    • менеҷер-мақом - дастрасӣ танҳо ба саҳифаи вазъ.

    Дар дохor теги <tomcat-users> мо ин нақшҳоро ба таври возеҳ менависем ва онҳоро ба корбари худ таъин мекунем:

    <role rolename="manager-gui"/>
    <role rolename="manager-script"/>
    <role rolename="manager-jmx"/>
    <role rolename="manager-status"/>
    <user username="user" password="password"
        roles="manager-gui, manager-script, manager-jmx, manager-status"/>

    Акнун ҳама чиз барои оғоз кардан омода аст!

  4. Дар папкаи бин, файли startup.bat -ро иҷро кунед (startup.sh дар Linux).

  5. Пас аз чанд сония, истиноди http://localhost:8080/ -ро дар браузери худ кушоед . Менеҷери графикӣ дар он ҷо пайдо мешавад:

    Қисми 6: Контейнерҳои сервлет - 3

    Агар шумо чунин менюро бинед, ин маънои онро дорад, ки Tomcat кор мекунад.

  6. Агар он кор накунад, тағирёбандаҳои муҳити JAVA_HOME ва CATALINA_HOME-ро дастӣ тафтиш кунед:

    • JAVA_HOME - бояд ба versionи ҷории Java 8+ муроҷиат кунад;
    • CATALINA_HOME - бояд ба Tomcat муроҷиат кунад ё ғоиб бошад (набояд ба versionи дигари Tomcat ишора кунад).

Ҷойгир кардани барнома ба Tomcat

Мо тавонистем Tomcat-ро ба кор андозем, бинобар ин вақти он расидааст, ки ягон намуди лоиҳаро дар он ҷойгир кунем. Биёед сервлетҳои мақолаи қаблиро истифода барем . MainServlet:
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 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" + "
"
); } else { printWriter.write("Hello, " + username + "
"
); } printWriter.write("Page was visited " + visitCounter + " times."); printWriter.close(); } }
IndexServlet:
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 IOException {
       resp.sendRedirect(req.getContextPath() + "/hello");
   }
}
Пеш аз ҷойгиркунӣ, сервлетҳои мо бояд дар бойгонии ҷанг баста шаванд. Одатан Maven барои ин истифода мешавад, аммо барои сохтани бойгонии ҷанг ба шумо файли web.xml лозим аст, ки дар он ҳама сервлетҳо харита шудаанд. Мо бо истифода аз шарҳи нави @WebServlet сервлетҳо навиштем, аз ин рӯ мо web.xml надорем. Хушбахтона, IDEA метавонад кори ифлосро барои мо иҷро кунад ва лоиҳаи моро ба таври инфиродӣ дар бойгонии ҷанг печонад. Барои ин ба шумо лозим аст, ки сохтори лоиҳаро кушоед (Ctrl + Shift + Alt + S) -> Артефактҳо -> Сохтмони дилхоҳро интихоб кунед -> Қуттии паҳлӯи “Дар сохтани лоиҳа дохил кунед” -> “Хуб”-ро клик кунед. Қисми 6: Контейнерҳои сервлет - 4Бо истифода аз комбинатсияи Ctrl + F9 лоиҳа созед. Ҳоло бойгонии ҷангии мо дар феҳристи ҳадаф қарор дорад.Файлро Қисми 6: Контейнерҳои сервлет - 5метавон ба чизи соддатар табдил дод - масалан, servlet.war - ва ба ҷои мувофиқтар - дар C:\my\ кӯчонида шавад. Вақте ки пиво барои истифода омода аст, онро дар як контейнер ҷойгир кунед . Инро бо ду роҳ анҷом додан мумкин аст.
  1. Тавассути GUI

    Барои ин, ба истиноди http://localhost:8080/manager/html пайравӣ кунед . Tomcat бояд аз шумо логин ва паролро талаб кунад.

    Агар шумо ҳамаи қадамҳоро пас аз ман такрор кунед, пас логин корбар аст, парол парол аст .

    Пас аз иҷозати бомуваффақият шумо Manager Tomcat Web Application мебинед. Бахши Барномаҳо аллакай 5 барномаро дар бар мегирад - инҳо барномаҳои утorтаи Tomcat мебошанд, ки барои содда кардани кор бо он заруранд. Онҳо метавонанд дар оянда хориҷ карда шаванд.

    Қисми 6: Контейнерҳои сервлет - 6

    Дар зер бахши ҷойгиркунӣ мавҷуд аст. Бо истифода аз он, шумо метавонед архиви ҷангиро барои ҷойгиркунӣ интихоб кунед. Биёед роҳ ва контекстро дастӣ ворид кунем:

    Қисми 6. Контейнерҳои сервлет - 7

    "Ҷойгир кардан" -ро клик кунед, мо мебинем, ки замимаи мо дар бахши Барномаҳо пайдо шудааст:

    Қисми 6: Контейнерҳои сервлет - 8 Бо истифода аз Tomcat GUI мо метавонем онро қатъ кунем, аз нав оғоз кунем, дарозии сессияро муқаррар кунем ва онро нест кунем. Ҳангоми ҷойгиркунӣ, мо контексти /demo-ро муайян кардем, ки маънои онро дорад, ки барномаи мо бояд тавассути истиноди http://localhost:8080/demo дастрас шавад . Санҷед, ҳама чиз бояд кор кунад.

  2. Тавассути системаи файлӣ

    Барои ҷойгиркунии барнома бо ин роҳ, шумо бояд директорияеро кушоед, ки дар он Tomcat кушода шудааст ва ба webapps равед. Инҳоянд барномаҳои коммуналӣ, ки мо бо онҳо шинос ҳастем:

    Қисми 6. Контейнерҳои сервлет - 9

    Ба мо танҳо лозим аст, ки servlet.war-и худро ба ин ҷо интиқол диҳед.

    Мо чанд сония интизор мешавем, мо мебинем, ки папкаи нави сервлет пайдо шуд, ки ин маънои онро дорад, ки замимаи мо ҷойгир шудааст. Биёед ба интерфейси шиноси менеҷери Барномаҳо равем - http://localhost:8080/manager/ . Дар ин ҷо мо мебинем, ки барномаи мо дар контексти /servlet ҷойгир карда шудааст:

    Қисми 6: Контейнерҳои сервлет - 10

    Вақте ки бо ин роҳ ҷойгир карда мешавад, контекст ба таври худкор ба номи бойгонии ҷанги ҷойгиршуда таъин карда мешавад. Барои тағир додани контекст, шумо метавонед папкаи навтаъсисшударо бо барнома тағир диҳед, аммо пеш аз он шумо бояд файлро нест кунед: дар акси ҳол Tomcat барномаро бо номи бойгонӣ дубора ҷойгир мекунад.

    Тавре ки шумо мебинед, ҷойгиркунии барномаҳо дар Tomcat назар ба он ки ба назар мерасад, хеле осонтар аст. Аммо дигар вазифаҳои он барои истифода осон аст. Биёед тафтиш кунем.

Истифодаи протоколи HTTPS ба ҷои HTTP

Агар шумо дар хотир доред, мо фарқияти байни HTTP ва HTTPS-ро дар мақолаи алоҳида муҳокима кардем . HTTPS ҳамон протоколи HTTP аст, аммо рамзгузории маълумоти интиқолшударо истифода мебарад. Дар тарафи муштарӣ, рамзгузорӣ аз ҷониби браузер идора карда мешавад ва мо бояд рамзгузориро дар тарафи server таъмин кунем. Азбаски дархостҳои HTTP аз ҷониби Tomcat қабул ва интиқол дода мешаванд, ба он додани рамзгузорӣ мантиқӣ мебуд. Барои ин ба шумо лозим аст:
  1. Эҷоди шаҳодатномаи худ имзошуда;
  2. Танзимоти иловагии serverро созед.
Биёед инро амалия кунем.

Ташкor шаҳодатнома

JDK бо шумораи зиёди утorтаҳо, новобаста аз version, яке аз онҳо keytool мебошад . Ин асбобест барои тавлиди калидҳои рамзгузорӣ ва кор бо онҳо. Барои истифодаи он, бо истифода аз сатри фармон, ба директорияи C:\Program Files\Java\jdk1.8.0_181\bin гузаред ва фармони keytool -genkey -alias tomcat -keyalg RSA -ро иҷро кунед .
  • keytool - утorтаро бо параметрҳо оғоз кунед;
  • -genkey - нишон медиҳад, ки мо мехоҳем калиди нав тавлид кунем;
  • -alias tomcat — тахаллуси калидӣ эҷод кунед;
  • -keyalg RSA - RSA-ро ҳамчун алгоритми тавлиди калид интихоб кунед.
Пас аз иҷрои фармон, утorта бо мо муколама оғоз мекунад: Қисми 6: Контейнерҳои сервлет - 11Маълумоти заруриро ворид кунед. Ҳоло мо дар феҳристи хонагии худ як мағозаи калидӣ (барои Windows он C:\Users\{username}\.keystore аст) ва калиди tomcat дар он эҷод кардем. Мо шаҳодатномаи оддиеро тавлид кардем, ки аксари браузерҳо онро қабул мекунанд. Ин сертификат барои барномаҳои тиҷоратӣ мувофиқ нест: он метавонад танҳо барои мақсадҳои санҷиш истифода шавад. Дар serverи истеҳсолӣ, шумо бояд сертификати мақомоти сертификатсияро истифода баред (масалан, https://letsencrypt.org/ ).

Танзими server

Акнун, ки сертификат омода аст, шумо бояд танзимоти server, яъне пайвасткунаки SSL-ро танзим кунед. Ин дар файли server.xml, ки дар apache-tomcat-9.0.30/conf/ ҷойгир аст, анҷом дода мешавад . Мо чунин блокҳоро пайдо мекунем:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true">
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
                         type="RSA" />
        </SSLHostConfig>
 </Connector>
ва дар паҳлӯи онҳо мо конфигуратсияи худро ҷойгир мекунем:
<Connector
       protocol="org.apache.coyote.http11.Http11NioProtocol"
       port="8443" maxThreads="200"
       scheme="https" secure="true" SSLEnabled="true"
       keystoreFile="C:\Users\user\.keystore" keystorePass="mypass"
       clientAuth="false" sslProtocol="TLS"/>
Мо ба параметрҳои keystoreFile ва keystorePass арзишҳоеро таъин мекунем, ки барои мо мувофиқанд, бо истифода аз файлҳои shutdown.bat ва startup.bat Tomcat-ро захира ва бозоғоз намоед. Ҳоло server барои коркарди дархостҳои https омода аст, танҳо каме дар суроғаи тағирёфта - https://localhost:8443/demo/hello . Вақте ки шумо истинодро пахш мекунед, шумо огоҳиро дар бораи шубҳанок будани сертификат хоҳед дид, ки ин тааҷҷубовар нест. Тавре ки каме пештар тавсиф карда шуд, барои гирифтани шаҳодатномаи муқаррарӣ шумо бояд аз хидматҳои яке аз хидматҳои сертификатсия истифода баред. Аммо то ҳол мо ба ҳадафи худ расидем: барнома бо истифода аз протоколи HTTPS кор мекунад ва ин чизи асосӣ аст!

Насли динамикии саҳифаҳои HTML

Акнун биёед баррасии худро дар бораи дигар хусусиятҳои контейнерҳои сервлет - тавлиди динамикии саҳифаҳои HTML идома диҳем. Ҷаҳони идеалиро тасаввур кунед, ки дар он ба ҷои codeи HTML статикии дилгиркунанда, шумо метавонед рамзи JAVA-ро бо истифода аз тағирёбандаҳо, ҳалқаҳо, массивҳо ва дигар сохторҳои забонӣ нависед. Шумо тасаввур кардед? Хабари хуш ин аст, ки чизи шабеҳ вуҷуд дорад, хабари бад ин аст, ки он пурра вуҷуд надорад. Агар шумо тахмин накарда бошед, мо дар бораи технологияи JSP (Java Server Pages) сухан меронем. Хулоса, ин технологияест, ки ба шумо имкон медиҳад, ки қисмҳои рамзи JAVA-ро ба саҳифаи HTML ворид кунед. Дуруст аст, пас ин code то ба мизоҷ фиристодан ҳоло ҳам ба HTML табдил дода мешавад, аммо он бо назардошти омилҳои гуногун ба таври динамикӣ тавлид мешавад. Масалан, шумо метавонед конструксияҳои шартиро истифода баред ва вобаста ба баъзе шартҳо мундариҷаи гуногунро пешкаш кунед. Намунаи саҳифаи JSP:
<%@ page language="java"" %>
<html>
<head>
<title>JSP</title>
</head>

<body>
<%
String firstName="name";
String secondName="surname";

    if(firstName.equals("name")){
      out.print("Hello :"+firstName+"<br>");
    }

    if(firstName.equals("name") && secondName.equals("surname"))
    {
      out.print("Hello, my dear friend! <br>");
    }
    else
    {
      out.print("I don’t know you. Go away! <br>");
    }
%>
</body>
</html>
Шумо метавонед бештар дар бораи JSP дар ин ҷо бихонед . Воқеан... мо на барои ин, балки ба хотири контейнерҳои сервлет омадаем! JSP ба он чӣ дахл дорад? Ин оддӣ аст: табдor codeи JAVA аз JSP ба codeи HTML тавассути контейнери сервлет анҷом дода мешавад. Вақте ки сервлет мундариҷаи JSP-ро ҳамчун посух бармегардонад, контейнер огоҳӣ мегирад ва пеш аз фиристодани он мундариҷа ба мизоҷ аввал онро ба саҳифаи HTML-хондашавандаи браузер табдил медиҳад. Имрӯз аналогҳои зиёди технологияи JSP мавҷуданд - Thymeleaf, FreeMarket, Mustache ва ғайра. Ҳамаи онҳо аз рӯи принсипи монанд кор мекунанд. Кадоме аз онҳоро барои кор интихоб кардан ин як табъ аст. Ин ба интихоби контейнери сервлет низ дахл дорад. Дар мисолҳо мо Tomcat-ро истифода бурдем, ки контейнери маъмултарин аст, аммо баъзе лоиҳаҳо дигаронро истифода мебаранд. Бояд ба таври мухтасар бо маъмултаринҳо шинос шавед ва ба фарқиятҳои онҳо аз Tomcat назар кунед.

Алтернативаҳо ба Tomcat

  1. GlassFish як контейнери кушодаасос мебошад, ки аз ҷониби Oracle дастгирӣ карда мешавад.

    Баръакси Tomcat, он як веб-serverи мукаммалест, ки ба ғайр аз сервлетҳо метавонад ҷузъҳои дигарро аз чаҳорчӯбаи JavaEE идора кунад. Дар айни замон, он миқдори зиёди RAM-ро истифода мебарад. Ҳангоми танзими дақиқи server чандиртар аст, ки истифодаи онро мушкилтар мекунад. Ҳангоми таҳияи барномаҳо бо истифода аз чаҳорчӯбаи JavaEE истифода бурдан меарзад.

  2. WildFly - қаблан Jboss . Инчунин манбаи кушода. Аз ҷониби Red Hat таҳия шудааст. Ном барои пешгирӣ кардани иштибоҳ бо маҳсулоти дигари ширкат - JBoss Enterprise Application Platform иваз карда шуд.

    WildFly, ба монанди GlassFish, як веб-serverи мукаммал аст. Воқеан, дар зери капот WildFly Tomcat-ро ҳамчун контейнери сервлет истифода мебарад. Баръакси GlassFish, WildFly сабуктар аст ва насб кардан осонтар аст.

  3. Jetty - монанд ба пештара, манбаи кушода аст. Аз ҷониби Eclipse таҳия шудааст.

    Мисли Tomcat, он як контейнери оддии сервлет аст, ки бидуни дастгирии ҳама ҷузъҳои чаҳорчӯбаи JavaEE. Дар айни замон, он сабуктар аст ва ҳатто метавонад дар телефони мобилӣ идора карда шавад. Он зуд оғоз ва қатъ мешавад ва хуб миқёс мекунад. Баръакси Tomcat, он дорои ҷомеаи хурдтар ва пойгоҳи дониш аст.

  4. WebLogic нармафзори иҷозатномадорест, ки пеш аз истифода харидро талаб мекунад. Моликияти Oracle.

    Дар муқоиса бо Tomcat, функсияи он каме васеътар аст. Бо протоколи ftp кор карда метавонад. Аммо ҳангоми таҳия ва санҷиши барномаҳо он қадар чандир нест.

  5. WebSphere (аниқтараш WebSphere Application Server) як нармафзори пулакӣ мебошад. Аз ҷониби IBM таҳия шудааст. Ба монанди WildFly ва GlassFish, он як serverи мукаммали барномаҳо мебошад. Аммо он дорои интерфейси осонтари танзимот ва инчунин эътимоднокии баланди амалиётӣ мебошад.

    Камбудии он дар он аст, ки он захираҳои зиёдро истифода мебарад, барои оғоз кардан ва қатъ кардан вақти зиёд мегирад, ки ҳангоми таҳияи лоиҳаҳои хурд чандон қулай нест.

Кадом контейнери сервлет ё serverи барномаро интихоб кардан аз лоиҳаи мушаххас вобаста аст. Лоиҳаҳое ҳастанд, ки ҳатто як бегонаи возеҳ метавонад худро ба сифати баландтарин собит кунад, аммо дар аввал беҳтар аст, ки як чизро бодиққат фаҳмед. Шояд номзади беҳтарин барои ин Tomcat бошад. Мо аллакай қадамҳои аввалинро дар омӯзиши он гузоштаем ва он гоҳ ба шумо вобаста аст! Дар мақолаҳои ниҳоии силсилаи «Муқаддима ба рушди корхона» мо бо намунаи MVC шинос мешавем. Қисми 7. Муқаддима ба намунаи MVC (Model-View-Controller) Қисми 8. Навиштани барномаи хурд дар spring-boot
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION