Servletlər. Daxil etdiyiniz məlumatların sosial şəbəkə istifadəçilərinə casusluq üçün servlet yazırıq
Java Servlet müştəridən siqnalları qəbul edən və ona cavablar göndərən eyni adlı proqramlaşdırma dilində yazılmış server tərəfi proqramdır. JSP, EJB, XML və digər əlaqəli texnologiyalardan əlavə, tipik Java EE-ni təşkil edən əsas elementdir. Tətbiq veb serverdə yerləşdirmək üçün WAR (Web AR chive) faylında paketlənə bilər. Java servletini işlədə bilən serverə konteyner deyilir. Belə bir serverdə işləyən proqram dinamik veb səhifələr yarada bilər.
Java Servlet Əsasları
Ən məşhur və geniş istifadə olunan konteynerlər Tomcat və JBoss-dur. Texniki baxımdan, Servlet Ümumi Müştəri/Server Protokolu və ya HTTP üçün genişlənməyə malik normal Java sinfidir. Praktikada o, müvafiq olaraq HttpServlet GET və POST ləğvetmələri vasitəsilə sorğuları emal etmək üçün istifadə olunur. Java Servlet konteyneri sorğu-cavab obyektləri olan Http.ServletRequest və Http.ServletResponse təmin edir. Və adətən dinamik məzmun yaratmaq üçün JSP ilə birlikdə istifadə olunur.
Tipik model ssenarisi:
Java Servlet Filtrləri sorğuları servletə göndərilməmişdən və kodu tamamlandıqdan sonra cavablandırılmamışdan və konteyner cavabı müştəriyə geri göndərməzdən əvvəl onları tutmaq və emal etmək üçün istifadə olunan Java plaginləridir.
Filtrlərlə yerinə yetiriləcək ümumi vəzifələr:
Filtrlər yerləşdirmə təsviri faylına (web.xml) daxil edilir və konfiqurasiya edilir. Servletlər və filtrlər bir-birindən xəbərsizdir, ona görə də sadəcə web.xml-ni redaktə etməklə filtri əlavə edə və ya silə bilərsiniz. Bir resurs üçün çoxlu filtrlərə və ya web.xml üçün zəncir filtrlərinə malik olmaq və ya javax.servlet.Filter interfeysini tətbiq etməklə Java Servlet filtrlərini işə salmaq məqbuldur.
Serverə paralel sorğular, vebin vacib keyfiyyətlərini - multithreading və paralelliyi təmin edən iplər tərəfindən işlənir.
Əsas funksiyalar:
Dinamik veb səhifələrə ehtiyac
Bir biznesin tez dinamik veb səhifələr yaratmaq istəməsinin bir çox səbəbi var, məsələn, vebsaytdakı məlumatların tez-tez dəyişməsi. Xəbərlər və hava saytları adətən tərtibatçıların daimi diqqəti olmadan məzmunu təzə saxlamaq üçün CGI-yə etibar edirlər. Cari qiymətləri və səhm səviyyələrini sadalayan e-ticarət veb-səhifələri bu məzmunu şirkətin daxili infrastrukturundan əldə edərək, tələb olunduqda əldə etmək üçün CGI-dan istifadə edir.
Bir çox istifadəçi CGI-əsaslı veb xidmətləri yaratmaq üçün Java texnologiyasından istifadə təcrübəsi var, lakin Java Servletləri ənənəvi CGI alternativlərindən daha səmərəli, güclü, istifadəsi asan və daha ucuzdur.
Java Servletlərinin üstünlükləri:
Servlet veb proqramın server tərəfində işləyən java proqramıdır. Necə ki, appletlər Veb-brauzerin funksionallığını dinamik şəkildə genişləndirir, servletlər də Web serverin funksionallığını dinamik şəkildə genişləndirirlər.
iş servlet"və aşağıdakı kimi təsvir edilə bilər: müştəridən sorğu daxil olduqda, Veb server xüsusi konfiqurasiya faylından istifadə edərək hansı servletin icra edilməli olduğunu müəyyən edə bilər. Bundan sonra Veb server JVM-i işə salır, o da öz növbəsində servleti icra edir. Servlet sorğunu emal edir və Veb serverin məzmununu ötürür (ehtimal ki, HTML səhifəsi şəklində) Veb server müştəriyə cavab (servlet tərəfindən yaradılan HTML səhifəsi) göndərir.
WEB server mahiyyətcə yükləyən bir növ konteynerdir servlet"s, onları icra edir və nəticəni onlardan alaraq müştəriyə göndərir.
Veb Proqram Arxitekturasında Servlet
Gücü və elastikliyinə görə, servlet"s sistemin arxitekturasında mühüm rol oynaya bilər. Onlar orta təbəqə üçün nəzərdə tutulmuş tətbiq tapşırıqlarını yerinə yetirə, müştəri üçün proksi server rolunu oynaya və hətta yeni protokollar və protokollar üçün dəstək əlavə etməklə orta təbəqənin funksionallığını təkmilləşdirə bilər. digər funksiyalar.Orta təbəqə üç səviyyəli klient-server adlanan sistemdə proqram serveri kimi çıxış edir və Veb brauzer kimi "yüngül" müştəri ilə məlumat mənbəyi arasında yerləşir.
Servlet proxy olaraq
Appletləri dəstəkləmək üçün servletlər öz proxy serverləri kimi çıxış edə bilərlər. Bu vacib ola bilər, çünki Java təhlükəsizlik sistemi tətbiqetmələrə yalnız yükləndikləri serverə qoşulmağa imkan verir. Əgər applet başqa maşında yerləşən verilənlər bazası serverinə qoşulmalıdırsa, servlet applet üçün bu əlaqəni yarada bilər.
Müvəqqəti və daimi servlet"s
Servletlər hər bir müştəri sorğusu üçün işə salına və dayandırıla bilər. Onlar həmçinin Veb server işə salındıqda işə salına və dayandırılana qədər mövcud ola bilərlər. Müvəqqəti servlet"s tələb üzrə yüklənir və nadir hallarda istifadə olunan funksiyalar üçün server resurslarına qənaət etmək üçün yaxşı bir yol təklif edir. Davamlı servletlər Veb server işə salındıqda yüklənir və dayandırılana qədər davam edir. Servletlər serverə davamlı uzantılar kimi quraşdırılır, əgər başlanğıc dəyəri server tərəfində davamlı funksionallıq təklif edərsə (məsələn, RMI xidməti) və ya müştəri sorğularına mümkün qədər tez cavab verməli olduqları hallarda onlar çox yüksəkdir (məsələn, verilənlər bazası bağlantısı yaratmaq). Təyin etmək üçün xüsusi kod yoxdur servlet"lakin daimi və ya müvəqqəti; bu Veb serverin qurulması funksiyasıdır.
Servletin həyat dövrü, javax.servlet.Servlet
Servletlər Veb server platformasında Veb serverin özü ilə eyni prosesin bir hissəsi kimi işləyir. Veb server hər bir servlet instansiyasını işə salmaq, çağırmaq və məhv etmək üçün məsuliyyət daşıyır. Veb server servletlə sadə interfeys vasitəsilə qarşılıqlı əlaqədə olur: javax.servlet.Servlet.
javax.servlet.Servlet interfeysinə üç əsas metod daxildir:
- içində()
- xidmət()
- məhv()
və iki köməkçi üsul:
- getServletConfig()
- getServletInfo()
İnterfeyslər arasındakı oxşarlıqlar servlet"və Java tətbiqetməsi göz qabağındadır. O, belə tərtib edilmişdir! Java servletləri veb-serverlər üçün nədirsə, veb-brauzerlər üçün appletlərdir. Applet veb brauzerdə işləyir, xüsusi interfeys vasitəsilə onun tələbi üzrə hərəkətləri yerinə yetirir. Servlet də eyni şeyi edir. Veb serverdə işləyərkən.
Servletin işə salınması, init() metodu
Servlet ilk dəfə yüklənəndə init() metodu çağırılır. Bu, servletə faylları açmaq və ya serverləri ilə əlaqə yaratmaq kimi istənilən quraşdırma işlərini yerinə yetirməyə imkan verir. Servlet daimi olaraq serverdə quraşdırılıbsa, server işə salındıqda yüklənir. Əks halda, server həmin servletin təqdim etdiyi xidməti yerinə yetirmək üçün müştərinin ilk sorğusunda servleti işə salır.
Bu üsul zəmanət verilir içində() metodu çağırmaq kimi servletə hər hansı digər çağırışdan əvvəl bitəcək xidmət(). qeyd edin ki içində() yalnız bir dəfə çağırılacaq; servlet boşalana və sonra yenidən server tərəfindən yüklənənə qədər çağırılmayacaq.
Metod içində() bir arqument götürür - obyektə istinad ServletConfig, servleti işə salmaq üçün arqumentləri ehtiva edir. Bu obyektin metodu var getServletContext(), bir obyekti qaytarır ServletContext Servlet mühiti haqqında məlumatları ehtiva edən A.
Servlet nüvəsi, xidmət() metodu
Metod xidmət() servletin ürəyidir. Müştəridən gələn hər sorğu bir metod çağırışı ilə nəticələnir xidmət(). Bu üsul sorğunu oxuyur və ServletRequest və ServletResponse iki arqumentindən istifadə edərək cavab mesajı yaradır:
Beləliklə, məlumatı müştəridən servletə ötürməyin iki yolu var. Birincisi, sorğu parametrlərində dəyərlərin ötürülməsidir. Parametr dəyərləri URL-ə daxil edilə bilər. Məlumatı müştəridən servletə ötürməyin ikinci yolu InputStream (və ya Reader) vasitəsilədir.
Metod əməliyyatı xidmət() mahiyyətcə sadədir - serverdən ona ötürülən hər bir müştəri sorğusuna cavab yaradır. Bununla belə, eyni vaxtda bir neçə paralel sorğunun işlənə biləcəyini unutmayın. Əgər üsul xidmət() faylları, verilənlər bazası kimi hər hansı xarici resurs tələb edirsə, o zaman resurslara girişin iplə təhlükəsiz olmasını təmin etmək lazımdır.
Servletin boşaldılması, məhv () üsulu
Metod məhv() servlet boşalmazdan əvvəl bütün resursları (açıq fayllar və verilənlər bazası əlaqələri kimi) buraxmaq üçün çağırılır. Hər hansı son əməliyyatı yerinə yetirməyə ehtiyac yoxdursa, bu üsul boş ola bilər. Bir metodu çağırmadan əvvəl məhv() server ya bütün xidmət əməliyyatlarının tamamlanmasını, ya da müəyyən vaxtın bitməsini gözləyir. Bu üsul deməkdir məhv() istənilən uzun metodun icrası zamanı çağırıla bilər xidmət().
Metodun rəsmiləşdirilməsi vacibdir məhv() bütün zənglərə qədər lazımi resursları bağlamaqdan qaçınmaq üçün xidmət() bitməyəcək.
Servlet konfiqurasiyası, getServletConfig() metodu
Metod getServletConfig() interfeysi həyata keçirən obyektə istinadı qaytarır ServletConfig. Bu obyekt servlet konfiqurasiya məlumatlarına girişi təmin edir, yəni. servletin başlanğıc parametrlərinə və servlet kontekst obyektinə giriş ServletContext, bu servletə və onun mühitinə giriş imkanı verir.
Servlet məlumatı, getServletInfo() metodu
Metod getServletInfo() servletin müəllifi və versiyası kimi servlet haqqında məlumatları ehtiva edən sətri qaytarmaq üçün servlet yaradan proqramçı tərəfindən müəyyən edilir.
ServletRequest interfeysi
ServletRequest servletə HTTP sorğu parametrləri haqqında müştəri məlumat verir, yəni. parametr adı və dəyərləri, atributları və giriş axını daxil olmaqla məlumatları təmin edir. Bu məlumat metoda ötürülür xidmət().
Sonrakı servlet nümunəsi parametrdən məlumatın necə alınacağını göstərir xahişüsul xidmət():
BufferedReader oxuyucusu; Sətir parametri1; string param2; ictimai etibarsız xidmət (ServletRequest sorğusu, ServletResponse cavabı) (oxuyucu = request.getReader(); param1 = request.getParameter("Birinci"); param2 = request.getParameter("İkinci"); )
Sorğu haqqında əlavə məlumat servlet üçün üsullar vasitəsilə əldə edilə bilər, əsas olanlar aşağıdakı cədvəldə verilmişdir:
getAttribute() | Bu sorğunun müəyyən edilmiş atributunun dəyərini qaytarır. |
getContentLength() | Əgər məlumdursa, ölçü tələb edin. |
getContentType() | Sorğu orqanının MIME növünü qaytarır. |
getInputStream() | Sorğu orqanından ikili verilənləri oxumaq üçün InputStream qaytarır. |
GetParameterNames() | Bütün parametrlərin adları ilə sətirlər massivini qaytarır. |
getParameterValues() | Göstərilən parametr üçün dəyərlər massivini qaytarır. |
getProtocol() | Sorğu üçün protokol və versiyanı forma sətri kimi qaytarır |
getReader() | Sorğu orqanından mətn almaq üçün BufferedReader qaytarır. |
getRealPath() | Göstərilən virtual yol üçün real yolu qaytarır. |
getRemoteAddr() | Bu sorğunu göndərən müştərinin IP ünvanı. |
getRemoteHost() | Sorğunu göndərən müştəri maşınının host adı. |
getScheme() | Bu sorğunun URL-də istifadə olunan sxemi qaytarır (məsələn, https, http, ftp və s.). |
getServerName() | Bu sorğunu qəbul edən serverin host adı. |
getServerPort() | Bu sorğunu qəbul etmək üçün istifadə edilən port nömrəsini qaytarır. |
ServletResponse interfeysi
İnterfeys ServletResponse müştəriyə məlumat göndərmək üçün bir vasitədir. Bu alətin bütün üsulları məhz bu vəzifəyə xidmət edir:
İctimai java.lang.String getCharacterEncoding() ictimai etibarsız setLocale(java.util.Locale loc) ictimai java.util.Locale getLocale()
Birinci üsul məlumatın göstəriləcəyi MIME kodlaşdırma növünü (məsələn, UTF8) qaytarır. İkinci iki üsul da charset ilə işləyir. Onlar sənəddə istifadə olunan dili (məsələn, rus dilini) göstərirlər.
İctimai ServletOutputStream getOutputStream() java.io.IOException atır
getOutputStream metodu servlet üçün çıxış axını qaytarır. Bu axın, məsələn, ikili faylları çıxarmaq üçün istifadə olunur. Mətn məlumatları java.io.Writer istifadə edərək çıxarıla bilər:
İctimai java.io.PrintWriter getWriter() java.io.IOException atır
getWriter() metodu avtomatik olaraq sətirləri getCharacterEncoding() və getLocale() metodlarında göstərilən simvol dəstinə çevirir.
ictimai boşluq dəstiContentLength(int len)
setContentLength metodu "Content-Length" HTTP başlıq sahəsinin dəyərini təyin edir
ictimai etibarsız setContentType(String növü)
SetContentType metodu sənədin MIME məzmun növünü göndərmək üçün istifadə olunur. HTTP başlıq sahəsi "Məzmun növü".
Çıxış axını tamponlanır. Bu o deməkdir ki, məlumatların bir hissəsi müştəriyə yalnız bufer dolduqdan sonra veriləcək.
public void setBufferSize(int size) public int getBufferSize() public void flushBuffer() java.io.IOException public void resetBuffer() funksiyasını atır.
Yuxarıdakı 4 üsul müvafiq olaraq göndərmə buferinin ölçüsünü təyin etməyə, ölçüsünü əldə etməyə, doldurulmasını gözləmədən buferin məzmununu müştəriyə göndərməyi inisiallaşdırmağa və bu buferi verilənlərdən təmizləməyə imkan verir.
İctimai məntiqi Təhlükəlidir()
isCommitted metodundan istifadə edərək, müştəriyə məlumatların göndərilməsinin artıq başlanılıb-başlanılmamasından asılı olmayaraq bir bayraq əldə edə bilərsiniz. HTTP cavab başlığı artıq göndərilibsə, bayraq müsbət olacaq.
ictimai etibarsız sıfırlama()
Əgər HTTP başlığı hələ göndərilməyibsə, sıfırlama metodu HTTP başlığını defolt dəyərlərinə "sıfırlayır".
Servletlərdə JFreeChart Diaqramları
JFreeChart qrafik kitabxanası servletlərdə diaqramlar yaratmaq və onları vebsayt səhifələrində şəkillər kimi göstərmək üçün istifadə edilə bilər. Servletlərdə JFreeChart istifadəsinin təsviri təfərrüatları və nümunələri verilmişdir.
Chart.js qrafik kitabxanası olan servlet
Servletdə JNI
Bəzi hallarda sizə WEB proqramında JNI-dən istifadə etmək lazım gələ bilər. Servletlərdə JNI-dən istifadə nümunəsi təqdim olunur.
Servletdəki JMS mesajları
Servlet mübadiləsi üçün istifadə edilə bilər JMS proqramlar arasında mesajlar. JBoss konteynerində JMS mesajlarını göndərmək və oxumaq üçün servletdən istifadə nümunəsi verilmişdir.
Servletlər veb proqramın server tərəfində işləyən Java proqramlarıdır. Necə ki, appletlər Veb-brauzerin funksionallığını dinamik şəkildə genişləndirir, servletlər də Web serverin funksionallığını dinamik şəkildə genişləndirirlər. Servletlər istənilən sorğuya xidmət edə bilsələr də, onlar adətən veb serverləri genişləndirmək üçün istifadə olunur. Bu cür proqramlar üçün Java Servlet texnologiyası HTTP-xüsusi servlet siniflərini müəyyən edir. javax.servlet və javax.servlet.http paketləri servlet qurmaq üçün interfeyslər və siniflər təqdim edir.
- Veb layihəsinin strukturu nədir?
- Servlet konteyneri nədir? Servletin həyat dövrü.
Servlet konteyneri servletlərin həyat dövrünü idarə edən proqramdır.
Servletin həyat dövrü: o, servlet konteyneri tərəfindən idarə olunur, servletə ilk dəfə daxil olanda o, yaddaşa yüklənir və init() metodu çağırılır. Tətbiq işlədikcə müştəri sorğularını emal etmək üçün service() metodları çağırılır. Tətbiq dayandırıldıqda, destroy() metodu çağırılır və servlet yaddaşdan boşaldılır.
- Servlet konteynerinin vəzifələri, funksionallığı hansılardır?
Servlet konteyneri tam müstəqil veb server kimi çıxış edə, Apache kimi başqa veb serverə səhifələr təqdim edə və ya Java EE proqram serverinə inteqrasiya edə bilər. Servlet və müştərilər arasında məlumat mübadiləsini təmin edir, fəaliyyət göstərən servlet üçün proqram təminatı mühitinin yaradılması, müştərilərin müəyyən edilməsi və avtorizasiyası, onların hər biri üçün sessiyanın təşkili kimi funksiyaları yerinə yetirir.
- sendRedirect() forward()-dan nə ilə fərqlənir?
Nisbi yoldan istifadə edərək JSP-yə zəng etmək üçün forward() metodundan istifadə edin; mütləq yoldan istifadə edərək JSP-yə daxil olmaq üçün sendRedirect() metodundan istifadə edin. Bu metodlar arasındakı fərq ondan ibarətdir ki, artıq mövcud olan sorğu sorğusu obyekti forward() metodu ilə ötürülür və sendRedirect() metodu çağırıldıqda yeni sorğu formalaşır. Sonuncu halda məlumat digər obyektlərlə ötürülməlidir. Bundan əlavə, forward() metodu daha sürətlidir.
- Servlet filtrləri haqqında nə bilirsiniz?
Filtr interfeysinin tətbiqi sorğunu kəsən, müştəri sorğusunun başlığını və məzmununu çevirə bilən obyekt yaratmağa imkan verir. Filtrlər sorğu və ya cavab yaratmır, ancaq onları dəyişdirir. Filtr servletə çatmazdan əvvəl sorğunu əvvəlcədən emal edir və sonra (lazım olduqda) servletdən cavabı emal edir. Filtr müxtəlif növ resurslarla, xüsusən də həm servletlər, həm də JSP səhifələri ilə qarşılıqlı əlaqədə ola bilər. Servlet filtrləri:
- servlet başlamazdan əvvəl servletin başlanğıcını kəsin.
- servlet işə salınmazdan əvvəl sorğunun məzmununu müəyyənləşdirin.
- daxil olan sorğunun paketləndiyi başlıqları və sorğu məlumatlarını dəyişdirin.
- alınan cavabın yığıldığı başlıqları və cavab məlumatlarını dəyişdirin.
- servletə zəngdən sonra servletin işə salınmasına müdaxilə edin.
Servlet filtri tək bir servlet və ya bir qrup servlet üzərində işləmək üçün konfiqurasiya edilə bilər. Filtrlərin formalaşması üçün əsas üç metodu həyata keçirən javax.servlet.Filter interfeysidir:
- void init(FilterConfig config) ServletException atır;
- void məhv ();
- void doFilter(ServletRequest sorğusu, ServletResponse cavabı, FilterChain zənciri) IOException, ServletException atır;
Filtr işə başlamazdan əvvəl init() metodu çağırılır və filtrin konfiqurasiya obyektini quraşdırır. doFilter metodu filtrin faktiki işini görür. Beləliklə, server filtri işə salmaq üçün init() funksiyasını bir dəfə çağırır və sonra birbaşa həmin filtrə edilən sorğular qədər doFilter() funksiyasını çağırır. Filtr öz işini bitirdikdən sonra destroy() metodu çağırılır.
- Servletlərdə dinləyicilərə niyə ehtiyacımız var?
Kontekst və sessiya dinləyiciləri kontekst və ya sessiyanın nə vaxt işə salındığını və ya onun nə vaxt məhv edilməli olduğunu və atributların kontekst və ya sessiyaya nə vaxt əlavə edildiyini və ya silindiyini izləyə bilən siniflərdir. Servlet 2.4 sorğunun necə yaradıldığını və məhv edildiyini və atributların servletə necə əlavə edildiyini və silindiyini izləmək üçün sorğu dinləyicisi modelini genişləndirir. Servlet 2.4 aşağıdakı sinifləri əlavə etdi:
- ServletRequestListener
- ServletRequestEvent
- ServletRequestAttributeListener
- ServletRequestAttributeEvent
- Tətbiqdə başqa bir servlet tərəfindən atılan istisnaları necə idarə etmək olar?
Brauzer yalnız HTML dilini başa düşdüyündən, proqram istisna atdıqda, servlet konteyneri istisnanı idarə edəcək və HTML cavabı yaradacaq. Bu, 404, 403 və s. kimi səhv kodları ilə baş verənlərə bənzəyir. Servlet API, yerləşdirmə deskriptorunda təyin edə biləcəyimiz istisnaları və səhvləri idarə etmək üçün yerli servletlərə dəstək verir. Bu cür servletlərin əsas vəzifəsi xətanı və ya istisnanı idarə etmək və istifadəçiyə insan tərəfindən oxuna bilən HTML cavabı göndərməkdir. Məsələn, siz əsas səhifəyə keçid, eləcə də xəta haqqında bəzi detalların təsvirini təqdim edə bilərsiniz.
- Yerləşdirmə deskriptoru nədir?
Yerləşdirmə deskriptoru servlet konteynerinə yerləşdiriləcək artefakt konfiqurasiya faylıdır. Java Platforması, Enterprise Edition spesifikasiyasında yerləşdirmə deskriptoru komponentin, modulun və ya proqramın (məsələn, veb və ya müəssisə proqramı kimi) necə yerləşdiriləcəyini təsvir edir.
Bu konfiqurasiya faylı modul və ya proqram üçün xüsusi parametrlər, təhlükəsizlik seçimləri ilə yerləşdirmə seçimlərini müəyyən edir və xüsusi konfiqurasiya tələblərini təsvir edir. Yerləşdirmə deskriptor faylları üçün sintaksis XML-dir.
- Tətbiqin işə salınması ilə servletin işə salınmasını necə həyata keçirmək olar?
Servlet konteyneri adətən servleti müştərinin ilk sorğusu ilə yükləyir, lakin bəzən servleti birbaşa proqramın başlanğıcında yükləmək lazım gəlir (məsələn, əgər servlet böyükdürsə və yüklənməsi çox vaxt aparacaqsa). Bunu etmək üçün deskriptorda yüklənmə elementindən (və ya loadOnStartup annotasiyasından) istifadə etməlisiniz ki, bu da servletin başlanğıcda yüklənməsini göstərəcək.
Dəyər int olmalıdır. Dəyər mənfi olarsa, servlet müştərinin tələbi ilə yüklənəcək və 0 və daha çox olarsa, tətbiqin başlanğıcında yüklənəcəkdir. Rəqəm nə qədər az olarsa, servlet bir o qədər tez yükləmə növbəsində olacaq.
- ServletConfig obyekti nədir?
javax.servlet.ServletConfig interfeysi konfiqurasiya məlumatını servletə ötürmək üçün istifadə olunur. Hər bir servletin özünün ServletConfig obyekti var, servlet konteynerinin yaradılmasına cavabdehdir. Konfiqurasiya parametrlərini təyin etmək üçün web.xml-də (və ya WebInitParam annotasiyalarında) başlanğıc parametrləri istifadə olunur. GetServletConfig() metodu bu servletin ServletConfig obyektini əldə etmək üçün istifadə olunur.
- ServletContext obyekti nədir?
javax.servlet.ServletContext interfeysi servletin servlet konteyneri ilə əlaqə saxlamaq üçün istifadə etdiyi, məsələn, faylın MIME növünü əldə etmək, sorğu göndərmək və ya jurnal faylına yazmaq kimi metodlar toplusunu müəyyən edir. ServletContext obyekti unikaldır və veb proqramdakı bütün servletlər üçün əlçatandır. Bir və ya bir neçə servletə veb tətbiqinin başlanğıc parametrlərinə giriş icazəsi verməli olduğumuz zaman ServletContext obyektindən istifadə edə bilərik. Bunu etmək üçün elementdən istifadə edin
Servlet konteynerləri həmçinin bir qrup servlet üçün unikal olan kontekst obyektlərini təmin edə bilər. Qrupların hər biri fərqli host yolu URL-ləri ilə əlaqələndiriləcək.
ServletContext proqrama dinləyicilərin və filtrlərin proqramlı əlavə edilməsini təmin etmək üçün Servlet 3 spesifikasiyasında genişləndirilmişdir. Bu interfeys həmçinin getMimeType(), getResourceAsStream() və s. kimi bir çox faydalı metodlara malikdir.
- ServletContext və ServletConfig arasındakı fərq nədir?
Aşağıda bəzi fərqlər var:
- ServletConfig hər servlet üçün unikaldır, ServletContext isə bütün tətbiqdə unikaldır.
- ServletConfig servletin başlanğıc parametrlərini təmin etmək üçün istifadə olunur və ServletContext bütün servletlər üçün tətbiqin başlanğıc parametrlərini təmin etmək üçün istifadə olunur.
- ServletConfig obyektində atributlar təyin etmək imkanımız yoxdur, halbuki biz ServletContext obyektində digər servletlər üçün əlçatan olacaq atributlar təyin edə bilərik.
- ServletResponse interfeysi.
ServletResponse interfeysi müştəriyə məlumat göndərmək üçün bir vasitədir. Bu alətin bütün üsulları bu məqsədə xidmət edir.
- ServletRequest interfeysi.
ServletRequest interfeysi HTTP sorğu parametrlərini əldə etmək üçün bir vasitədir. Bu interfeysdə ad və məqsəd baxımından ServletContext ilə eyni olan bəzi üsullar var.
- Sorğu dispetçeri nədir?
RequestDispatcher interfeysi sorğunu başqa resursa ötürmək üçün istifadə olunur (bu, HTML, JSP və ya eyni proqramdakı başqa servlet ola bilər). Bundan başqa resursun məzmununu cavaba əlavə etmək üçün istifadə edə bilərik. Bu interfeys eyni kontekstdə servletlər arasında daxili əlaqə üçün istifadə olunur. İnterfeys iki üsula malikdir:
- void forward(ServletRequest var1, ServletResponse var2) - servletdən sorğunu serverdəki başqa resursa (servlet, JSP və ya HTML faylı) yönləndirir.
- void daxildir(ServletRequest var1, ServletResponse var2) - cavabda resurs məzmununu (servlet, JSP və ya HTML səhifəsi) ehtiva edir.
İnterfeys ServletContext getRequestDispatcher(String s) metodundan istifadə etməklə əldə edilə bilər. Yol kontekstin cari kök yoluna nisbətən şərh ediləcək / ilə başlamalıdır.
- Servletdə kilid necə yaradıla bilər?
Çıxmaz (çıxmaz), məsələn, doGet () metodunda doPost () metodunu çağırmaqla və doPost () metodunda doGet () çağırmaqla, ilmələnmiş metod çağırışını həyata keçirməklə əldə edilə bilər.
- Servlet ünvanını serverdə necə əldə etmək olar?
Serverdə servletin faktiki yolunu əldə etmək üçün bu konstruksiyadan istifadə edə bilərsiniz: getServletContext().getRealPath(request.getServletPath()).
- Servletdən server məlumatını necə əldə etmək olar?
Server məlumatı getServerInfo() metodundan istifadə etməklə ServletContext obyektindən istifadə etməklə əldə edilə bilər. Bunlar. getServletContext().getServerInfo().
- Serverdə müştərinin IP ünvanını necə əldə etmək olar?
Servletdə müştərinin IP-sini əldə etmək üçün request.getRemoteAddr() istifadə edin.
- Servlet sarğı sinifləri haqqında nə bilirsiniz?
Servlet HTTP API iki sarğı sinifini təmin edir, HttpServletRequestWrapper və HttpServletResponseWrapper. Onlar tərtibatçılara servletin sorğu və cavab növlərinin öz tətbiqlərini həyata keçirməyə kömək edir. Biz bu sinifləri genişləndirə və öz cavab və sorğu obyekt növlərimizi həyata keçirmək üçün yalnız zəruri metodları ləğv edə bilərik. Bu siniflər standart servlet proqramlaşdırmasında istifadə edilmir.
Java-nın ən xoş xüsusiyyətlərindən biri onun çoxşaxəli olmasıdır. Əlbəttə ki, ənənəvi masa üstü və hətta mobil proqramların yaradılması əladır. Bəs siz yoldan çıxmaq və Java veb inkişaf ərazisinə daxil olmaq istəyirsinizsə nə olacaq? Sizin üçün yaxşı xəbər budur ki, bu dil sizə çox çətinlik çəkmədən möhkəm veb proqramları yaratmağa imkan verən tam Servlet API ilə gəlir.
Servletlərlə Java Proqramlarının qurulması
Beləliklə, biz artıq proqram konfiqurasiya fayllarını yaratmışıq. Ancaq indiki vəziyyətində sözün əsl mənasında heç nə etmir. Biz istəyirik ki, müştərilər HTML forması ilə qeydiyyatdan keçə bilsinlər, ona görə də etməli olduğumuz növbəti şey qeydiyyat uğurlu olduqdan sonra yuxarıdakı forma və müştəri təfərrüatlarını göstərəcək JSP faylları yaratmaqdır. İndi edəcəyimiz budur.
Görünüş üzərində işləyir
Tətbiqin görünüşü iki JSP faylı ilə müəyyən ediləcək - MVC kontekstində onlara baxışlar deyilir. Birincisi, qeydiyyat formasının və daxil edilmiş məlumatların təsdiqindən sonra yarana biləcək səhvlərin göstərilməsi üçün məsuliyyət daşıyacaq. İkincisi, qeydiyyat prosesi uğurla başa çatdıqdan sonra müştərinin daxil etdiyi məlumatları göstərəcək normal qarşılama səhifəsi olacaq.
Budur ilk JSP faylı:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Qeydiyyat
$(pozulma).
Fayl bir neçə əlavə ilə sadə HTML ehtiva edir. JSTL və JEL ilə birləşən JSP-nin gözəlliyi budur. kimi standart etiketlərdən istifadə edərək doğrulama səhvlərini yoxlamağın nə qədər asan olduğuna diqqət yetirin<с:if>Və
Qeydiyyat formasının fəaliyyət atributu aşağıdakı URL-ə işarə edir: $(pageContext.request.contextPath)/processcustomer . Bu o deməkdir ki, müştəri hər dəfə qeydiyyatdan keçməyə cəhd etdikdə məlumat formanın mövcud olduğu URL-dən asılı olmayaraq müştəriyə göndəriləcək. Bu, sorğu kimi JSP faylında mövcud olan obyektlərin funksionallığı vasitəsilə əldə edilir.
Tezliklə servletin proses müştəri URL-sinə necə bağlandığını və onun daxiletmə ilə necə qarşılıqlı əlaqədə olduğunu görəcəyik. Hələlik salamlama səhifəsinə cavabdeh olan JSP faylına nəzər salaq:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Qeydiyyatdan keçdiyiniz üçün təşəkkür edirik!
Daxil etdiyiniz məlumat:
Adı:$(ad)
Soyadı:$(soyad)
E-poçt:$(e-poçt)
İndi biz səhifələrin göstərilməsi ilə məşğul olduq, növbəti addım POST sorğularından müştəri məlumatlarının toplanması və verilənlərin sadə şəkildə təsdiqlənməsi üçün cavabdeh olan servlet yaratmaqdır.
Nəzarətçi yazırıq
Qeydiyyat formasından məlumat ala biləcək bir servlet yazmaq armud atmaq qədər asandır. Bizə lazım olan tək şey HttpServlet sinifinin alt sinfini yazmaq və onun doGet() və ya doPost() metodlarını (lazım olduqda hər ikisini) həyata keçirməkdir. Bu halda, servlet POST sorğularından gələn məlumatlarla qarşılıqlı əlaqədə olacaq.
Göründüyü kimi:
@WebServlet(name = "CustomerController", urlPatterns = "/processcustomer") ictimai sinif CustomerController HttpServlet-i genişləndirir ( @Override protected void doPost(HttpServletRequest sorğusu, HttpServletResponse cavabı), customer =RequesttousCmercepion (RequestioCustomerC) atır. fromRequestParameters(sorğu); müştəri .setAsRequestAttributes(sorğu); Siyahı pozuntuları = customer.validate(); if (!violations.isEmpty()) ( request.setAttribute("pozuculuqlar", pozuntular); ) String url = defineUrl(pozulmalar); request.getRequestDispatcher(url) ).irəli(istək, cavab); ) özəl String müəyyənUrl(Siyahı pozuntuları) ( əgər (!violations.isEmpty()) ( "/" qaytarın; ) başqa ( "/WEB-INF/views/customerinfo.jsp" qaytarın; ) ) özəl statik sinif RequestCustomer ( şəxsi yekun String firstName; şəxsi yekun String soyadı; şəxsi yekun String email; private RequestCustomer(String firstName, String LastName, String email) ( this.firstName = firstName; this.lastName = LastName; this.email = email; ) ümumi statik RequestCustomer fromRequestParameters(HttpServletRequest sorğu) ( yeni RequestCustomer(request.getParameter("ad"), request.getParameter("soyad"), request.getParameter("e-poçt")) qaytarın); ) ictimai etibarsız setAsRequestsRequest(RequestCustomer) ( request.setAttribute("ad", firstName); request.setAttribute("soyad", soyad); request.setAttribute("email", email); ) ictimai Siyahı doğrulayın() ( Siyahı pozuntuları = yeni ArrayList<>(); əgər (!StringValidator.validate(firstName)) ( violations.add("Ad tələb olunan sahədir"); ) if (!StringValidator.validate(soyad)) ( violations.add("Soyad tələb olunan sahədir") ; ) əgər ( !EmailValidator.validate(email)) ( violations.add("E-poçt yaxşı formalaşdırılmalıdır"); ) pozuntuları qaytarın; )))
Burada diqqət çəkən ilk şey @WebServlet(name ="CustomerController", urlPatterns = "/processcustomer") annotasiyasının istifadəsidir. O, servlet konteynerinə /processcustomer-a HTTP sorğularını idarə etmək üçün CustomerController sinfindən istifadə etməyi bildirir. Eyni effekti web.xml kimi servlet xəritələşdirmə direktivləri əlavə etməklə əldə etmək olar, lakin biz Servlet Spesifikasiyası 3.1-dən istifadə etdiyimiz üçün bu üsula müraciət etməyimiz lazım deyil.
Servlet sinfinin adını @WebServlet annotasiyasının ad atributunun dəyəri kimi istifadə etmək yaxşı təcrübə hesab edildiyi üçün burada biz servletə CustomerController adını verdik. Əks halda, bəzi konteynerlər uyğun gəlməyəcək və nəticədə 404 xətası yaranacaq.
CustomerController sinfi özü bir neçə sadə işi yerinə yetirir. Birincisi, o, formanın adı, soyadı və e-poçt sahələrinə uyğun gələn dəyərləri ehtiva edən HttpServletRequest interfeysinin tətbiqindən istifadə edərək forma daxiletməsini toplayır. Sonra həmin dəyərləri sorğu atributları kimi təyin edir ki, onlar ya formada, ya da nəticələr səhifəsində yenidən göstərilə bilsinlər. Nəhayət, validatorlar daxil edilmiş məlumatların düzgünlüyünü yoxlayırlar.
Validatorlar sətirin boş olub-olmaması və ya e-poçtun e-poçt kimi görünməsi kimi müəyyən xüsusiyyətləri yoxlayan sadə siniflərdir. Müəllifin GitLab-da onların həyata keçirilməsini görə bilərsiniz.
Doğrulama nəticəsi hadisələrin sonrakı gedişatına təsir göstərir: əgər məlumat etibarlı deyilsə, müştəri RequestDispatcher obyekti vasitəsilə müvafiq səhvlərin göstərildiyi qeydiyyat səhifəsinə yönləndirilir. Hər şey qaydasındadırsa, salamlama səhifəsi göstərilir.
Beləliklə, biz HTML forması, əsas servlet və bir neçə JSP faylından istifadə edərək müştəriləri qeydiyyatdan keçirməyə imkan verən tam Java veb proqramı yaratdıq. Onu işə salmağın vaxtıdır.
Tətbiqin işə salınması
Tətbiqi işə salmaq üçün aşağıdakı addımları yerinə yetirməlisiniz:
IntelliJ IDEA). Layihəni yerləşdirib işə saldığınız zaman standart brauzer giriş pəncərəsi ilə işə başlamalıdır.
Nəticə
Beləliklə, siz mürəkkəb çərçivələrə müraciət etmədən öz Java veb proqramınızı yaratmaq üçün lazım olan bütün bacarıqları əldə etdiniz. Sizə lazım olan tək şey Servlet API, göstərmə üçün JSP kimi texnologiya və daxili Java imkanlarıdır. Əladır, elə deyilmi?
Qeyd etmək lazımdır ki, CustomerController sinfinin tətbiqi servletlərin üstünlüklərini və çatışmazlıqlarını vurğulayır: bir tərəfdən, sorğu parametrlərini emal etməyin və müştəriyə müxtəlif formatlarda cavab göndərməyin nə qədər asan olduğunu qısaca göstərir. Lakin bu funksionallıq bir qiymətə gəlir: HttpServletResponse və HttpServletResponse interfeyslərinin hər iki tətbiqi adi xidmət lokatorlarıdır. Bu, bunun pis olduğunu söyləmək deyil, çünki lokatorlar sadəcə məlumatları ehtiva edir. Bununla belə, unutmayın ki, bu tətbiqlər həmişə servletə bağlanacaq.
Servlet nümunəsinə HelloWorld.java servletinin özü və web.xml proqram deskriptoru daxildir. Servlet sizə kiril əlifbasından istifadə edərək cavab səhifəsi yaratmağa imkan verir. Eclipse IDE-də servlet nümunəsinin strukturu aşağıdakı ekran görüntüsündə göstərilir.
HelloWorld.java servlet nümunəsinin siyahısı
Aşağıdakı kod sadə bir servlet tətbiq edir HelloWorld.java, brauzerə statik HTML səhifəsini qaytarır. Nümunədə servlet interfeysi həyata keçirən HttpServlet xassələrini miras alır. Servlet.
java.io.IOException idxalı; java.io.OutputStream idxalı; javax.servlet.ServletConfig idxalı; import javax.servlet.http.HttpServlet; javax.servlet.ServletException import; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; ictimai sinif HelloWorld genişləndirir HttpServlet ( şəxsi ServletConfig konfiqurasiyası; @Override public void init (ServletConfig config) ServletException atır ( this.config = config; ) @Override public void destroy() () @override public ServletConfig config () @Override public String getServletInfo() ( "Sadə Servlet" qaytarın; ) ictimai etibarsız xidmət (HttpServletRequest sorğusu, HttpServletResponse cavabı) ServletException, IOException (answer.setContentType("text/html") atır; String text = " " + "
" + " " + "Salam %s %s!
" + ""; mətn = String.format(mətn, config.getInitParameter("ad"), config.getInitParameter("mname")); OutputStream outStream = respond.getOutputStream(); outStream.write(text.getBytes(" UTF-8")); outStream.flush(); outStream.close(); ) )Servletə daxil olarkən metod çağırılır xidmət, cavab səhifəsini göstərən və onu HttpServletResponse vasitəsilə brauzerə göndərir. Başlıq server cavabının ilk sətirlərində müəyyən edilir məzmun növü UTF-8 kodlaması ilə. Əlavə olaraq, web.xml proqram deskriptorundan alınan ad və ata adı cavab şablonunda əvəz olunur. Yəni servlet konfiqurasiya parametrləri oxunur.
Kiril əlifbası ilə səhifəni qaytara bilmək üçün istifadə edin Çıxış axını. İstənilən məlumat çıxış axınına verilə bilər (bizim nümunəmizdə sadə HTML kodu).
Proqram təsviri siyahısı web.xml
Tətbiq deskriptorunda web.xml servlet parametrləri (ad servlet-adı və sinif servlet-sinif) və başlanğıc parametrləri (ad adı, ata adı mname) müəyyən edilir. Servlet istifadə edərək bu parametrləri oxuyur ServletConfig.
Servlet nümunəsini Eclipse IDE-dən işə salmaq üçün siz proqram serverini işə salmalı və brauzerinizin ünvan çubuğuna aşağıdakı sətri daxil etməlisiniz:
http://localhost:8080/ServletHello/hello
Brauzer bizə İlf və Petrovun əsərlərinin əsas xarakterini göstərən bir təbrik göstərəcək.
![](https://i0.wp.com/java-online.ru/images/web/servlet-example2.png)
Servletin ayrıca tərtib edilməsi üçün Windows üçün mətni belə görünə bilən toplu iş faylından istifadə edə bilərsiniz.
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
Servleti tərtib etdikdən sonra Salam Dünya sinifi qovluğuna yerləşdirilməlidir WEB-INF/dərslər/ Tomcat serverində WEB proqramları və paylama deskriptorunda qeydiyyatdan keçin web.xml.
Nümunə yükləyin
Səhifənin mətnində müzakirə olunan servlet nümunəsi üçün mənbə kodu mövcuddur (191 Kb).
Diaqramlarla səhifəni dinamik şəkildə yaratmaq üçün Chart.js qrafik kitabxanasından istifadə edən servlet nümunəsinə baxmaq olar.