Servletlar - bu veb-ilovaning server tomonida ishlaydigan Java dasturlari. Appletlar Web-brauzer funksiyalarini dinamik ravishda kengaytirganidek, servletlar ham Web-server funksiyalarini dinamik ravishda kengaytiradi. Servletlar har qanday so'rovga xizmat qilishi mumkin bo'lsa-da, ular odatda veb-serverlarni kengaytirish uchun ishlatiladi. Bunday ilovalar uchun Java Servlet texnologiyasi HTTP-ga xos servlet sinflarini belgilaydi. Javax.servlet va javax.servlet.http paketlari servletlar yaratish uchun interfeys va sinflarni taqdim etadi.
- Veb-loyihaning tuzilishi qanday?
- Servlet konteyneri nima? Servletning hayot aylanishi.
Servlet konteyneri - bu servletlarning hayot aylanishini boshqaradigan dastur.
Servlet hayotiy sikli: u servlet konteyneri tomonidan boshqariladi, servletga birinchi marta kirishda u xotiraga yuklanadi va init() usuli chaqiriladi. Ilova ishga tushganda, mijoz so'rovlarini qayta ishlash uchun service() usullari chaqiriladi. Ilova tugagach, destroy() usuli chaqiriladi va servlet xotiradan tushiriladi.
- Servlet konteynerining vazifalari, funksionalligi qanday?
Servlet konteyneri to'liq mustaqil veb-server sifatida ishlashi, Apache kabi boshqa veb-serverga sahifalarni taqdim etishi yoki Java EE dastur serveriga integratsiyalashishi mumkin. Servlet va mijozlar o'rtasida ma'lumotlar almashinuvini ta'minlaydi, ishlaydigan servlet uchun dasturiy ta'minot muhitini yaratish, mijozlarni aniqlash va avtorizatsiya qilish, ularning har biri uchun seansni tashkil qilish kabi funktsiyalarni bajaradi.
- sendRedirect() forward() dan qanday farq qiladi?
JSPga nisbiy yo'l orqali qo'ng'iroq qilish uchun forward() usulidan foydalaning; mutlaq yo'l yordamida JSPga kirish uchun sendRedirect() usulidan foydalaning. Bu usullar orasidagi farq shundan iboratki, mavjud so‘rov so‘rovi obyekti forward() usuli bilan uzatiladi va sendRedirect() usuli chaqirilganda yangi so‘rov hosil bo‘ladi. Ikkinchi holatda ma'lumot boshqa ob'ektlar bilan uzatilishi kerak. Bundan tashqari, forward() usuli tezroq.
- Servlet filtrlari haqida nimalarni bilasiz?
Filtr interfeysini amalga oshirish so'rovni to'xtatuvchi, mijoz so'rovining sarlavhasi va mazmunini o'zgartira oladigan ob'ektni yaratishga imkon beradi. Filtrlar so'rov yoki javob yaratmaydi, faqat ularni o'zgartiradi. Filtr so'rovni servletga tushishidan oldin qayta ishlaydi va keyin (agar kerak bo'lsa) servletdan javobni qayta ishlaydi. Filtr turli xil manbalar bilan, xususan, servletlar va JSP sahifalari bilan o'zaro ta'sir qilishi mumkin. Servlet filtrlari:
- servlet ishga tushishidan oldin servlet boshlanishini to'xtating.
- servlet chaqirilishidan oldin so'rovning mazmunini aniqlang.
- kiruvchi so'rov paketlangan sarlavhalar va so'rov ma'lumotlarini o'zgartirish.
- qabul qilingan javob to'plangan sarlavhalar va javob ma'lumotlarini o'zgartirish.
- servletga qo'ng'iroq qilingandan so'ng servletni ishga tushirishni to'xtatish.
Servlet filtri bitta servlet yoki servletlar guruhida ishlash uchun sozlanishi mumkin. Filtrlarni shakllantirish uchun asos javax.servlet.Filter interfeysi bo'lib, u uchta usulni amalga oshiradi:
- void init(FilterConfig config) ServletException-ni tashlaydi;
- void destroy();
- void doFilter(ServletRequest so'rovi, ServletResponse javobi, FilterChain zanjiri) IOException, ServletExceptionni tashlaydi;
Init() usuli filtr ishga tushishidan oldin chaqiriladi va filtrning konfiguratsiya ob'ektini o'rnatadi. doFilter usuli filtrning haqiqiy ishini bajaradi. Shunday qilib, server filtrni ishga tushirish uchun init() ni bir marta chaqiradi, so'ngra to'g'ridan-to'g'ri filtrga qilingan so'rovlar qancha bo'lsa, shuncha marta doFilter() ni chaqiradi. Filtr o'z ishini tugatgandan so'ng, destroy() usuli chaqiriladi.
- Nima uchun bizga servletlarda tinglovchilar kerak?
Kontekst va seans tinglovchilari kontekst yoki seans qachon ishga tushirilganligini yoki qachon yo'q qilinishi kerakligini va kontekst yoki sessiyaga atributlar qachon qo'shilgan yoki o'chirilganligini kuzatishi mumkin bo'lgan sinflardir. Servlet 2.4 so'rov qanday yaratilishi va yo'q qilinishi hamda atributlar servletga qo'shilishi va o'chirilishini kuzatish uchun so'rov tinglovchi modelini kengaytiradi. Servlet 2.4 quyidagi sinflarni qo'shdi:
- ServletRequestListener
- ServletRequestEvent
- ServletRequestAttributeListener
- ServletRequestAttributeEvent
- Ilovada boshqa servlet tomonidan chiqarilgan istisnolarni qanday hal qilish kerak?
Brauzer faqat HTML tilini tushunganligi sababli, dastur istisno qilganda, servlet konteyneri istisno bilan ishlaydi va HTML javobini yaratadi. Bu 404, 403 va boshqalar kabi xato kodlari bilan sodir bo'ladigan narsaga o'xshaydi. Servlet API biz o'rnatish deskriptorida o'rnatishimiz mumkin bo'lgan istisnolar va xatolarni hal qilish uchun mahalliy servletlarni qo'llab-quvvatlaydi. Bunday servletlarning asosiy vazifasi xato yoki istisnolarni hal qilish va foydalanuvchiga inson o'qiy oladigan HTML javobini yuborishdir. Misol uchun, siz asosiy sahifaga havolani, shuningdek, xato haqidagi ba'zi tafsilotlarning tavsifini taqdim etishingiz mumkin.
- Joylashtirish deskriptori nima?
Joylashtirish deskriptori servlet konteyneriga joylashtiriladigan artefakt konfiguratsiya faylidir. Java Platformasi, Enterprise Edition spetsifikatsiyasida joylashtirish deskriptori komponent, modul yoki dastur (masalan, veb yoki korxona ilovasi) qanday joylashtirilishini tasvirlaydi.
Ushbu konfiguratsiya fayli modul yoki ilova uchun maxsus sozlamalar, xavfsizlik opsiyalari bilan joylashtirish imkoniyatlarini belgilaydi va maxsus konfiguratsiya talablarini tavsiflaydi. Joylashtirish deskriptor fayllari sintaksisi XML.
- Ilovani ishga tushirish bilan servletni ishga tushirishni qanday amalga oshirish mumkin?
Servlet konteyneri odatda mijozning birinchi soʻrovi boʻyicha servletni yuklaydi, lekin baʼzida servletni dastur boshidayoq yuklash kerak boʻladi (masalan, agar servlet katta boʻlsa va uni yuklash uchun uzoq vaqt kerak boʻlsa). Buning uchun identifikatordagi yuklash elementidan (yoki loadOnStartup izohidan) foydalanishingiz kerak, bu esa ishga tushirish vaqtida servlet yuklanishi kerakligini bildiradi.
Qiymat int bo'lishi kerak. Agar qiymat manfiy bo'lsa, u holda servlet mijozning iltimosiga binoan yuklanadi va agar 0 va undan yuqori bo'lsa, u dastur boshida yuklanadi. Raqam qancha past bo'lsa, servlet shunchalik erta yuklab olish navbatda bo'ladi.
- ServletConfig obyekti nima?
Javax.servlet.ServletConfig interfeysi konfiguratsiya ma'lumotlarini servletga o'tkazish uchun ishlatiladi. Har bir servlet o'zining ServletConfig ob'ektiga ega bo'lib, uni yaratish uchun servlet konteyneri mas'uldir. Web.xml (yoki WebInitParam izohlari) dagi Init parametrlari konfiguratsiya parametrlarini o'rnatish uchun ishlatiladi. getServletConfig() usuli ushbu servletning ServletConfig obyektini olish uchun ishlatiladi.
- ServletContext obyekti nima?
Javax.servlet.ServletContext interfeysi servlet o'z servlet konteyneri bilan bog'lanish uchun foydalanadigan usullar to'plamini belgilaydi, masalan, faylning MIME turini olish, so'rovlarni jo'natish yoki jurnal fayliga yozish. ServletContext obyekti noyob va veb-ilovadagi barcha servletlar uchun mavjud. Veb-ilovaning ishga tushirilgan parametrlariga bir yoki bir nechta servletlarga kirish huquqini berish kerak bo'lganda biz ServletContext obyektidan foydalanishimiz mumkin. Buning uchun elementdan foydalaning
Servlet konteynerlari servletlar guruhiga xos bo'lgan kontekst ob'ektlarini ham taqdim etishi mumkin. Guruhlarning har biri boshqa xost yo'li URL manzillari bilan bog'lanadi.
ServletContext ilovaga tinglovchilar va filtrlarni dasturiy qo'shishni ta'minlash uchun Servlet 3 spetsifikatsiyasida kengaytirilgan. Ushbu interfeysda getMimeType(), getResourceAsStream() va boshqalar kabi ko'plab foydali usullar mavjud.
- ServletContext va ServletConfig o'rtasidagi farq nima?
Quyida ba'zi farqlar keltirilgan:
- ServletConfig har bir servlet uchun noyobdir, ServletContext esa butun ilovada yagonadir.
- ServletConfig servletni ishga tushirish parametrlarini ta'minlash uchun ishlatiladi va ServletContext barcha servletlar uchun dasturni ishga tushirish parametrlarini ta'minlash uchun ishlatiladi.
- Bizda ServletConfig obyektida atributlarni o‘rnatish imkoni yo‘q, shu bilan birga biz boshqa servletlar uchun mavjud bo‘ladigan ServletContext obyektiga atributlarni o‘rnatishimiz mumkin.
- ServletResponse interfeysi.
ServletResponse interfeysi mijozga ma'lumotlarni yuborish uchun vositadir. Ushbu vositaning barcha usullari shu maqsadga xizmat qiladi.
- ServletRequest interfeysi.
ServletRequest interfeysi HTTP so'rov parametrlarini olish uchun vositadir. Ushbu interfeys nomi va maqsadi bo'yicha ServletContext bilan bir xil bo'lgan ba'zi usullarga ega.
- So'rov dispetcheri nima?
RequestDispatcher interfeysi so'rovni boshqa resursga o'tkazish uchun ishlatiladi (u HTML, JSP yoki bir xil ilovadagi boshqa servlet bo'lishi mumkin). Bundan javobga boshqa resurs tarkibini qo'shish uchun foydalanishimiz mumkin. Ushbu interfeys bir xil kontekstdagi servletlar o'rtasidagi ichki aloqa uchun ishlatiladi. Interfeys ikkita usulga ega:
- void forward(ServletRequest var1, ServletResponse var2) - servletdan so'rovni serverdagi boshqa resursga (servlet, JSP yoki HTML fayli) yo'naltiradi.
- void include(ServletRequest var1, ServletResponse var2) - javobda resurs tarkibini (servlet, JSP yoki HTML sahifasi) o'z ichiga oladi.
Interfeysga ServletContext getRequestDispatcher(String s) usuli yordamida kirish mumkin. Yo'l / bilan boshlanishi kerak, bu kontekstning joriy ildiz yo'liga nisbatan izohlanadi.
- Servletda qanday qilib blokirovka qilish mumkin?
O'lik qulfni (tuhfani) halqali usul chaqiruvini amalga oshirish orqali olish mumkin, masalan, doGet () usulida doPost () usulini chaqirish va doPost () usulida doGet () ni chaqirish.
- Serverda servlet manzilini qanday olish mumkin?
Serverdagi servletning haqiqiy yo'lini olish uchun siz ushbu konstruktsiyadan foydalanishingiz mumkin: getServletContext().getRealPath(request.getServletPath()).
- Servletdan server ma'lumotlarini qanday olish mumkin?
Server ma'lumotlarini getServerInfo() usuli yordamida ServletContext obyekti yordamida olish mumkin. Bular. getServletContext().getServerInfo().
- Serverda mijozning IP manzilini qanday olish mumkin?
Servletdagi mijozning IP-manzilini olish uchun request.getRemoteAddr() dan foydalaning.
- Servlet o'rash sinflari haqida nimalarni bilasiz?
Servlet HTTP API ikkita o'rash sinfini taqdim etadi, HttpServletRequestWrapper va HttpServletResponseWrapper. Ular ishlab chiquvchilarga servlet so'rovi va javob turlarining o'z ilovalarini amalga oshirishda yordam beradi. Biz ushbu sinflarni kengaytira olamiz va o'z javobimizni va so'rov ob'ekt turlarini amalga oshirish uchun faqat kerakli usullarni bekor qilishimiz mumkin. Bu sinflar standart servlet dasturlashda ishlatilmaydi.
Java-ning eng yoqimli xususiyatlaridan biri uning ko'p qirraliligidir. Albatta, an'anaviy ish stoli va hatto mobil ilovalarni yaratish juda yaxshi. Ammo, agar siz jasur yo'ldan tushib, Java veb-ishlab chiqish hududiga kirmoqchi bo'lsangiz-chi? Siz uchun yaxshi yangilik shundaki, bu til to'liq Servlet API bilan birga keladi, bu sizga juda ko'p qiyinchiliksiz mustahkam veb-ilovalarni yaratish imkonini beradi.
Servletlar yordamida Java dasturlarini yaratish
Shunday qilib, biz allaqachon dastur konfiguratsiya fayllarini yaratdik. Biroq, hozirgi holatida, u tom ma'noda hech narsa qilmaydi. Mijozlar HTML formasi yordamida roʻyxatdan oʻtishlarini istaymiz, shuning uchun biz qilishimiz kerak boʻlgan navbatdagi narsa roʻyxatdan oʻtish muvaffaqiyatli boʻlgach, yuqoridagi shakl va mijoz maʼlumotlarini koʻrsatadigan JSP fayllarini yaratishdir. Biz hozir shunday qilamiz.
Ko'rinish ustida ishlash
Ilovaning ko'rinishi ikkita JSP fayli bilan belgilanadi - MVC kontekstida ular ko'rinishlar deb ataladi. Birinchisi, ro'yxatga olish shaklini va kiritilgan ma'lumotlarni tekshirishdan keyin yuzaga kelishi mumkin bo'lgan xatolarni ko'rsatish uchun javobgar bo'ladi. Ikkinchisi, ro'yxatdan o'tish jarayoni muvaffaqiyatli yakunlanganidan keyin mijoz tomonidan kiritilgan ma'lumotlarni ko'rsatadigan oddiy xush kelibsiz sahifa bo'ladi.
Mana birinchi JSP fayli:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Roʻyxatdan oʻtish
$(buzilish).
Faylda bir nechta qo'shimchalar bilan oddiy HTML mavjud. Bu JSP ning JSTL va JEL bilan birlashtirilgan go'zalligi. Standart teglar yordamida tekshirish xatolarini tekshirish qanchalik osonligiga e'tibor bering<с:if>va
Ro‘yxatdan o‘tish shaklining harakat atributi quyidagi URL manziliga ishora qiladi: $(pageContext.request.contextPath)/processcustomer . Bu shuni anglatadiki, mijoz har safar ro'yxatdan o'tishga harakat qilganda, forma mavjud bo'lgan URL manzilidan qat'i nazar, ma'lumotlar mijozga yuboriladi. Bunga JSP faylida mavjud bo'lgan so'rov kabi ob'ektlarning funksionalligi orqali erishiladi.
Tez orada servlet jarayon mijozning URL manziliga qanday bog'lanishini va uning kirish bilan qanday o'zaro ta'sirini ko'rib chiqamiz. Hozircha, salomlashish sahifasi uchun javobgar bo'lgan JSP faylini ko'rib chiqamiz:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Roʻyxatdan oʻtganingiz uchun tashakkur!
Siz kiritgan maʼlumotlar:
Nomi:$(ism)
Familiya:$(familiya)
Email:$(elektron pochta)
Endi biz sahifalarni ko'rsatish bilan shug'ullanganimizdan so'ng, keyingi qadam POST so'rovlaridan mijoz ma'lumotlarini yig'ish va ma'lumotlarni oddiy usulda tasdiqlash uchun mas'ul bo'lgan servlet yaratishdir.
Biz boshqaruvchini yozamiz
Ro'yxatdan o'tish formasidan ma'lumotlarni qabul qila oladigan servlet yozish armutni otish kabi oson. Biz qilishimiz kerak bo'lgan yagona narsa HttpServlet sinfining pastki sinfini yozish va uning doGet() yoki doPost() usullarini (yoki kerak bo'lganda ikkalasini ham) amalga oshirishdir. Bunday holda, servlet POST so'rovlaridan keladigan ma'lumotlar bilan o'zaro ishlaydi.
Bu qanday ko'rinishga ega:
@WebServlet(name = "CustomerController", urlPatterns = "/processcustomer") umumiy sinf CustomerController HttpServlet-ni kengaytiradi ( @Override himoyalangan bekor doPost(HttpServletRequest so'rovi, HttpServletResponseException), customerquestIOstExthrommer(ResponseRequest) mijoz =RequestExtomerCustomer (Respublika) o'tkazadi; .setAsRequestAttributes(so'rov); Ro'yxat buzilishlari = customer.validate(); agar (!violations.isEmpty()) ( request.setAttribute("buzilishlar", buzilishlar); ) String url =determinUrl(buzilishlar); request.getRequestDispatcher(url) ).forward(so'rov, javob); ) private String defineUrl(Ro'yxat buzilishlari) ( if (!violations.isEmpty()) ( "/" qaytaring; ) else ( "/WEB-INF/views/customerinfo.jsp"ni qaytaring; ) ) xususiy statik sinf RequestCustomer (maxsus final String firstName; private final String lastName; private final String email; private RequestCustomer(String firstName, String lastName, String email) ( this.firstName = firstName; th is.lastName = familiya; this.email = email; ) umumiy statik RequestCustomer fromRequestParameters(HttpServletRequest so'rovi) (yangi RequestCustomer(request.getParameter("firstname"), request.getParameter("familiya"), request.getParameter("email"))ni qaytaring); ) public void setAsRequesttRequestSquest ( request.setAttribute("firstname", firstName); request.setAttribute("familiya", familiya); request.setAttribute("email", email); ) umumiy ro'yxatni tekshirish() (Ro'yxat buzilishi = yangi ArrayList<>(); agar (!StringValidator.validate(firstName)) ( violations.add("Ism - majburiy maydon"); ) agar (!StringValidator.validate(familiya)) ( violations.add("Familiya - majburiy maydon") ; ) agar ( !EmailValidator.validate(email)) ( violations.add("Elektron pochta yaxshi shakllangan bo'lishi kerak"); ) buzilishlarni qaytarish; )))
Bu erda e'tibor berish kerak bo'lgan birinchi narsa @WebServlet(name ="CustomerController", urlPatterns = "/processcustomer") izohidan foydalanishdir. U servlet konteyneriga /processcustomer ga HTTP so'rovlarini boshqarish uchun CustomerController sinfidan foydalanishni aytadi. Xuddi shu effektni web.xml ga servlet xaritalash ko'rsatmalarini qo'shish orqali erishish mumkin, ammo biz Servlet Specification 3.1 dan foydalanayotganimiz uchun bu usulga murojaat qilishimiz shart emas.
Bu yerda biz servletni CustomerController deb nomladik, chunki @WebServlet izohining nom atributining qiymati sifatida servlet klassi nomidan foydalanish yaxshi amaliyot hisoblanadi. Aks holda, ba'zi konteynerlar mos kelmaydi, natijada 404 xatosi paydo bo'ladi.
CustomerController sinfining o'zi bir nechta oddiy vazifalarni bajaradi. Birinchidan, u formaning ismi, familiyasi va elektron pochta maydonlariga mos keladigan qiymatlarni o'z ichiga olgan HttpServletRequest interfeysi yordamida shakl ma'lumotlarini to'playdi. Keyin u ushbu qiymatlarni so'rov atributlari sifatida o'rnatadi, shunda ular shaklda yoki natijalar sahifasida qayta ko'rsatilishi mumkin. Nihoyat, validatorlar kiritilgan ma'lumotlarning to'g'riligini tekshiradilar.
Tekshiruvchilar oddiy sinflar bo'lib, ma'lum xususiyatlarni tekshiradi, masalan, satr bo'sh yoki elektron pochta elektron pochtaga o'xshaydi. Muallifning GitLab-da siz ularning amalga oshirilishini ko'rishingiz mumkin.
Tekshirish natijasi voqealarning keyingi jarayoniga ta'sir qiladi: agar ma'lumotlar noto'g'ri bo'lsa, mijoz RequestDispatcher ob'ekti orqali tegishli xatolar ko'rsatiladigan ro'yxatga olish sahifasiga yo'naltiriladi. Agar hamma narsa tartibda bo'lsa, xush kelibsiz sahifasi ko'rsatiladi.
Shunday qilib, biz HTML formasi, asosiy servlet va bir nechta JSP fayllari yordamida mijozlarni ro'yxatdan o'tkazish imkonini beruvchi to'liq Java veb-ilovasini yaratdik. Uni ishga tushirish vaqti keldi.
Ilova ishga tushirilmoqda
Ilovani ishga tushirish uchun siz quyidagi amallarni bajarishingiz kerak:
IntelliJ IDEA). Loyihani ishga tushirganingizda va uni ishga tushirganingizda, standart brauzer kirish oynasi bilan ishga tushishi kerak.
Xulosa
Shunday qilib, siz murakkab ramkalarga murojaat qilmasdan o'zingizning Java veb-ilovangizni yaratish uchun zarur bo'lgan barcha ko'nikmalarga ega bo'ldingiz. Sizga kerak bo'lgan yagona narsa - Servlet API, ko'rsatish uchun JSP kabi texnologiya va o'rnatilgan Java vositalari. Bu ajoyib, to'g'rimi?
Ta'kidlash joizki, CustomerController sinfini amalga oshirish servletlarning afzalliklari va kamchiliklarini ta'kidlaydi: bir tomondan, u so'rov parametrlarini qayta ishlash va mijozga turli formatlarda javoblarni yuborish qanchalik oson ekanligini qisqacha ko'rsatadi. Ammo bu funksionallik qimmatga tushadi: HttpServletResponse va HttpServletResponse interfeyslarining ikkala ilovasi ham oddiy xizmat lokatorlaridir. Bu yomon degani emas, chunki lokatorlar shunchaki ma'lumotlarni o'z ichiga oladi. Ammo shuni yodda tutingki, ushbu ilovalar har doim servlet bilan bog'lanadi.
Servlet misolida HelloWorld.java servletining o'zi va web.xml ilova identifikatori mavjud. Servlet sizga kirill alifbosidan foydalangan holda javob sahifasini yaratish imkonini beradi. Eclipse IDE-dagi servlet misolining tuzilishi quyidagi skrinshotda ko'rsatilgan.
HelloWorld.java servlet misolining ro'yxati
Quyidagi kod oddiy servletni amalga oshiradi HelloWorld.java, bu brauzerga statik HTML sahifani qaytaradi. Misolda, servlet interfeysni amalga oshiradigan HttpServlet xususiyatlarini meros qilib oladi. Servlet.
java.io.IOException importi; java.io.OutputStreamni import qilish; import javax.servlet.ServletConfig; import javax.servlet.http.HttpServlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloWorld kengaytiradi HttpServlet ( xususiy ServletConfig config; @Override public void init (ServletConfig config) ni chiqaradi ServletException ( this.config = config; ) @Override public void destroy() () @Override public ServletConfig config () @Override public String getServletInfo() ( "Oddiy Servlet"ni qaytaring; ) umumiy bekor xizmati (HttpServletRequest so'rovi, HttpServletResponse javobi) ServletException, IOException (answer.setContentType("text/html") ni chiqaradi; String text = " " + "
" + " " + "Salom %s %s!
" + ""; text = String.format(matn, config.getInitParameter("ism"), config.getInitParameter("mname")); OutputStream outStream = respond.getOutputStream(); outStream.write(text.getBytes(" UTF-8")); outStream.flush(); outStream.close(); ) )Servletga kirishda usul chaqiriladi xizmat, bu javob sahifasini ko'rsatadi va uni HttpServletResponse orqali brauzerga yuboradi. Sarlavha server javobining birinchi satrlarida aniqlanadi kontent turi UTF-8 kodlash bilan. Bundan tashqari, web.xml ilovasi deskriptoridan olingan ism va otasining ismi javob shabloniga almashtiriladi. Ya'ni, servlet konfiguratsiya parametrlari o'qiladi.
Kirill alifbosi bilan sahifani qaytarish imkoniyatiga ega bo'lish uchun foydalaning Output Stream. Har qanday ma'lumotni chiqish oqimiga chiqarish mumkin (bizning misolimizda, oddiy HTML kod).
Ilova deskriptorlari roʻyxati web.xml
Ilova deskriptorida web.xml servlet parametrlari (nomi servlet-nomi va sinf servlet-klassi) va ishga tushirish parametrlari (ismi, otasining ismi mname) aniqlanadi. Servlet ushbu parametrlardan foydalanib o'qiydi ServletConfig.
Servlet misolini Eclipse IDE-dan ishga tushirish uchun siz dastur serverini ishga tushirishingiz va brauzeringizning manzil satriga quyidagi qatorni kiritishingiz kerak:
http://localhost:8080/ServletHello/hello
Brauzer bizga Ilf va Petrov asarlarining bosh qahramonini ko'rsatadigan salomni ko'rsatadi.
![](https://i2.wp.com/java-online.ru/images/web/servlet-example2.png)
Servletni alohida kompilyatsiya qilish uchun siz ommaviy ish faylidan foydalanishingiz mumkin, uning matni Windows uchun shunday ko'rinishi mumkin.
SET TOMCAT_LIB="C:\Program Files\Apache Software Foundation\Tomcat\common\lib" SET JAVA_SDK=C:\Java\Sun\SDK\jdk\bin\ %JAVA_SDK%javac -classpath %TOMCAT_LIB%\servlet-api. jar*.java
Servletni kompilyatsiya qilgandan so'ng Salom Dunyo sinfi katalogga joylashtirilishi kerak WEB-INF/sinflar/ Tomcat serveridagi WEB ilovalari va tarqatish deskriptorida ro'yxatdan o'ting web.xml.
Yuklab olish misol
Sahifaning matnida muhokama qilingan misol servlet uchun manba kodi mavjud (191 Kb).
Grafiklar bilan sahifani dinamik ravishda yaratish uchun Chart.js grafik kutubxonasidan foydalanadigan servlet misolini ko'rish mumkin.
Java dasturlash tili paydo bo'lganidan beri deyarli yigirma yil o'tdi. Bu vaqt ichida Java o'lim va unutilish bilan bashorat qilingan edi, bu erda dasturchilar uning sekinligi va resurslarga ochko'zligidan kulishdi. Ammo Java-ga ishonadiganlar ham bor edi, ular har xil kutubxonalarni ishlab chiqdilar, jamiyatni rivojlantirdilar, Java uchun hech qanday cheklovlar yo'qligini o'jarlik bilan isbotladilar: real vaqt, o'rnatilgan, AI - hamma narsa mumkin. Biz chetda turmaslikka va ushbu bo'limda Java bo'yicha kichik bir qator maqolalar tayyorlashga qaror qildik. Bor!
Choynakingiz Java-ni tanlaydi
Oracle ma'lumotlariga ko'ra, Java virtual mashinasi hozirda uch milliarddan ortiq qurilmalarga o'rnatilgan. Va bu nafaqat kompyuterlar va smartfonlar, balki kameralar, televizorlar, Blue-ray pleerlari, printerlar, SIM-kartalar, bankomatlar va hatto avtomobillar. Ushbu ro'yxat doimiy ravishda o'sib boradi va shu bilan birga Java dasturchilari uchun ish takliflari paydo bo'ladi. Hozir ham Java dasturchilari uchun bo'sh ish o'rinlari soni qolganlardan ko'p. Va kompaniyalar ko'proq va ko'proq to'lashga tayyor, xodimlarni o'ziga jalb qiladi va yanada qulay ish sharoitlarini tashkil qiladi.
Va nega u yaxshi?
Java dasturchilari sintaksisning minimalizmiga jalb qilingan. Qo'shimcha modifikatorlar va xizmat so'zlari yo'q. Hatto C++ dasturchilarini dastlab biroz chalkashtirib yuborgan bir nechta merosning yo'qligi ham oxir-oqibat oqilona va asosli bo'lib chiqadi. Oddiy mantiq, xotira bilan avtomatik ishlash, batafsil hujjatlar, har xil savollarga javoblar bilan forumlar, ochiq manba - bularning barchasi ishlab chiqish jarayonini tezda tushunishga imkon beradi va yuzaga kelishi mumkin bo'lgan xatolar sonini sezilarli darajada kamaytiradi. Hatto hind dehqonlari ham Java tilini bir-ikki oyda o'rganishadi, hech bo'lmaganda ularning diplomlarida shunday yozilgan :). Bundan tashqari, Java talqin qilinadigan tildir. Kompilyator manba kodini baytkod deb ataladigan kodga tarjima qiladi, uni orqaga aylantirish oson, bu Java-ni teskari muhandislik uchun ayniqsa jozibador qiladi.
Xo'sh, keling, boshlaylik
Java ob'ektga yo'naltirilgan til bo'lib, barcha o'zgaruvchilar, usullar, konstantalar sinf ichida e'lon qilinadi. Sinflarga qo'shimcha ravishda interfeyslar ham mavjud - ma'lum bir amalga oshirishni ko'rsatmasdan ob'ektning xatti-harakatlarini tasvirlash imkonini beruvchi maxsus mavhum konstruktsiya. Va agar Java-da sinflarning bir nechta merosxo'rligi bo'lmasa, u holda sinf istalgan miqdordagi interfeyslarni amalga oshirishi mumkin, bu bitta ob'ektga ko'p funktsiyalarga ega bo'lish imkonini beradi, lekin ularning faqat bir qismini beradi.
Ma'lumotlar turlarini ikki guruhga bo'lish mumkin: oddiy (int, long, char va boshqalar) va ob'ekt turlari: sinflar, interfeyslar, massivlar. Oddiy turlar har doim va hamma joyda qat'iy o'lchamga ega. Misol uchun, har qanday arxitekturada va har qanday qurilmada int to'rt bayt xotirani egallaydi. Bu hisob-kitoblar uchun juda qulay. Ma'lumotlar massivida massiv hajmini saqlaydigan maxsus uzunlik atributi mavjud, buning uchun ishlab chiquvchilarga alohida rahmat. Har xil turdagi ma'lumotlar usullarga turli yo'llar bilan uzatiladi. Oddiy turlar har doim qiymat bo'yicha uzatiladi. Ob'ekt - xotirani saqlash uchun har doim mos yozuvlar bo'yicha. Bu shuni anglatadiki, agar biz int a = 10 ni o'tkazsak va uning qiymatini chaqirilgan usulda 5 ga o'zgartirsak, u holda a dastlabki usulda baribir 10 bo'ladi.Ammo ob'ektning xususiyatini o'zgartirsak, u asl usulda shunday o'zgaradi. yaxshi.
Xotirani eslang
Java dasturchisi xotirani ajratish va bo'shatish zaruratidan xalos bo'lsa-da, virtual mashina va axlat yig'uvchining ba'zi xususiyatlarini bilmaslik sizning dasturingizni protsessor vaqtini va barcha mavjud xotirani yutib yuboradigan yirtqich hayvonga aylantirishi mumkin.
Yangi massivni yaratishda doimo yodda tutingki, bitta katta xotiradan ko'ra ko'plab kichik xotira qismlarini yaratish osonroq. Aks holda, sizda "Xotira tugadi" xatosiga duch kelish xavfi tug'iladi, bu taxminan sizda xotira borligini bildiradi, lekin barchasi chiqdi.
Ko'pgina dasturchilar Java-ga o'tib, xotirani avtomatik tozalashni o'rganganlarida, barchasi o'zini tozalashiga umid qilib, juda katta hajmdagi ob'ektlarni yaratishni boshlaydilar. Ayni paytda, axlat yig'uvchi mashinaga o'xshaydi, u faqat uy yaqinidagi axlat qutisiga tashlangan axlatni olib ketadi. Agar sizga endi ba'zi ma'lumotlar kerak bo'lmasa, uni eski kartpostallar to'plami kabi saqlamasligingiz kerak - ma'lumotlar ko'rsatgichiga null belgilang, tozalagichga tozalashga yordam bering :). Agar sizga kerak bo'lmasa, ro'yxatni tozalash ham yaxshi amaliyotdir. Esda tutingki, ob'ekt, agar kodda unga havolalar mavjud bo'lsa, xotirada saqlanadi. Agar sizning dasturingiz 16 gigabayt xotirada ishlayotgan bo'lsa ham va Xotira yo'qligi bilan ishlamay qolish xavfi bo'lmasa ham, ishlatilgan xotiraning ko'pligi tufayli u tobora noqulay va sekinlashadi. Foydalanuvchilarning sekin Java dasturlari haqidagi shikoyatlarining 99 foizi samarasiz yozilgan manba kodiga bog‘liq. Agar siz doimiy ravishda tez ishlatiladigan va endi kerak bo'lmaydigan ob'ektlarni yaratishingiz kerak bo'lsa, masalan, ko'plab kichik xabarlar, takroriy foydalanish uchun bir nechta misollarni saqlaydigan hovuz yaratishni o'ylab ko'ring. Esda tutingki, ob'ektni yaratish va o'chirish qimmat operatsiya hisoblanadi.
Ishga kiring, janoblar.
Ming so'zdan ko'ra bitta misol afzal. Siz qo'llanmani aylanib o'tishingiz va bizsiz standart salom so'zlariga qarashingiz mumkin, shuning uchun siz buni allaqachon qilgan deb hisoblaymiz va yanada qiziqarli misolni amalga oshirishga tayyormiz.
Siz va men Java server ilovasi bilan shug'ullanamiz va ijtimoiy tarmoq foydalanuvchilarida "josuslik" uchun kichik dastur yozamiz. Buni amalga oshirish uchun siz NSAda ishga joylashishingiz shart emas - foydalanuvchilar o'zlari haqida hamma narsani tarqatishadi va biz faqat ushbu ma'lumotni olish, tizimlashtirish va chiroyli tarzda namoyish qilishimiz kerak. Keling, mashhur ijtimoiy xizmatlardan birini olaylik, masalan, foursquare va xaritada do'stlarimizning harakatlarini chizamiz.
Birinchidan, keling, to'rtburchakdan nimani olishimiz mumkinligini ko'rib chiqaylik. Ishlab chiquvchilar uchun sahifalarni ko'rib chiqqach, biz e'tiborimizni ikkita usulga qaratamiz:
- https://developer.foursquare.com/docs/users/checkins - foydalanuvchi tashrif buyurgan joylar. Afsuski, hozirda u faqat dasturda ro'yxatdan o'tgan foydalanuvchi uchun qo'llab-quvvatlanadi va amalga oshirishdagi cheklovlar tufayli u shunday bo'lib qoladi, degan mish-mishlar mavjud;
- https://developer.foursquare.com/docs/checkins/recent - ro'yxatdan o'tgan foydalanuvchining do'stlari tashrif buyuradigan joylar. Agar siz ushbu funktsiya bilan ozgina o'ynasangiz, unda achinarli haqiqat paydo bo'ladi: har bir do'st uchun aynan bitta joy - u o'zini tekshirgan oxirgi joy qaytariladi.
Foursquare API-dan foydalanish uchun siz bo'lajak dasturimizni ro'yxatdan o'tkazishingiz kerak, bu manzilga o'ting: https://ru.foursquare.com/developers/register va maydonlarni to'ldiring (ha, siz foursquare-ning o'zida ham ro'yxatdan o'tishingiz kerak, lekin siz buni mensiz mukammal qila olasiz).
Muhim maydonlardan faqat "Ilova nomi", "Yuklab olish / xush kelibsiz sahifa url" (ixtiyoriy veb-manzilni bu yerga kiriting) va "Qayta yo'naltirish URI (lar)" ni bu erda qayd etish mumkin - bu server bizga yuboradigan manzil. ro'yxatdan o'tgandan keyin. Bu yerda kerakli qiymatni keyinroq kiritamiz, ammo hozircha istalgan veb-manzilni kiritishingiz mumkin. "Saqlash" tugmasini bosing va bizning kuzatuvchi dasturimiz muvaffaqiyatli ro'yxatdan o'tkazildi.
Biz bulutlarga ko'tarilamiz
Kapitan Obvious har qanday server ilovasi ishlashi uchun server kerakligini aytadi. Serverni mustaqil ravishda ko'tarish gemorroydir, shuning uchun biz hozir mashhur bo'lgan bulutli echimlardan foydalanamiz. Bulut Google korporatsiyasi tomonidan homiylik qilinadi, chunki ularning Google App Engine bepul, sozlash va ishlatish juda oson. Boshlash uchun bu yerga kiring va Java uchun Google App Engine SDK ni yuklab oling.
Endi siz loyihani yaratishni boshlashingiz mumkin. Java dasturini ishlab chiqish uchun men IntelliJ IDEA dan foydalanaman, lekin siz bepul va teng darajada taniqli Eclipse muhitidan foydalanishingiz mumkin.
Keling, yangi Java loyihasini tanlaylik. Keling, uni nsa_tracker deb ataymiz.
![](https://i0.wp.com/xakep.ru/wp-content/uploads/2014/07/image1.png)
Keyingi yorliqda veb-ilova va Google App Engine-ni chap tomonda belgilang va avval yuklab olingan va paketdan chiqarilgan App Engine SDK-ga yo'lni ko'rsating.
![](https://i1.wp.com/xakep.ru/wp-content/uploads/2014/07/image2.png)
Endi orqaga o'tiring va IDE o'z ishini qilsin. Agar siz IDEA-ni tanlagan bo'lsangiz va hamma narsani to'g'ri bajargan bo'lsangiz, natijada siz ishga tushirilganda bo'sh tarkibga ega brauzer oynasini ochadigan tugallangan loyihani ko'rasiz. Siz kodlashni boshlashingiz mumkin.
Biz izlay boshlaymiz
Shunday qilib, bizda src jildini o'z ichiga olgan loyiha papkasi mavjud. Bu erda biz manba kodini joylashtiramiz. Java-dagi manbalar paketlar bo'yicha guruhlangan. Paket diskdagi papkadir. Paketlar barcha manbalarni yig'ib yubormaslik uchun, balki mantiqiy tamoyillarga amal qilgan holda ularni ajratish uchun kerak. Masalan, foydalanuvchi interfeysi bilan bog'liq kod mantiqiy ravishda ui paketiga, tarmoq o'zaro ta'siri tarmoq paketiga joylashtiriladi. Bu keyinchalik loyihani ishlab chiqish va qo'llab-quvvatlashni sezilarli darajada osonlashtiradi. Paket tuzilmasini kompaniya nomidan so'ng dastur nomi bilan boshlash tarixan amalda bo'lgan. Bu kelajakda bizning manbalarimizni bir xil manbalardan osongina aniqlashga yordam beradi. Dasturimiz uchun org.nsa.tracker paketini yaratamiz. Unda biz sinflarni yaratamiz.
Servletlar serverda foydalanuvchi so'rovlarini qayta ishlash uchun ishlatiladi. Servlet odatda HttpServlet-dan meros bo'lib, so'rov-javob asosida ishlaydigan sinfdir. Buning uchun doGet usulini bekor qilish kifoya. Foydalanuvchi talabiga binoan, biz foursquare-ga kirishimiz, do'stlar ro'yxatini ro'yxatga olishimiz va so'rovni xarita sahifasiga yo'naltirishimiz kerak.
Foursquare API bilan ishlash uchun biz bepul foursquare-api-java kutubxonasidan foydalanamiz, uni shu yerdan olish mumkin. Java kutubxonasi ma'lum funksiyalarni amalga oshiradigan kompilyatsiya qilingan Java sinflarini o'z ichiga olgan jar kengaytmali ZIP arxividir. Avtorizatsiya qilish uchun bizga to'rt kvadratda dasturni ro'yxatdan o'tkazish bosqichida olingan ClientId va ClientSecret kerak. Ushbu parametrlar dasturni bajarish jarayonida o'zgarmasligi sababli ularni doimiylar deb e'lon qilamiz.
Xususiy statik yakuniy satr CLIENT_ID = "FAKE_CLIENT_ID"; xususiy statik final String CLIENT_SECRET = "FAKE_CLIENT_SECRET";
Yakuniy bu o'zgaruvchiga o'zgartirib bo'lmaydigan yakuniy qiymat berilganligini anglatadi. Static o'zgaruvchini berilgan sinfning barcha misollari uchun mavjud qiladi. Foursquare-api-java kutubxonasidan avtorizatsiya misolidan foydalanib, biz quyidagi kodga o'xshash narsani olamiz:
Himoyalangan void doGet(HttpServletRequest req, HttpServletResponse resp) ServletException, IOException ni tashlaydi ( FoursquareApi foursquareApi = yangi FoursquareApi(CLIENT_ID, CLIENT_SECRET, CALLBACK_URL, agar)(nu(nu)=req;String(nu=)deco); Ro'yxatdan o'tish sahifasiga o'ting resp.sendRedirect(foursquareApi.getAuthenticationUrl()); ) else ( urinib ko'ring ( foursquareApi.authenticateCode(code); // Ro'yxatdan o'tish muvaffaqiyatli, ma'lumotlarni yuklash Natijasi
Usul deklaratsiyasida "ServletException, IOException otish" ga e'tibor bering. Bu chiziq usul ushbu istisnolardan birini tashlashi mumkinligini anglatadi. Java-dagi istisno - bu istisno sodir bo'lganligi haqida signal beruvchi ob'ekt. Ular tekshirilishi mumkin va tekshirilmaydi. Belgilangan istisnolar kodning bir qismini try-catch bloki bilan o'rab olish yoki yuqoridan o'tish orqali ishlov berilishi kerak. Tekshirilmagan istisnolar odatda ko'rib chiqilmaydi, chunki ular dastur o'z holatini tiklay olmaganida yuzaga keladi. Ushbu usulda biz faqat FoursquareApiException bilan ishlaymiz.
Veb-server ilova uchun so'rovni qabul qilganda, so'rov URL-manzilini so'rovni bajarishi kerak bo'lgan kod bilan moslashtirish uchun joylashtirish deskriptoridan foydalanadi. Joylashtirish deskriptori web.xml deb nomlangan XML faylidir. Kuzatuv servletining tavsifini qo'shamiz.
Endi /track uchun so'rovlar TrackerServlet nomli servletimiz tomonidan qayta ishlanadi. Qayta qo'ng'iroq qilish URL parametrini http://localhost:8080/track to'g'ri qiymatiga o'rnatishingiz mumkin.
Natijalarni ko'rsatish uchun siz xuddi shu Google korporatsiyasi (https://developers.google.com/maps/documentation/staticmaps/) tomonidan taqdim etilgan Static Maps API-dan foydalanishingiz mumkin. Bizning servletimiz oddiy HTML sahifani yaratadi va foydalanuvchi so'roviga javoban uni qaytaradi.
StringBuilder sb = yangi StringBuilder("
- "); indeks = 1; uchun (Tekshiruv: result.getResult()) ( sb.append("
Sahifani yaratish uchun StringBuilder sinfidan foydalaniladi, bu Java-dagi satrlarning o'zgarmas ob'ektlar ekanligi bilan bog'liq. + operatori yordamida satrlarni birlashtirganda. xotirada yangi qator yaratiladi. StringBuilder xotirani saqlaydi, chunki u birlashtiriladigan satrlarni saqlash uchun char massividan foydalanadi. Foydalanuvchiga javob yuborish:
Byte resultBytes = sb.toString().getBytes("utf-8"); resp.setContentLength(resultBytes.length); resp.getOutputStream().write(resultBytes);
...Va hammasi tayyor. Biz ishga tushiramiz va "Dastur natijasi" degan so'z bilan rasmga o'xshash narsani ko'ramiz.
![](https://i0.wp.com/xakep.ru/wp-content/uploads/2014/07/image3.png)
Keyin nima?
Ilova ma'lumotlarni yig'ish va ko'rsatishni ajratish kabi yaxshilanishi mumkin. Ma'lumotlar to'plamini doimiy ishlaydigan va ma'lumotlar bazasidagi barcha foydalanuvchi harakatlarini eslab turadigan alohida xizmatga o'tkazing. Keyin alohida nuqtalarni emas, balki ulangan marshrutni ko'rsatish mumkin bo'ladi. Foursquare API-ni biroz qazish bilan siz foydalanuvchi faoliyati haqida ko'proq ma'lumot olishingiz mumkin.
Lekin umid qilamanki, men asosiy narsani uddaladim: Java oddiy va ajoyib ekanligiga sizni ishontirish. Bir oydan keyin ko'rishguncha!
Java dasturchi uchun kitoblar
Sizga til o'rganishni “Java. Java: Gerbert Shildt tomonidan yangi boshlanuvchilar uchun qo'llanma. Keyingi daraja "Java. Toʻliq qoʻllanma undan olingan boʻlib, Java Servlet va Bryus V. Perrining JSP Cookbook-dagi servletlar haqida koʻproq bilib olishingiz mumkin.