JavaRush /Blog Jawa /Random-JV /Aplikasi web ing Jawa
Viacheslav
tingkat

Aplikasi web ing Jawa

Diterbitake ing grup
Aplikasi web ing Jawa - 1

Pambuka

Jaman biyen, Jawa nguatake posisi amarga milih aplikasi web minangka prioritas. Wiwit jaman rumiyin, Tanah Jawi sampun mbudidaya madosi caranipun. Kaping pisanan, aku nyaranake applet. Iki wis nyedhiyakake akeh kesempatan kanggo pangembang kanggo nggawe konten dinamis (isi) ing kaca HTML statis. Nanging, applet ora cocog karo pangarepan amarga akeh alasan: keamanan, overhead, lan liya-liyane. Banjur pangembang basa Jawa ngusulake alternatif - Servlet API . Lan dadi keputusan sing bener. Servlet API minangka spesifikasi kanggo aplikasi web Java apa wae sing dibangun, dadi aplikasi basis web utawa layanan web sing ngasilake informasi kaya sing dijaluk. Mula, dalan kanggo mangerteni cara kerja aplikasi web Java diwiwiti kanthi mangerteni Servlet API.
Aplikasi web ing Jawa - 2

Servlet API

Dadi, Servlet API yaiku apa sing ditawakake pangembang basa marang pangembang Jawa. Servlet API minangka spesifikasi sing kudu njawab pitakonan utama kita. Sampeyan bisa nemokake ing kene: " JSR-000340 JavaTM Servlet 3.1 Rilis Akhir kanggo Evaluasi ". Bab " 1.1 Apa Servlet? " ujar manawa servlet minangka komponen web adhedhasar teknologi Jawa sing nggawe konten dinamis (yaiku konten). "Based Java" tegese servlet minangka kelas Java sing dikompilasi dadi bytecode . Servlet dikelola dening wadhah servlet, kadhangkala disebut Mesin Servlet. Wadah servlet minangka ekstensi server web sing nyedhiyakake fungsi servlet. Sabanjure, servlets nyedhiyakake interaksi karo klien ing paradigma panyuwunan / respon, sing ditindakake dening wadhah servlet. Ing bab " 1.2 Apa Wadah Servlet? " Disebutake manawa wadhah servlet minangka bagean saka server web utawa server aplikasi sing nyedhiyakake layanan jaringan sing dikirimake panjaluk lan tanggapan, panjaluk lan tanggapan adhedhasar MIME digawe lan diproses. . Kajaba iku, wadhah servlet ngatur siklus urip servlets (yaiku mutusake kapan nggawe, mbusak, lsp.). Kabeh wadhah servlet kudu ndhukung protokol HTTP kanggo nampa panjalukan lan ngirim respon. Ing kene aku pengin nambahake yen MIME minangka standar, spesifikasi sing ngandhani carane informasi kudu dikode lan pesen diformat supaya bisa dikirim liwat Internet.
Aplikasi web ing Jawa - 3

Web-server

Server web minangka server sing nampa panjalukan HTTP saka klien lan menehi respon HTTP (biasane bebarengan karo kaca HTML, gambar, file, utawa data liyane). Sumber daya sing dijaluk diidentifikasi dening URL. Salah sawijining server web sing paling populer kanthi dhukungan Servlet API yaiku Apache Tomcat . Umume server web minangka mesin kompleks sing digawe saka macem-macem komponen, sing saben-saben nindakake fungsi tartamtu. Tuladhane:
Aplikasi web ing Jawa - 4

Konektor

- Ing input kita duwe Konektor (i.e. konektor) sing nampa panjalukan mlebu saka klien. Konektor HTTP ing Tomcat diimplementasikake nggunakake komponen "Coyote". Konektor nampa data saka klien lan ngirim menyang Tomcat Engine. Kontainer Servlet - Mesin Tomcat, kanthi cara, ngolah panjaluk sing ditampa saka klien nggunakake komponen "Catalina", yaiku wadhah servlet. Deleng dokumentasi Tomcat: " Ringkesan Arsitektur " kanggo rincian liyane. Ana server web liyane sing ndhukung spesifikasi Servlet API. Contone, " Jetty " utawa " Undertow ". Arsitekture padha, supaya ngerti prinsip nggarap siji wadhah servlet, sampeyan bisa ngalih kanggo nggarap liyane.
Aplikasi web ing Jawa - 5

Aplikasi Web

Dadi, supaya kita bisa mbukak aplikasi web, kita butuh server web sing ndhukung API Servlet (yaiku, sing duwe komponen ekstensi sing ngetrapake dhukungan Servlet API kanggo server web). nggih. Apa iku aplikasi web? Miturut bab " 10 Aplikasi Web " saka spesifikasi Servlet API, aplikasi Web minangka kumpulan servlet, kaca HTML, kelas, lan sumber daya liyane sing nggawe aplikasi pungkasan ing server Web. Miturut bab " 10.6 File Arsip Aplikasi Web ", aplikasi web bisa dikemas ing Web ARchive (arsip kanthi ekstensi WAR). Kaya sing kasebut ing kaca " Glosarium-219 ":
Aplikasi web ing Jawa - 6
Sing, WAR digawe tinimbang JAR kanggo nuduhake yen iki aplikasi web. Kasunyatan penting sabanjure: kita kudu duwe struktur direktori tartamtu ing arsip WAR. Ing spesifikasi API Servlet ing bab " 10.5 Struktur Direktori ". Bab iki nyatakake yen ana direktori khusus sing disebut "WEB-INF". Direktori iki khusus amarga ora katon ing klien lan ora ditampilake langsung, nanging bisa diakses kode servlet. Uga ujar manawa direktori WEB-INF bisa ngemot:
Aplikasi web ing Jawa - 7
Saka dhaptar kabeh iki, saiki kita ora ngerti lan ora ngerti item babagan sawetara file web.xml sing diarani deployment descriptor . Opo kuwi? Bab " 14. Deskriptor Deployment " dikhususake kanggo deskriptor penyebaran. Singkatipun, deskriptor penyebaran minangka file xml sing nerangake carane nyebarake (yaiku, mbukak) aplikasi web kita ing server web. Contone, deskriptor penyebaran nuduhake URL endi sing kudu digunakake kanggo ngakses aplikasi kita, setelan keamanan sing ana gandhengane karo aplikasi kita, lsp. Bab " 14.2 Aturan kanggo Ngolah Panyebaran " ujar manawa sadurunge aplikasi kita dikonfigurasi lan diluncurake, web.xml bakal divalidasi miturut skema (yaiku, mriksa bakal ditindakake manawa isi web.xml ditulis kanthi bener miturut skema kasebut. menyang skema). Lan ing bab " 14.3 Deskriptor Deployment " dituduhake yen diagram kasebut ana ing kene: http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd Yen kita ndeleng isi file kasebut, kita bisa ndeleng:
Aplikasi web ing Jawa - 8
Apa skema sing digunakake kanggo file XML? Skema kasebut nuduhake cara ngisi dokumen XML kanthi bener: unsur apa sing bisa digunakake, jinis data apa sing bisa ditemtokake ing unsur kasebut, miturut urutan unsur sing kudu ditindakake, unsur apa sing dibutuhake, lsp. Sampeyan bisa mbandhingake skema dokumen XML karo antarmuka ing Jawa, amarga skema ing Jawa uga nemtokake carane kelas sing gawe marem antarmuka tartamtu (yaiku, sing ngleksanakake antarmuka tartamtu) kudu ditulis. Dadi, kita bersenjata karo kawruh rahasia lan siyap nggawe aplikasi web pertama!
Aplikasi Web ing Jawa - 9

Nggawe Aplikasi Web

Pancen angel mbayangno nggarap aplikasi Java modern tanpa nggunakake sistem mbangun proyek otomatis. Sawetara sistem sing paling populer yaiku Maven lan Gradle . Kita bakal nggunakake Gradle kanggo review iki. Instalasi Gradle diterangake ing situs web resmi . Kanggo nggawe aplikasi anyar, kita butuh plugin sing dibangun ing Gradle: " Mbangun Plugin Init ". Kanggo nggawe aplikasi Java sampeyan kudu mbukak printah ing ngisor iki: gradle init --type java-application
Aplikasi web ing Jawa - 10
Sawise nggawe proyek, kita kudu ngowahi file build.gradle . Iki sing diarani Build Script (kanggo rincian liyane, deleng dokumentasi Gradle: " Nulis Build Scripts "). Berkas iki njlèntrèhaké cara ngrakit proyèk lan aspèk liya kanggo nggarap proyèk Jawa. Blok plugins nerangake " Plugin Gradle " sing kudu digunakake kanggo proyek Gradle saiki. Plugins nggedhekake kemampuan proyek kita. Contone, plugin standar yaiku " java ". Plugin iki tansah digunakake yen kita butuh dhukungan Jawa. Nanging kita ora butuh plugin " aplikasi ", amarga ... deskripsi kasebut nyatakake yen digunakake kanggo nggawe "aplikasi JVM sing bisa dieksekusi", yaiku. mbukak aplikasi JVM. Kita kudu nggawe aplikasi Web ing wangun arsip WAR. Lan yen kita nggoleki tembung WAR ing dokumentasi Gradle, kita bakal nemokake " Perang Plugin ". Dadi, kita bakal nemtokake plugin ing ngisor iki:
plugins {
    id 'java'
    id 'war'
}
Uga ing " War Plugin Default Settings " dikandhakake yen direktori kanthi kabeh isi aplikasi web kudu "src/main/webapp", kudu ana direktori WEB-INF sing padha karo web.xml. dumunung. Ayo nggawe file kaya ngono. Kita bakal ngisi sethithik mengko, amarga ... kita durung duwe informasi sing cukup kanggo iki. Ing blok "dependensi" kita nuduhake dependensi proyek kita, yaiku perpustakaan / kerangka kerja sing tanpa aplikasi ora bisa digunakake. Ing kasus iki, kita nulis aplikasi web, tegese ora bisa digunakake tanpa API Servlet:
dependencies {
    providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
    testCompile 'junit:junit:4.12'
}
kasedhiyaCompile tegese ketergantungan ora perlu dilebokake ing arsip WAR saka aplikasi web: mung dibutuhake kanggo kompilasi. Lan nalika dieksekusi, ketergantungan iki bakal diwenehake dening wong liya (yaiku, server web). Ya, kita ninggalake informasi ing skrip mbangun babagan repositori dependensi sing arep digunakake - kabeh dependensi sing ditemtokake bakal diundhuh saka iku:
repositories {
    jcenter()
}
Kita mbusak kabeh liyane saka file script mbangun. Saiki ayo ngowahi kelas src\main\java\App.java. Ayo nggawe servlet saka iku. Spesifikasi Servlet API ing bab " BAB 2. Antarmuka Servlet " nyatakake yen Antarmuka Servlet nduweni implementasi dhasar saka HttpServlet , sing mesthine cukup ing pirang-pirang kasus lan pangembang mung kudu oleh warisan. Lan ing bab " 2.1.1 Metode Penanganan Permintaan Khusus HTTP " cara utama sing ngolah panjaluk sing mlebu dituduhake. Dadi, ayo nulis ulang kelas App.java:
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 {
 		// https://www.oracle.com/technetwork/java/servlet-142430.html
 		PrintWriter out = resp.getWriter();
 		out.println(this.getGreeting());
 		out.close();
 	}
}
Dadi, kita katon wis siap kabeh. Sing isih ana yaiku nulis deskriptor penyebaran kanthi bener. Saka diagram, salin teks ing ngisor iki menyang web.xml:
<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>
Lan uga path menyang skema sing dituduhake ing: http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd Saiki ayo goleki conto apa web.xml kudu katon ing spesifikasi API Servlet. Conto iki diwenehi ing bab " 14.5.1 Conto Dasar ". Ayo gabungke apa sing dituduhake ing diagram karo conto sing dituduhake ing spesifikasi. Kita entuk ing ngisor iki:
<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>
Kaya sing sampeyan ngerteni, kita nggunakake skema lan schemaLocation sing wis ditemtokake sadurunge. Dene andharan ngenani unsur kasebut dhewe dijupuk saka tuladha saka Bab 14.5.1. Yen kita nindakake kabeh kanthi bener, kita bakal nglakokake tugas perang gradle tanpa kesalahan:
Aplikasi web ing Jawa - 11
Aplikasi web ing Jawa - 12

Nguripake aplikasi web

Kepiye carane aplikasi web diluncurake? Ayo dadi menehi hasil karo pilihan sing luwih rumit dhisik. Kita sadurunge ujar manawa ana server web Apache Tomcat sing ndhukung API Servlet. Iki tegese kita bisa masang arsip perang sing diklumpukake (uga ujar "nyebar") ing server iki. Ing kaca " Download Tomcat ", download saka bagean "Distribusi Biner" jinis pangiriman "Inti" ing format zip. Lan unpack arsip sing diundhuh menyang sawetara direktori, contone ing C:\apache-tomcat-9.0.14. Sadurunge miwiti server, ayo mbukak file kanggo nyunting conf\tomcat-users.xmllan tambahake baris ing ngisor iki: <user username="tomcat" password="tomcat" roles="tomcat,manager-gui,admin-gui"/> Saiki, ing baris printah, pindhah menyang direktori bin lan jalanake catalina.bat start. Kanthi gawan, konsol server bakal kasedhiya ing http://localhost:8080/manager. Login lan tembung sandhi padha karo sing wis ditemtokake ing tomcat-users.xml. Tomcat nduweni direktori "webapps", sing ngemot aplikasi web. Yen kita pengin nyebarake dhewe, kita kudu nyalin arsip perang ing kana. Nalika sadurunge nglakokake perintah perang gradle, \build\libs\arsip perang digawe ing direktori kasebut. Iki sing kudu disalin. Sawise nyalin, refresh kaca http://localhost:8080/managerlan deleng:
Aplikasi web ing Jawa - 13
Sawise rampung http://localhost:8080/javaweb/app, kita bakal nguripake servlet kita, amarga Kita sadurunge "memetakan" (yaiku, dipetakan) panjalukan / app menyang servlet App. Ana cara sing luwih cepet kanggo mriksa cara aplikasi bisa digunakake. Lan sistem perakitan mbantu kita maneh. Ing skrip mbangun proyek Gradle kita, kita bisa nambah plugin anyar " Gretty " menyang bagean plugins: id "org.gretty" version "2.3.1" Lan saiki kita bisa nindakake tugas gradle kanggo mbukak aplikasi kita:gradle appRun
Aplikasi web ing Jawa - 14
Waca " Tambah plugin gretty lan mbukak app " kanggo rincian.
Aplikasi web ing Jawa - 15

Spring lan Servlet API

Servlets minangka basis saka kabeh. Lan malah Spring Framework sing saiki populer ora luwih saka tambahan kanggo Servlet API. Kanggo miwiti, Spring Framework minangka ketergantungan anyar kanggo proyek kita. Mulane, ayo ditambahake menyang skrip mbangun ing blok dependensi: compile 'org.springframework:spring-webmvc:5.1.3.RELEASE' Ing dokumentasi Spring Framework ana bab " 1.1. DispatcherServlet ". Ngandika yen Spring Framework dibangun ing pola "pengontrol ngarep" - iki nalika ana servlet tengah sing diarani " DispatcherServlet ". Kabeh panjaluk teka ing servlet iki, lan delegasi telpon menyang komponen sing dibutuhake. Sampeyan ndeleng, malah kene ana servlets. Sampeyan kudu nambah pamireng menyang deskriptor penyebaran:
<listener>
	&ltlistener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Iki minangka pamiyarsa acara konteks servlet. Yaiku, nalika Konteks Servlet diwiwiti, konteks Spring (WebApplicationContext) uga diwiwiti. Apa Konteks Servlet? Diterangake ing spesifikasi API Servle ing bab " BAB 4. Konteks Servlet ". Konteks servlet minangka "tampilan" servlet saka aplikasi web ing ngendi servlet lagi mlaku. Saben aplikasi web nduweni Konteks Servlet dhewe. Sabanjure, kanggo ngaktifake Spring Framework, sampeyan kudu nemtokake context-param - parameter initialization kanggo konteks servlet.
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/app-context.xml</param-value>
</context-param>
Lan definisi DispatcherServlet ngrampungake konfigurasi :
<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>
Lan saiki kita mung kudu ngisi file sing ditemtokake ing contextConfigLocation. Cara nindakake iki diterangake ing dokumentasi Spring Framework ing bab "1.3.1. Pranyatan":
<?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>
Penting ing kene ora mung kanggo nuduhake paket sing bakal dipindai, nanging uga pengin didorong anotasi, yaiku, kanggo ngontrol anotasi babagan carane Spring bakal bisa digunakake. Kabeh sing isih ana yaiku nggawe paket ru.javarush.javaweb lan nyelehake kelas pengontrol Spring ing:
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.";
    }
}
Saiki mlaku appRun gradle lan menyang alamat, http://127.0.0.1:8080/javaweb/appkita bakal entuk Hello World sing padha. Nalika sampeyan bisa ndeleng, Spring Framework raket intertwined karo Servlet API lan digunakake kanggo bisa ing ndhuwur iku.
Aplikasi web ing Jawa - 16

Anotasi

Kaya sing wis dingerteni, anotasi trep. Lan kita ora mung siji-sijine sing ngira. Mulane, ing spesifikasi API Servlet, diwiwiti karo versi 3.0, bab " BAB 8 Anotasi lan pluggability " muncul, sing nemtokake manawa kontaner servlet kudu ndhukung kemampuan kanggo nemtokake apa sing sadurunge kasebut ing Deskriptor Deployment liwat anotasi. Mangkono, web.xml bisa rampung dibusak saka project, lan ndhuwur kelas servlet sampeyan bisa nemtokake @WebServlet anotasi lan nunjukaké kang path kanggo map servlet kanggo. Kabeh katon jelas ing kene. Nanging kepiye yen kita nyambungake Spring menyang proyek kasebut, sing mbutuhake setelan sing luwih rumit? Ing kene kabeh luwih rumit. Kaping pisanan, dokumentasi Spring ujar manawa kanggo ngatur Spring tanpa web.xml, sampeyan kudu nggunakake kelas sampeyan dhewe sing bakal ngetrapake WebApplicationInitializer. Kanggo rincian liyane, ndeleng bab " 1.1. DispatcherServlet ". Pranyata iki kelas Spring. Kepiye carane Servlet API digunakake ing kene? Nyatane, ServletContainerInitializer ditambahake menyang Servlet API 3.0 . Nggunakake mekanisme khusus ing Jawa (disebut SPI ), Spring nemtokake servlet container initializer diarani SpringServletContainerInitializer. Sabanjure, iku wis katon kanggo implementasine saka WebApplicationInitializer lan nelpon cara sing perlu lan nindakake setelan sing perlu. Waca " Carane wadhah servlet nemokake implementasi WebApplicationInitializer " kanggo rincian liyane. Setelan ing ndhuwur bisa ditindakake kaya mangkene:
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);

        // настраиваем маппинг Dispatcher Servlet-а
        ServletRegistration.Dynamic servlet =
                servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
        servlet.addMapping("/");
        servlet.setLoadOnStartup(1);
    }
}
Saiki, nggunakake " konfigurasi basis Java " kita bakal nuduhake paket sing bakal dipindai + ngaktifake anotasi:
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 {
}
Lan SpringController dhewe dipindhah menyang ru.javarush.javaweb.controllers, supaya nalika mindhai, konfigurasi ora nemokake dhewe, nanging mung golek pengontrol.
Aplikasi web ing Jawa - 17

ngringkes

Muga-muga ringkesan iki bisa menehi katrangan babagan cara kerja aplikasi web ing Jawa. Iki mung pucuk gunung es, nanging tanpa ngerti dhasar, angel ngerti kepiye teknologi adhedhasar dhasar iki. Servlet API minangka bagean tengah saka aplikasi web Java, lan kita wis ndeleng kepiye kerangka kerja liyane cocog. Kanggo nerusake, sampeyan bisa ndeleng bahan ing ngisor iki: #Viacheslav
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION