- tarmoq haqida ;
- dasturiy ta'minot arxitekturasi haqida ;
- HTTP/HTTPS protokollari haqida ;
- Maven asoslari haqida .
Servlet nima
Birinchidan, keling, servlet nima ekanligini va nima uchun u haqida tez-tez eshitishingizni aniqlaymiz. Java Servlet API - bu serverda amalga oshirish va so'rovga javob berish sxemasidan foydalangan holda mijoz bilan ishlash uchun mo'ljallangan standartlashtirilgan API. Servlet - bu mijozdan so'rovlarni qabul qilish va unga javoblarni qaytarish mumkin bo'lgan sinf. Ha, Java-dagi servletlar aynan mijoz-server arxitekturasi qurilgan elementlardir. Esingizda bo'lsa, biz bu haqda seriyadagi maqolalardan birida gaplashgan edik. Keling, butaning atrofida urmang: keling, darhol kod yozaylik.Veb-ilovani yaratish uchun nima kerak
Java-da servletlar bilan qulay ishlash uchun sizga Intellij IDEA Ultimate Edition kerak bo'ladi. Bu pullik, lekin siz 30 kunlik sinov muddatini faollashtirishingiz yoki erta kirish versiyasidan foydalanishingiz mumkin - u har doim bepul. Shuningdek, bizning dastur serverimizni o'rnating - Apache Tomcat. Tomcat - bu servlet konteyneri: u tashqaridan kiruvchi so'rovlarni qayta ishlaydigan va ularni bizning ilovamizga uzatadigan konteynerdir. Tomcat-ni ushbu havoladan yuklab olishingiz mumkin .Birinchi veb-ilovani yaratish
Agar hamma narsa tayyor bo'lsa, keling, Maven loyihasini yarataylik. Agar siz Maven bilan tanish bo'lmasangiz, oldingi maqolaga e'tibor bering . Boshlaylik!-
Pom.xml da javax.servlet-api bog'liqligini qo'shing va qadoqlash urushini o'rnating:
<?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>
Oddiy servlet klassi:
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(); } }
-
Ilovani ishga tushirish uchun siz Tomcat konfiguratsiyasini yaratishingiz kerak:
-
Keyinchalik, Tomcat-ning qaysi versiyasidan foydalanishimizni, serverga kirishimiz mumkin bo'lgan URL manzilini va portni ko'rsatamiz. Siz shunga o'xshash narsani olishingiz kerak:
-
Qolgan narsa, konteynerga joylashtiriladigan artefaktni (yig'ilgan loyihani banka arxiviga) ko'rsatishdir. Tuzatish tugmasini bosishingiz va urush portlashini tanlashingiz mumkin : bu loyiha qayta qurilgandan so'ng artefakt avtomatik ravishda servlet konteyneriga joylashtirilishini anglatadi.
-
Ilova konteksti sukut bo'yicha servlets_war_exploded ga o'rnatiladi , ya'ni ilovaga quyidagi manzildan kirish kerak: http://localhost:8080/servlets_war_exploded .
Nima uchun bizga qo'shimcha matn kerak? Keling, keraksiz narsalarni olib tashlaymiz. Endi bizning ariza manzilimiz: http://localhost:8080 .
-
OK tugmasini bosing. Endi bizda ilovani ishga tushirish imkoniyati borligini ko'ramiz:
Endi, dasturni ishga tushirganingizda, brauzer ochilishi va 404 xatosini ko'rsatishi kerak. Bu mantiqan to'g'ri, chunki http://localhost:8080/ manzilida “/” xaritasi bo'lgan servlet bo'lishi kerak va bizning yagona servletimizda “/hello” xaritasi mavjud .
-
Biz u bilan http://localhost:8080/hello manziliga murojaat qilamiz va kutilgan javobni olamiz - “Salom” qatori!
Parametrlar va seans bilan ishlash
Keling, so'rov parametrlarini qayta ishlash va sessiya bilan ishlash uchun servletimizni yaxshilaylik: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();
}
}
Servlet hozirda seansni boshqarmoqda va har safar sahifaga tashrif buyurilganda visitCounter sonini oshiradi. Agar visitCounter atributi hali yaratilmagan bo'lsa (sahifaga birinchi marta tashrif buyurganingizda), getAttribute() usuli nullni qaytaradi, shuning uchun siz nullni tekshirishingiz kerak. Xuddi shu narsa so'rov parametrlariga ham tegishli. Agar foydalanuvchi foydalanuvchi nomi parametridan o'tmagan bo'lsa, uning qiymati null bo'ladi. Bunday holda, biz foydalanuvchini anonim sifatida kutib olamiz. GET so'rovida parametrni o'tkazish uchun yo'l o'zgaruvchilari ishlatiladi, ya'ni http://localhost:8080/hello?username=Pavel havolasiga kirishingiz kerak . Http so'rovlari haqida ko'proq ma'lumotni seriyadagi oldingi maqolada o'qishingiz mumkin . Endi bizning ilovamiz minimal mantiqqa ega, ammo ildiz yo'lidagi 404 xatolik biroz zerikarli. Buni tuzatish uchun keling, boshqa servlet yaratamiz va uni @WebServlet("/") boshlang'ich sahifasiga joylashtiramiz. Ushbu servletning vazifasi so'rovlarni "/salom" yo'liga yo'naltirishdir. Buning ikki yo'li mavjud: oldinga yoki qayta yo'naltirishdan foydalanish. Ehtimol, ular orasidagi farq nima ekanligini tushunishga arziydi. forward - delegatlar serverdagi boshqa servletga so'rovni qayta ishlash, mijoz ishtirok etmaydi. Buning uchun siz yangi servletning doGet() usuliga quyidagi kodni qo'shishingiz kerak:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
Ushbu kodda biz servlet kontekstiga kiramiz, undan kerakli servletning so'rov menejerini olamiz va undan ko'rsatilgan parametrlar (req, resp) bilan muayyan so'rovni qayta ishlashni so'raymiz. qayta yo'naltirish - mijozga uning so'rovini ko'rib chiqish uchun bog'lanishi kerak bo'lgan manzilni qaytaradi. Ko'pgina brauzerlar uzatilgan havolaga avtomatik ravishda o'tadi. Qayta yo'naltirishni amalga oshirish uchun ushbu kodni qo'shishingiz kerak:
resp.sendRedirect(req.getContextPath() + "/hello");
HttpServletResponse da biz redirect() usulini chaqiramiz va unga mijoz bog'lanishi kerak bo'lgan manzilni uzatamiz. Muhim tafsilot: http parametrlari to'liq qayta yo'naltirish yo'lining oxirida ham qo'shilishi kerak, bu juda qulay emas. Bizning vaziyatimizda oldinga foydalanish afzalroq, lekin shunday bo'ladiki, qayta yo'naltirishdan foydalanish yaxshiroqdir. Agar siz ularning ishidagi farqni tushunsangiz, tanlovingiz bilan adashmaysiz. Yangi servlet uchun kod quyidagicha ko'rinadi:
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