Giriş
Bir zamanlar Java prioritet olaraq veb proqramları seçdiyi üçün öz mövqeyini möhkəmləndirdi. İlk günlərdən Java öz yolunu tapmaq üçün mübarizə aparır. Əvvəlcə appletləri təklif etdim. Bu, tərtibatçılara statik HTML səhifələrində dinamik məzmun yaratmaq üçün çoxlu imkanlar yaratdı. Bununla belə, appletlər bir çox səbəblərə görə gözləntiləri doğrultmadı: təhlükəsizlik, yerüstü xərclər və s. Sonra Java dilinin tərtibatçıları alternativ təklif etdilər -
Servlet API . Və düzgün qərar olduğu ortaya çıxdı.
Servlet API hər hansı bir Java veb proqramının qurulduğu spesifikasiyadır, istər veb-əsaslı proqram, istərsə də məlumatı tələb olunduğu kimi qaytaran veb xidməti. Buna görə də, Java veb proqramlarının necə işlədiyini başa düşməyin yolu Servlet API-ni anlamaqdan başlayır.
Servlet API
Beləliklə,
Servlet API dil tərtibatçılarının Java tərtibatçılarına təklif etdiyi şeydir. Servlet API əsas suallarımıza cavab verməli olan spesifikasiyadır. Siz onu burada tapa bilərsiniz: "
JSR-000340 JavaTM Servlet 3.1 Qiymətləndirmə üçün Yekun Reliz ".
" 1.1 Servlet nədir? " bölməsində deyilir ki, servlet dinamik məzmun (yəni məzmun) yaradan Java texnologiyasına əsaslanan
veb komponentidir . "Java əsaslı" o deməkdir ki,
servlet bayt koduna yığılmış Java sinfidir . Servletlər bəzən Servlet Mühərriki adlanan servlet konteyneri tərəfindən idarə olunur. Servlet konteyneri servlet funksionallığını təmin edən
veb server uzantısıdır . Öz növbəsində, servletlər servlet konteyneri tərəfindən həyata keçirilən sorğu/cavab paradiqmasında müştəri ilə qarşılıqlı əlaqəni təmin edir.
" 1.2 Servlet Konteyneri nədir? " bölməsində deyilir ki, servlet konteyneri sorğuların və cavabların göndərildiyi, MIME əsaslı sorğuların və cavabların yaradıldığı və işləndiyi şəbəkə xidmətlərini təmin edən
veb server və ya proqram serverinin bir hissəsidir. . Bundan əlavə, servlet konteynerləri servletlərin həyat dövrünü idarə edir (yəni onları nə vaxt yaratmağa, silməyə və s. qərar verin). Bütün servlet konteynerləri sorğuları qəbul etmək və cavab göndərmək üçün HTTP protokolunu dəstəkləməlidir. Burada əlavə etmək istərdim ki, MIME standartdır, məlumatın necə kodlaşdırılacağını və mesajların İnternet üzərindən göndərilə bilməsi üçün formatlaşdırılmasını izah edən spesifikasiyadır.
Veb-server
Veb server müştərilərdən HTTP sorğularını qəbul edən və onlara HTTP cavabları (adətən HTML səhifəsi, şəkil, fayl və ya digər məlumatlarla birlikdə) təmin edən serverdir. Tələb olunan resurslar URL-lər tərəfindən müəyyən edilir. Servlet API dəstəyi ilə ən məşhur veb serverlərdən biri
Apache Tomcat- dır . Əksər veb-serverlər hər biri xüsusi funksiyaları yerinə yetirən müxtəlif komponentlərdən ibarət mürəkkəb maşınlardır. Misal üçün:
Bağlayıcılar
— Girişdə müştərilərdən gələn sorğuları qəbul edən Bağlayıcılar (yəni birləşdiricilər) var. Tomcat-da HTTP konnektoru "Coyote" komponentindən istifadə etməklə həyata keçirilir. Bağlayıcılar müştəridən məlumatları alır və Tomcat Mühərrikinə ötürür.
Servlet Konteyneri - Tomcat Mühərriki öz növbəsində servlet konteyneri olan "Catalina" komponentindən istifadə edərək müştəridən alınan sorğunu emal edir. Daha ətraflı məlumat üçün Tomcat sənədlərinə baxın: "
Memarlığa İcmal ". Servlet API spesifikasiyasını dəstəkləyən digər veb serverlər var. Məsələn, "
Jetty " və ya "
Undertow ". Onların arxitekturası oxşardır, ona görə də bir servlet konteyneri ilə işləmə prinsipini başa düşərək, digəri ilə işləməyə keçə bilərsiniz.
Veb Tətbiq
Beləliklə, bir veb tətbiqini işlətməyimiz üçün bizə Servlet API-ni dəstəkləyən veb server lazımdır (yəni veb server üçün Servlet API dəstəyini həyata keçirən genişləndirmə komponenti olan). Yaxşı.
Hər halda veb tətbiqi nədir? Servlet API spesifikasiyasının "
10 Veb Tətbiqi " fəslinə əsasən ,
Veb tətbiqi Veb serverdə son tətbiqi təşkil edən servletlər, HTML səhifələri, siniflər və digər resurslar toplusudur.
" 10.6 Veb Tətbiq Arxiv Faylı " fəslinə uyğun olaraq veb proqram Web ARxivində (WAR genişləndirilməsi olan arxiv) paketlənə bilər.
“ Lüğət-219 ” səhifəsində deyildiyi kimi :
Yəni bunun veb proqram olduğunu göstərmək üçün JAR əvəzinə WAR edilir. Növbəti vacib fakt: Müharibə arxivimizdə müəyyən bir kataloq quruluşumuz olmalıdır.
Servlet API spesifikasiyasında " 10.5 Kataloq Strukturu " bölməsində . Bu fəsildə deyilir ki, “WEB-INF” adlı xüsusi kataloq mövcuddur. Bu kataloq xüsusidir ki, o, müştəriyə görünmür və birbaşa ona göstərilmir, lakin servlet kodu üçün əlçatandır. O, həmçinin WEB-INF qovluğunda nələri ehtiva edə biləcəyini söyləyir:
Bütün bu siyahıdan biz indi yerləşdirmə deskriptoru adlı bəzi
web.xml faylı haqqında elementi bilmirik və başa düşmürük . Bu nədir?
" 14. Yerləşdirmə Deskriptoru " bölməsi yerləşdirmə deskriptoruna həsr olunub. Qısaca desək,
yerləşdirmə deskriptoru veb tətbiqimizi veb serverdə necə yerləşdirməyi (yəni işlətməyi) təsvir edən xml faylıdır. Məsələn, yerləşdirmə deskriptoru tətbiqimizə daxil olmaq üçün hansı URL-lərin istifadə edilməli olduğunu göstərir, tətbiqimizə aid təhlükəsizlik parametrləri və s. göstərilir.
" 14.2 Yerləşdirmənin İşlənməsi Qaydaları " fəslində deyilir ki, tətbiqimiz konfiqurasiya edilməzdən və işə salınmazdan əvvəl web.xml sxemi təsdiqlənəcək (yəni web.xml məzmununun sxemə uyğun olaraq düzgün yazılması yoxlanılacaq) .
Və " 14.3 Deployment Descriptor " bölməsində diaqramın burada olduğu göstərilir: Faylın məzmununa baxsaq, görə bilərik:
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd
XML faylları üçün istifadə olunan sxem nədir? Sxemlər XML sənədinin necə düzgün doldurulacağını göstərir: hansı elementlərdən istifadə edilə bilər, elementlərdə hansı məlumat növü göstərilə bilər, elementlər hansı ardıcıllıqla getməlidir, hansı elementlər tələb olunur və s. Siz XML sənədinin sxemini Java-dakı interfeyslə müqayisə edə bilərsiniz, çünki Java-dakı sxem verilmiş interfeysi qane edən (yəni verilmiş interfeysi həyata keçirən) siniflərin necə yazılacağını da müəyyən edir. Beləliklə, biz gizli biliklərlə silahlanmışıq və ilk veb tətbiqimizi yaratmağa hazırıq!
Veb tətbiqinin yaradılması
Avtomatik layihə qurma sistemlərindən istifadə etmədən müasir Java proqramı ilə işləməyi təsəvvür etmək çətindir. Ən məşhur sistemlərdən bəziləri
Maven və Gradle- dir . Bu baxış üçün Gradle istifadə edəcəyik.
Gradle-nin quraşdırılması rəsmi internet saytında təsvir edilmişdir . Yeni proqram yaratmaq üçün bizə Gradle-da quraşdırılmış plaqinə ehtiyacımız var: "
Build Init Plugin ". Java proqramı yaratmaq üçün aşağıdakı əmri yerinə yetirməlisiniz:
gradle init --type java-application
Layihəni yaratdıqdan sonra build.gradle faylını redaktə etməliyik . Bu, Quraşdırma Skripti adlanır (daha ətraflı məlumat üçün Gradle sənədlərinə baxın: "
Quruluş Skriptlərinin Yazılması "). Bu fayl layihənin necə yığılacağını və Java layihəsi ilə işləməyin digər aspektlərini təsvir edir. Plaginlər bloku cari Gradle layihəsi üçün hansı "
Gradle plaginlərinin " istifadə edilməsini təsvir edir. Pluginlər layihəmizin imkanlarını genişləndirir. Məsələn, standart plagin "
java "dır. Java dəstəyinə ehtiyacımız olduqda bu plagin həmişə istifadə olunur. Amma bizə “
tətbiq ” plagininə ehtiyac yoxdur , çünki... onun təsvirində deyilir ki, o, "icra edilə bilən JVM tətbiqi" yaratmaq üçün istifadə olunur, yəni. JVM proqramlarını işlədir. Biz WAR arxivi formasında Web proqram yaratmalıyıq.
Əgər biz Gradle sənədlərində WAR sözünü axtarsaq, “ War Plugin ” i tapacağıq . Buna görə də, aşağıdakı plaginləri təyin edəcəyik:
plugins {
id 'java'
id 'war'
}
Həmçinin "
War Plugin Default Settings "də deyilir ki, veb tətbiqinin bütün məzmunu olan qovluq "src/main/webapp" olmalıdır, web.xml-nin olduğu eyni WEB-INF kataloqu olmalıdır. yerləşir. Gəlin belə bir fayl yaradaq. Bir az sonra dolduracağıq, çünki... bunun üçün hələ kifayət qədər məlumatımız yoxdur. "Asılılıqlar" blokunda layihəmizin asılılıqlarını, yəni proqramımızın işləyə bilməyəcəyi kitabxanaları/çərçivələri göstəririk. Bu halda biz veb proqram yazırıq, yəni Servlet API olmadan işləyə bilmərik:
dependencies {
providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
testCompile 'junit:junit:4.12'
}
provideCompile o deməkdir ki, asılılığın veb tətbiqinin WAR arxivimizə daxil edilməsinə ehtiyac yoxdur: o, yalnız tərtib üçün lazımdır. Və icra edildikdə, bu asılılıq başqası (yəni veb server) tərəfindən təmin ediləcəkdir. Yaxşı, biz qurma skriptində hansı asılılıq anbarından istifadə etmək istədiyimiz barədə məlumat buraxırıq - bütün göstərilən asılılıqlar ondan endiriləcək:
repositories {
jcenter()
}
Quraşdırma skript faylından qalan hər şeyi silirik. İndi src\main\java\App.java sinfini redaktə edək. Gəlin ondan servlet yaradaq.
" FƏSİL 2. Servlet İnterfeysi " bölməsindəki Servlet API spesifikasiyası Servlet İnterfeysinin
HttpServlet-in əsas tətbiqinə malik olduğunu bildirir və bu, əksər hallarda kifayət olmalıdır və tərtibatçılar sadəcə ondan miras almalıdırlar.
Və " 2.1.1 HTTP Xüsusi Sorğu İdarəetmə Metodları " bölməsində daxil olan sorğuları emal edən əsas üsullar göstərilmişdir. Beləliklə, App.java sinfini yenidən yazaq:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.io.IOException;
public class App extends HttpServlet {
public String getGreeting() {
return "Hello world.";
}
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = resp.getWriter();
out.println(this.getGreeting());
out.close();
}
}
Deməli, bizdə hər şey hazır görünür. Qalan şey yerləşdirmə deskriptorunu düzgün yazmaqdır. Diaqramdan aşağıdakı mətni web.xml-ə köçürün:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="..."
version="3.1">
...
</web-app>
Həm də orada göstərilən sxemə gedən yol:
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd
İndi web.xml-nin Servlet API spesifikasiyasında necə görünməsi nümunəsinə baxaq.
Bu nümunə " 14.5.1 Əsas Nümunə " bölməsində verilmişdir . Diaqramda göstərilənləri spesifikasiyada göstərilən nümunə ilə birləşdirək. Aşağıdakıları alırıq:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>A Simple Web Application</display-name>
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>App</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/app</url-pattern>
</servlet-mapping>
</web-app>
Gördüyünüz kimi, biz əvvəllər müəyyən edilmiş sxem və schemaLocation-dan istifadə etdik. Və elementlərin özlərinin təsviri 14.5.1-ci fəsildən nümunə götürülmüşdür. Hər şeyi düzgün etdiksə, qradle döyüş tapşırığını səhvsiz yerinə yetirəcəyik:
Veb tətbiqinin işə salınması
Veb tətbiqi necə işə salınır? Əvvəlcə daha mürəkkəb seçimlə məşğul olaq. Əvvəllər dedik ki, Servlet API-ni dəstəkləyən Apache Tomcat veb serveri var. Bu o deməkdir ki, toplanmış müharibə arxivimizi (onlar da “yerləşdir” deyirlər) bu serverdə yerləşdirə bilərik. "
Tomcat-ı yükləyin " səhifəsində "İkili Dağıtımlar" bölməsindən zip formatında "Core" çatdırılma növünü endirin. Və yüklənmiş arxivi bəzi qovluğa, məsələn, C:\apache-tomcat-9.0.14-ə açın. Serveri işə salmazdan əvvəl faylı redaktə etmək üçün açaq
conf\tomcat-users.xml
və ona aşağıdakı sətri əlavə edək:
<user username="tomcat" password="tomcat" roles="tomcat,manager-gui,admin-gui"/>
İndi əmr sətrində bin qovluğuna keçin və icra edin
catalina.bat start
. Varsayılan olaraq, server konsolu burada mövcud olacaq
http://localhost:8080/manager
. Loqin və parol tomcat-users.xml-də göstərdiyimiz eynidir. Tomcat-da veb proqramları ehtiva edən "webapps" kataloqu var. Özümüzünküləri yerləşdirmək istəyiriksə, müharibə arxivimizi oraya köçürməliyik. Əvvəllər gradle war əmrini işlətdiyimiz zaman
\build\libs\
kataloqda müharibə arxivi yaradıldı. Kopyalamamız lazım olan budur. Kopyaladıqdan sonra səhifəni yeniləyin
http://localhost:8080/manager
və baxın:
Tamamladıqdan sonra
http://localhost:8080/javaweb/app
servletimizə müraciət edəcəyik, çünki Biz əvvəllər /app sorğusunu Tətbiq servletinə “xəritə salmışıq” (yəni xəritələndirmişik). Tətbiqin necə işlədiyini yoxlamaq üçün daha sürətli bir yol var. Və montaj sistemi bu işdə bizə yenidən kömək edir. Gradle layihəmizin qurma skriptində biz plaginlər bölməsinə yeni "
Grettyid "org.gretty" version "2.3.1"
" plaqini əlavə edə bilərik: İndi isə tətbiqimizi işə salmaq üçün gradle tapşırığını yerinə yetirə bilərik:
gradle appRun
Ətraflı məlumat üçün "
Gretty plagini əlavə edin və proqramı işə salın " bölməsinə baxın.
Spring və Servlet API
Servletlər hər şeyin əsasını təşkil edir. Hətta indi populyar olan Spring Framework Servlet API-yə əlavədən başqa bir şey deyil. Başlamaq üçün,
Spring Framework layihəmiz üçün yeni bir asılılıqdır. Ona görə də onu asılılıqlar blokunda qurma skriptinə əlavə edək: Spring Framework sənədlərində "
1.1. DispatcherServletcompile 'org.springframework:spring-webmvc:5.1.3.RELEASE'
" fəsli var .
Burada deyilir ki, Spring Framework "ön nəzarətçi" nümunəsi üzərində qurulub - bu, " DispatcherServlet " adlı mərkəzi servletin olduğu zamandır . Bütün sorğular bu servletə gəlir və o, zəngləri lazımi komponentlərə ötürür. Baxırsınız, hətta burada servletlər var. Yerləşdirmə deskriptoruna dinləyici əlavə etməlisiniz:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Bu servlet kontekst hadisəsi dinləyicisidir. Yəni, Servlet Konteksti başlayanda Bahar konteksti (WebApplicationContext) də başlayır.
Servlet Konteksti nədir? Bu, Servle API spesifikasiyasında " FƏSİL 4. Servlet Konteksti " bölməsində təsvir edilmişdir . Servlet konteksti servletlərin işlədiyi veb proqrama servletin "görünüşüdür". Hər bir veb tətbiqinin öz Servlet Konteksti var. Sonra, Spring Framework-i aktivləşdirmək üçün kontekst-param - servlet konteksti üçün başlanğıc parametrini təyin etməlisiniz.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/app-context.xml</param-value>
</context-param>
DispatcherServlet tərifi konfiqurasiyanı tamamlayır :
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
İndi biz sadəcə contextConfigLocation-da göstərilən faylı doldurmalıyıq. Bunun necə ediləcəyi Bahar Çərçivə sənədlərində "1.3.1. Bəyannamə" fəslində təsvir edilmişdir:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="ru.javarush.javaweb"/>
<mvc:annotation-driven/>
</beans>
Burada təkcə hansı paketin skan ediləcəyini göstərmək deyil, həm də annotasiyaya əsaslanan, yəni Baharın necə işləyəcəyinə dair qeydlərə nəzarət etmək istədiyimizi göstərmək vacibdir. Yalnız ru.javarush.javaweb paketini yaratmaq və Spring kontroller sinfini orada yerləşdirmək qalır:
package ru.javarush.javaweb;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class SpringController {
@GetMapping("/app")
@ResponseBody
public String getGreeting() {
return "Hello world.";
}
}
İndi gradle appRun-u işə salıb ünvana gedərək,
http://127.0.0.1:8080/javaweb/app
eyni Salam Dünya alacağıq. Gördüyünüz kimi, Spring Framework Servlet API ilə sıx bağlıdır və onun üzərində işləmək üçün istifadə edir.
Annotasiyalar
Gördüyümüz kimi annotasiyalar rahatdır. Və belə düşünən tək biz deyildik. Buna görə də, Servlet API spesifikasiyasında, 3.0 versiyasından başlayaraq, “
FƏSİL 8 Annotasiyalar və qoşulma qabiliyyəti ” fəsli peyda oldu ki, bu da servlet konteynerlərinin əvvəllər Yerləşdirmə Deskriptorunda qeydlər vasitəsilə qeyd olunanları müəyyən etmək qabiliyyətini dəstəkləməli olduğunu müəyyən edir. Beləliklə, web.xml layihədən tamamilə çıxarıla bilər və servlet sinfinin üstündə
@WebServlet annotasiyasını təyin edə və servletin hansı yolu göstərəcəyini göstərə bilərsiniz. Burada hər şey aydın görünür. Bəs Baharı daha mürəkkəb parametrlər tələb edən layihəyə bağlasaq nə olacaq? Burada hər şey bir az daha mürəkkəbdir. Birincisi, Spring sənədlərində deyilir ki, Baharı web.xml olmadan konfiqurasiya etmək üçün WebApplicationInitializer tətbiq edəcək öz sinifinizdən istifadə etməlisiniz.
Ətraflı məlumat üçün " 1.1. DispatcherServlet " bölməsinə baxın . Məlum oldu ki, bu, Bahar dərsidir. Servlet API burada necə istifadə olunur? Əslində,
ServletContainerInitializer Servlet API 3.0-a əlavə edildi . Java-da xüsusi mexanizmdən (
SPI adlanır ) istifadə edərək, Spring özünün servlet konteynerinin başlatıcısını təyin edir
SpringServletContainerInitializer
. Öz növbəsində o, artıq WebApplicationInitializer tətbiqetmələrini axtarır və lazımi metodları çağırır və lazımi parametrləri yerinə yetirir. Ətraflı məlumat üçün "
Servlet konteyneri WebApplicationInitializer tətbiqlərini necə tapır " bölməsinə baxın. Yuxarıdakı parametrlər belə edilə bilər:
package ru.javarush.javaweb.config;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
public class AppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(AppConfig.class);
servletContext.addListener(new ContextLoaderListener(ctx));
ctx.setServletContext(servletContext);
ServletRegistration.Dynamic servlet =
servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
servlet.addMapping("/");
servlet.setLoadOnStartup(1);
}
}
İndi "
Java əsaslı konfiqurasiyadan " istifadə edərək hansı paketin skan ediləcəyini + annotasiyaları aktivləşdirəcəyini göstərəcəyik:
package ru.javarush.javaweb.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "ru.javarush.javaweb.controllers")
public class AppConfig {
}
ru.javarush.javaweb.controllers
SpringController özü isə skan zamanı konfiqurasiya özünü tapmaması, yalnız nəzarətçiləri axtarması üçün üzərinə köçürüldü .
Xülasə
Ümid edirəm ki, bu icmal Java-da veb proqramların necə işlədiyinə aydınlıq gətirdi. Bu, aysberqin sadəcə görünən hissəsidir, lakin əsasları dərk etmədən bu təmələ əsaslanan texnologiyaların necə işlədiyini başa düşmək çətindir. Servlet API istənilən Java veb tətbiqinin mərkəzi hissəsidir və biz digər çərçivələrin ona necə uyğunlaşdığını nəzərdən keçirdik. Davam etmək üçün aşağıdakı materiallara baxa bilərsiniz:
#Viaçeslav
GO TO FULL VERSION