- желі туралы ;
- бағдарламалық қамтамасыз ету архитектурасы туралы ;
- HTTP/HTTPS протоколдары туралы ;
- Maven негіздері туралы .
Сервлет дегеніміз не
Алдымен сервлет деген не екенін және ол туралы неге жиі еститінін анықтап алайық. Java Servlet API serverде іске асыруға және сұраныс-жауап схемасын пайдаланып клиентпен жұмыс істеуге арналған стандартталған API болып табылады. Сервлет - бұл клиенттен сұрауларды қабылдай алатын және оған жауаптарды қайтаратын класс. Иә, Java-дағы сервлеттер клиент-server архитектурасы құрастырылған элементтер болып табылады. Естеріңізде болса, біз бұл туралы сериядағы мақалалардың бірінде айтқан болатынбыз. Бұтаның айналасында ұрып-соғуға болмайды: бірден codeты жазайық.Веб-қосымшаны жасау үшін не қажет
Java serverіндегі сервлеттермен ыңғайлы жұмыс істеу үшін сізге Intellij IDEA Ultimate Edition қажет болады. Бұл ақылы, бірақ сіз 30 күндік сынақ мерзімін белсендіре аласыз немесе ерте қол жеткізу нұсқасын пайдалана аласыз - ол әрқашан тегін. Сондай-ақ біздің қолданба 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 конфигурациясын жасау керек:
-
Содан кейін біз Tomcat-тың қай нұсқасын қолданатынымызды, serverге кіруге болатын URL мекенжайын және портты көрсетеміз. Сіз келесідей нәрсені алуыңыз керек:
-
Контейнерде орналастырылатын артефактты (жинақталған жобаны банка мұрағатына) көрсету ғана қалады. Түзету түймесін басып , соғыс жарылды параметрін таңдауға болады : бұл жоба қайта құрылғаннан кейін артефакт автоматты түрде сервлет контейнеріне орналастырылатынын білдіреді.
-
Қолданба мәтінмәні әдепкі бойынша 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» жолына қайта бағыттау болып табылады. Мұны істеудің екі жолы бар: алға немесе қайта бағыттауды пайдалану. Мүмкін, олардың арасындағы айырмашылық неде екенін түсіну керек. алға жіберу – делегаттар 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");
}
}
GO TO FULL VERSION