- дар бораи шабака ;
- дар бораи меъмории нармафзор ;
- дар бораи протоколҳои HTTP/HTTPS ;
- дар бораи асосҳои Maven .
Сервлет чист
Аввалан, биёед бифаҳмем, ки сервлет чист ва чаро шумо дар бораи он зуд-зуд мешунавед. Java Servlet API як API-и стандартишудаест, ки барои татбиқ дар server ва кор бо муштарӣ бо истифода аз схемаи посух ба дархост пешбинӣ шудааст. Сервлет синфест, ки метавонад дархостҳоро аз муштарӣ қабул кунад ва посухҳоро ба он баргардонад. Бале, сервлетҳо дар Java маҳз унсурҳое мебошанд, ки бо онҳо меъмории муштарӣ-server сохта шудааст. Агар дар хотир дошта бошед, мо дар ин бора дар яке аз мақолаҳои силсила сӯҳбат карда будем. Биёед, дар атрофи бутта назанем: биёед фавран code нависем.Барои сохтани веб-барнома чӣ ба шумо лозим аст
Барои кори бароҳат бо сервлетҳо дар Java, ба шумо Intellij IDEA Ultimate Edition лозим аст. Он пулакӣ аст, аммо шумо метавонед як давраи озмоишии 30-рӯзаро фаъол созед ё versionи дастрасии барвақтро истифода баред - он ҳамеша ройгон аст. Ҳамчунин serverи замимаи мо - Apache Tomcat насб кунед. Tomcat як контейнери сервлет аст: онест, ки дархостҳои воридшударо аз берун коркард мекунад ва онҳоро ба замимаи мо интиқол медиҳад. Шумо метавонед Tomcat-ро аз ин пайванд зеркашӣ кунед .Эҷоди аввалин веб-барнома
Агар ҳама чиз омода бошад, биёед лоиҳаи Maven эҷод кунем. Агар шумо бо Maven шинос набошед, ба мақолаи қаблӣ диққат диҳед . Биёед оғоз кунем!-
Дар 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(); } }
-
Барои иҷро кардани барнома шумо бояд конфигуратсияи Tomcat-ро эҷод кунед:
-
Баъдан, мо нишон медиҳем, ки кадом versionи Tomcat-ро истифода мебарем, URL-еро, ки тавассути он мо метавонем ба server дастрасӣ пайдо кунем ва портро. Шумо бояд чизе монанди ин гиред:
-
Танҳо муайян кардани артефакт (лоиҳаи ҷамъшуда ба бойгонии кӯза), ки дар контейнер ҷойгир карда мешавад, боқӣ мемонад. Шумо метавонед тугмаи Ислоҳро пахш кунед ва war exploded -ро интихоб кунед : ин маънои онро дорад, ки пас аз барқарор кардани лоиҳа, артефакт ба таври худкор дар контейнери сервлет ҷойгир карда мешавад.
-
Контексти Ариза бо нобаёнӣ ба servlets_war_exploded муқаррар карда шудааст, ки маънои онро дорад, ки ба барнома бояд дар суроғаи: http://localhost:8080/servlets_war_exploded дастрас шавад .
Чаро ба мо матни иловагӣ лозим аст? Биёед чизҳои нолозимро хориҷ кунем. Ҳоло суроғаи дархости мо ин аст: http://localhost:8080 .
-
OK-ро пахш кунед. Мо мебинем, ки мо ҳоло имкони оғоз кардани барномаро дорем:
Ҳоло, вақте ки шумо барномаро оғоз мекунед, браузер бояд хатои 404-ро кушояд ва нишон диҳад. Ин мантиқист, зеро дар суроғаи http://localhost:8080/ бояд сервлет бо харитасозии "/" мавҷуд бошад ва ягона сервлети мо харитасозии "/hello" дорад .
-
Мо бо он дар http://localhost:8080/hello тамос мегирем ва посухи интизорӣ - сатри "Салом" -ро мегирем!
Кор бо параметрҳо ва сессия
Биёед сервлети худро такмил диҳем, то он метавонад параметрҳои дархостро коркард кунад ва бо сессия кор кунад: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");
}
}
GO TO FULL VERSION