Servlet - adalah Java-nporpaMMa yang menggunakan kelas HttpServiet. Servlet digunakan untuk memperluas kemampuan server yang ada, khususnya server Web. Biasanya, servlet berjalan di server khusus. Server ini disebut Server Aplikasi Java. Server aplikasi Java menyertakan server Web sebagai blok penyusun (terkadang bukan hanya satu, tetapi beberapa), serta server yang bekerja dengan komponen server, server untuk layanan tambahan, dll. Servlet berjalan di lingkungan yang disediakan oleh server. Bagian dari server yang didedikasikan untuk melayani servlet disebut wadah servlet. Spesifikasi servlet mengasumsikan bahwa kelas servlet memiliki metode standar yang dieksekusi di beberapa titik dalam siklus hidup servlet. Metode-metode ini dipanggil oleh wadah servlet. Implementasi spesifikasi servlet termasuk dalam set paket bahasa Java standar.
Buku ini berfokus pada server aplikasi Java bernama Blazix. Blazix Server menyediakan satu set lengkap kemampuan servlet. Selain membuat kelas servlet (atau kelas), serta mengonfigurasi program servlet yang dibuat dan menginstalnya di server, Anda perlu mengubah file konfigurasi server Web. Nilai utama ditentukan dalam file konfigurasi sebagai berikut: servlet.name: myservlet
servlet.myservlet.className: mypackage.MyServletClass servlet.myservlet.url: /mysrvlet
Setiap servlet harus memiliki nama(servlet.name), yang diidentifikasi di server. Nama ini digunakan untuk mengatur properti servlet, khususnya, untuk menunjukkan nama kelas tempat program servlet disimpan (baris berikutnya), serta alamat di mana servlet ini dipanggil (baris ketiga).
Klien meminta server Web untuk alamat di mana servlet berada (alamat harus ditentukan sebagai nilai servlet.myservlet.url dalam file konfigurasi server Web). Server meneruskan permintaan dan data (jika ada) ke servlet, menerima respons dari servlet, dan mengirimkannya ke klien.
Pada penjelasan tentang apa itu servlet, orang bisa menyelesaikannya. Namun, ada banyak detail menarik dan bermanfaat yang harus Anda perhatikan dan pelajari lebih detail.
Sangat penting untuk diingat bahwa jalur kelas servlet harus ditentukan dalam variabel ciasspath, atau dapat ditempatkan di direktori C:\Blazix\classes atau di direktori yang ditentukan dalam file konfigurasi server Web sebagai nilai server.ciassDir. Setelah file konfigurasi dimodifikasi untuk menyertakan informasi tentang servlet baru, server harus dihentikan dan dimulai ulang. Servlet juga dapat dihosting di server yang sedang berjalan menggunakan utilitas administrasi, tetapi untuk melakukannya, servlet harus dikemas dalam file arsip Web WAR. Jika file kelas servlet telah berubah, tidak perlu menghentikan server dan memulainya lagi. Secara default, server dikonfigurasi sehingga memanggil servlet di http://localhost:81/_reload menyebabkan semua kelas dimuat ulang dan kelas servlet yang dimodifikasi tersedia untuk permintaan klien (Gambar 4-1). Kunjungi halaman ini setelah file kelas servlet telah dimodifikasi. Menghentikan server sama sekali tidak perlu.
Jika pembaca sudah memiliki pengalaman dengan servlet, mereka akan menghargai kesederhanaan server Blazix dibandingkan dengan server Java lainnya, seperti server Tomcat.
Untuk langsung terjun ke bisnis, pertimbangkan contoh sederhana, sebuah servlet beberapa Servlet (daftar 4.1).
Daftar 4.1. Servlet SomeServlet.java I
impor java.io.*; import javax.servlet.*; impor javax.servlet.http.*;
kelas publik SomeServlet memperluas HttpServlet ( public void doGet(permintaan HttpServletRequest,
Respons HttpServletResponse) melempar ServletException, IOException ( Printwriter out = response.getWriter(); out.println("Hello World");
Di file konfigurasi server web, tulis yang berikut ini:
servlet.nama: pertama
servlet.first.className: SomeServlet
servlet.first.url: /dofirst
Kemudian panggilan ke servlet dari browser akan berbentuk http://localhost:81 /dofirst (Gambar 4.2).
Servlet Java menyediakan metode platform-independen untuk membangun aplikasi Web (ini tidak pasti, tetapi kami tidak akan menggali lebih jauh tentang subjek ini, karena dengan demikian kami perlu mendefinisikan apa yang dimaksud dengan aplikasi Web, yang tidak termasuk dalam daftar topik yang dibahas), dan banyak aplikasi yang bekerja dengan cepat dan tidak memiliki batasan aplikasi CGI. Servlet berjalan di bawah server Web dan, tidak seperti applet, tidak memerlukan antarmuka pengguna grafis. Servlet berkomunikasi dengan server dengan bertukar permintaan dan respons dengannya. Program klien membuat permintaan ke server. Permintaan diproses oleh server, diteruskan ke servlet, servlet mengirimkan respons melalui server ke klien. Servlet sangat populer saat ini untuk membangun aplikasi Web interaktif. Ada banyak Web server yang dapat bekerja dengan servlet, seperti Tomcat, iPlanet Web Server (sebelumnya Netscape
Server Perusahaan), Blazix. J Builder Enterprise menggunakan Borland Enterprise Server (BES) yang disertakan dengan paket dan juga dukungan server web Logika, WebSphere dan iPlanet. J Builder Enterprise Server menyertakan server Tomcat yang digunakan "secara default".
Beras. 4.2. Memanggil servlet
Salah satu keuntungan penting dari servlet adalah kecepatannya. Tidak seperti aplikasi CGI, servlet hanya dimuat ke dalam memori satu kali dan kemudian dieksekusi langsung dari memori. Servlet pada dasarnya adalah aplikasi multi-utas. Selain itu, mereka bebas platform, karena ditulis dalam Java.
teknologi JSP yang bab 3, merupakan perpanjangan dari teknologi servlet, di JSP Perhatian khusus berfokus pada bekerja dengan dokumen HTML dan XML. Sebagai bagian dari kode HTML dan XML, fragmen JSP paling sering digunakan. Bagaimana cara membuat pilihan dan memutuskan apa yang akan digunakan: servlet atau halaman server? Servlet lebih cocok untuk menyelesaikan tugas pemrograman tingkat rendah dan kurang cocok untuk menyelesaikan tugas membuat logika presentasi aplikasi. JSP sisi server, di sisi lain, terutama berfokus pada cara menyajikan hasil kepada pengguna dengan cara yang paling nyaman. Halaman server dibuat sejajar dengan kode HTML menggunakan gaya penulisan dokumen HTML. Teknologi JSP menyediakan fitur yang jauh lebih kaya daripada HTML biasa. JSP dapat memberikan kemampuan untuk mengimplementasikan logika aplikasi menggunakan kacang Java sederhana serta EJB sisi server dengan membuat pustaka pintasan khusus. Sendiri, halaman server Java dapat berupa komponen modular dan dapat digunakan kembali yang bekerja dengan logika presentasi yang dapat digunakan bersama dengan berbagai templat dan filter. JSP dikonversi menjadi servlet, jadi secara teoritis Anda hanya dapat menggunakan servlet. Namun, teknologi JSP didesain untuk menyederhanakan proses pembuatan dokumen Web dengan memisahkan logika presentasi aplikasi dari konten dokumen. Dalam kebanyakan kasus, respons yang dikirim ke klien terdiri dari template presentasi dokumen dan data yang dibuat secara otomatis dengan mengisi template. Dalam situasi ini, JSP jauh lebih mudah digunakan daripada servlet.
Salah satu fitur yang paling menyenangkan dari Java adalah sifatnya yang multifaset. Tentu saja pembuatan desktop tradisional dan bahkan aplikasi seluler- ini keren. Tetapi bagaimana jika Anda ingin keluar jalur dan memasuki wilayah pengembangan web Java? Untukmu disana kabar baik: Bahasa ini dilengkapi dengan Servlet API lengkap yang memungkinkan Anda membangun aplikasi web yang tangguh tanpa terlalu banyak kerumitan.
Membangun Aplikasi Java dengan Servlet
Jadi, kami telah membuat file konfigurasi aplikasi. Namun, dalam kondisi saat ini, secara harfiah tidak melakukan apa-apa. Kami ingin klien dapat mendaftar dengan formulir HTML, jadi hal selanjutnya yang perlu kami lakukan adalah membuat file JSP yang akan menampilkan formulir di atas dan detail klien setelah pendaftaran berhasil. Inilah yang akan kita lakukan sekarang.
Bekerja pada tampilan
Penampilan aplikasi akan ditentukan oleh dua file JSP - dalam konteks MVC disebut tampilan. Yang pertama akan bertanggung jawab untuk menampilkan formulir pendaftaran dan kemungkinan kesalahan dipanggil setelah memvalidasi data yang dimasukkan. Yang kedua akan menjadi halaman selamat datang normal yang akan menampilkan data yang dimasukkan oleh pelanggan setelah proses pendaftaran berhasil diselesaikan.
Ini adalah file JSP pertama:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Registrasi
$(pelanggaran).
File tersebut berisi HTML sederhana dengan beberapa tambahan. Itulah keindahan JSP yang dipadukan dengan JSTL dan JEL. Perhatikan betapa mudahnya memeriksa kesalahan validasi menggunakan tag standar seperti<с:if>dan
Atribut tindakan formulir pendaftaran mengarah ke URL berikut: $(pageContext.request.contextPath)/processcustomer . Ini berarti bahwa setiap kali klien mencoba mendaftar, data akan dikirim ke pelanggan proses terlepas dari URL tempat formulir tersedia. Ini dicapai melalui fungsionalitas objek yang tersedia dari file JSP, seperti request .
Kita akan segera melihat bagaimana servlet mengikat URL processcustomer dan bagaimana berinteraksi dengan input. Untuk saat ini, mari kita lihat file JSP yang bertanggung jawab atas halaman selamat datang:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Terima kasih telah mendaftar!
Data yang Anda masukkan:
Nama:$(nama depan)
Nama keluarga:$(nama belakang)
Surel:$(email)
Sekarang kita telah berurusan dengan halaman rendering, langkah selanjutnya adalah membuat servlet yang bertanggung jawab untuk mengumpulkan data klien dari permintaan POST dan memvalidasi data dengan cara yang sederhana.
Kami menulis pengontrol
Menulis servlet yang dapat menerima data dari formulir pendaftaran semudah mengupas buah pir. Yang perlu kita lakukan hanyalah menulis subkelas dari kelas HttpServlet dan mengimplementasikan metode doGet() atau doPost() (atau keduanya jika diperlukan). Dalam hal ini, servlet akan berinteraksi dengan data yang berasal dari permintaan POST.
Berikut tampilannya:
@WebServlet(nama = "CustomerController", urlPatterns = "/processcustomer") kelas publik CustomerController memperluas HttpServlet ( @Override protected void doPost(permintaan HttpServletRequest, respons HttpServletResponse) melempar ServletException, IOException ( RequestCustomer pelanggan = RequestCustomer.fromRequestParameters(permintaan); pelanggan .setAsRequestAttributes(request); Daftar pelanggaran = customer.validate(); if (!violations.isEmpty()) ( request.setAttribute("violations", pelanggaran); ) String url = defineUrl(violations); request.getRequestDispatcher(url .forward(request, response); ) private String determinUrl(Daftar pelanggaran) ( if (!violations.isEmpty()) ( return "/"; ) else ( return "/WEB-INF/views/customerinfo.jsp"; ) ) kelas statis pribadi RequestCustomer ( Private final String firstName; private final String lastName; email Private final String; Private RequestCustomer(String firstName, String lastName, String email) ( this.firstName = firstName; th is.lastName = nama belakang; this.email = surel; ) PermintaanPelanggan statis publik dariRequestParameters(permintaan HttpServletRequest) ( mengembalikan RequestCustomer baru(request.getParameter("nama depan"), request.getParameter("nama belakang"), request.getParameter("email")); ) public void setAsRequestAttributes(permintaan HttpServletRequest) ( request.setAttribute("firstname", firstName); request.setAttribute("lastname", lastName); request.setAttribute("email", email); ) Public Listvalidasi() ( Daftar pelanggaran = new ArrayList<>(); if (!StringValidator.validate(firstName)) ( pelanggaran.tambahkan("Nama depan adalah bidang yang wajib diisi"); ) if (!StringValidator.validate(nama belakang)) ( pelanggaran.tambahkan("Nama belakang adalah bidang yang wajib diisi") ; ) if ( !EmailValidator.validate(email)) ( pelanggaran.tambahkan("Email harus dibentuk dengan baik"); ) kembalikan pelanggaran; ) ) )
Hal pertama yang diperhatikan di sini adalah penggunaan anotasi @WebServlet(name ="CustomerController", urlPatterns = "/processcustomer"). Ini memberi tahu wadah servlet untuk menggunakan kelas CustomerController untuk menangani permintaan HTTP ke /processcustomer . Efek yang sama dapat dicapai dengan menambahkan arahan pemetaan servlet ke web.xml like , tetapi karena kita menggunakan Servlet Specification 3.1 kita tidak perlu menggunakan metode ini.
Di sini kami menamai servlet CustomerController karena dianggap sebagai praktik yang baik untuk menggunakan nama kelas servlet sebagai nilai atribut name dari anotasi @WebServlet. Jika tidak, beberapa penampung akan gagal dicocokkan, mengakibatkan kesalahan 404.
Kelas CustomerController sendiri melakukan beberapa tugas sederhana. Pertama, ia mengumpulkan input formulir menggunakan implementasi antarmuka HttpServletRequest, yang berisi nilai yang sesuai dengan kolom nama depan, nama belakang, dan email formulir. Itu kemudian menetapkan nilai-nilai itu sebagai atribut kueri sehingga dapat dirender ulang baik di formulir atau di halaman hasil. Terakhir, validator memeriksa kebenaran data yang dimasukkan.
Validator adalah kelas sederhana yang memeriksa properti tertentu, seperti apakah string kosong atau apakah email terlihat seperti email. Di GitLab penulis, Anda dapat melihat penerapannya.
Hasil validasi memengaruhi jalannya acara selanjutnya: jika data tidak valid, klien dialihkan melalui objek RequestDispatcher ke halaman pendaftaran, tempat kesalahan terkait ditampilkan. Jika semuanya beres, halaman selamat datang ditampilkan.
Jadi, kami telah membuat aplikasi web Java lengkap yang memungkinkan Anda mendaftarkan klien menggunakan formulir HTML, servlet dasar, dan beberapa file JSP. Saatnya meluncurkannya.
Meluncurkan aplikasi
Untuk meluncurkan aplikasi, Anda perlu melakukan langkah-langkah berikut:
IntelliJ IDEA). Saat Anda menerapkan proyek dan menjalankannya, browser default akan diluncurkan dengan jendela login.
Kesimpulan
Jadi, Anda telah memperoleh semua keterampilan yang Anda butuhkan untuk membuat aplikasi web Java Anda sendiri tanpa harus menggunakan kerangka kerja yang rumit. Yang Anda butuhkan hanyalah Servlet API , teknologi seperti JSP untuk rendering, dan fasilitas Java bawaan. Ini bagus, bukan?
Perlu dicatat bahwa penerapan kelas CustomerController menyoroti kelebihan dan kekurangan servlet: di satu sisi, ini secara singkat menunjukkan betapa mudahnya memproses parameter permintaan dan mengirim respons ke klien di format yang berbeda. Tetapi fungsionalitas ini ada harganya: implementasi antarmuka HttpServletResponse dan HttpServletResponse adalah pencari layanan reguler. Ini bukan untuk mengatakan bahwa ini buruk, karena pelacak hanya berisi data. Namun, perlu diingat bahwa implementasi ini akan selalu terikat ke servlet.
Servlet adalah program java yang berjalan di sisi server aplikasi web. Sama seperti applet yang secara dinamis memperluas fungsionalitas browser Web, servlet secara dinamis memperluas fungsionalitas server Web.
kerja servlet"dan dapat dijelaskan sebagai berikut: ketika permintaan datang dari klien, server Web dapat menentukan servlet mana yang perlu dijalankan menggunakan file konfigurasi khusus. Setelah itu, server Web memulai JVM, yang pada gilirannya mengeksekusi servlet. Servlet memproses permintaan dan meneruskan konten server Web (mungkin dalam bentuk halaman HTML) Server web mengirimkan respons (halaman HTML yang dihasilkan oleh servlet) ke klien.
Server WEB pada dasarnya adalah sejenis wadah yang mengunduh servlet"s, mengeksekusi mereka, dan, setelah menerima hasil dari mereka, mengirimkannya ke klien.
Servlet dalam Arsitektur Aplikasi Web
Karena kekuatan dan fleksibilitasnya, servlet"s dapat memainkan peran penting dalam arsitektur sistem. Mereka dapat melakukan tugas aplikasi yang ditujukan untuk lapisan tengah, bertindak sebagai server proxy untuk klien, dan bahkan meningkatkan fungsionalitas lapisan tengah dengan menambahkan dukungan untuk protokol baru dan fungsi lain Lapisan tengah bertindak sebagai server aplikasi dalam apa yang disebut sistem klien-server tiga tingkat dan terletak di antara klien "ringan", seperti browser Web, dan sumber data.
Servlet sebagai proksi
Untuk mendukung applet, servlet dapat bertindak sebagai server proxy mereka. Ini bisa menjadi penting karena sistem keamanan Java hanya mengizinkan applet untuk terhubung ke server tempat mereka mengunduh. Jika applet perlu terhubung ke server database yang terletak di komputer lain, servlet dapat membuat koneksi ini untuk applet.
Sementara dan permanen servlet"s
Servlet dapat dimulai dan dihentikan untuk setiap permintaan klien. Mereka juga dapat dimulai saat server Web mulai dan ada hingga dihentikan. Sementara servlet"s dimuat sesuai permintaan dan menawarkan cara yang baik untuk menghemat sumber daya server untuk fungsi yang jarang digunakan. Servlet persisten dimuat saat server Web mulai dan bertahan hingga dihentikan. Servlet dipasang sebagai ekstensi persisten ke server jika biaya mulai mereka sangat tinggi (misalnya membangun koneksi database) jika mereka menawarkan fungsionalitas tetap di sisi server (misalnya layanan RMI), atau dalam kasus di mana mereka perlu menanggapi permintaan klien secepat mungkin. Tidak ada kode khusus untuk ditetapkan servlet"tetapi permanen atau sementara; ini adalah fungsi dari pengaturan Web server.
Siklus hidup servlet, javax.servlet.Servlet
Servlet berjalan pada platform server Web sebagai bagian dari proses yang sama dengan server Web itu sendiri. Server web bertanggung jawab untuk menginisialisasi, memanggil, dan menghancurkan setiap instance servlet. Server web berinteraksi dengan servlet melalui antarmuka sederhana: javax.servlet.servlet.
Antarmuka javax.servlet.Servlet mencakup tiga metode utama:
- init()
- melayani()
- menghancurkan()
dan dua metode pembantu:
- getServletConfig()
- getServletInfo()
Kesamaan Antar Antarmuka servlet"dan applet Java sudah jelas. Begitulah cara ia dirancang! Java servlet adalah untuk server Web apa applet adalah untuk browser Web. Sebuah applet berjalan di browser Web, melakukan tindakan atas permintaannya melalui antarmuka khusus. Sebuah servlet melakukan hal yang sama saat bekerja di server Web.
Inisialisasi servlet, metode init()
Pertama kali servlet dimuat, metode init() dipanggil. Ini memungkinkan servlet untuk melakukan pekerjaan instalasi apa pun, seperti membuka file atau membuat koneksi ke server mereka. Jika servlet diinstal secara permanen di server, servlet akan dimuat saat server dijalankan. Jika tidak, server memanggil servlet pada permintaan pertama dari klien untuk melakukan layanan yang disediakan oleh servlet tersebut.
Metodenya dijamin init() akan berakhir sebelum panggilan lain ke servlet, seperti memanggil metode melayani(). perhatikan itu init() akan dipanggil hanya sekali; itu tidak akan dipanggil sampai servlet dibongkar dan kemudian dimuat oleh server lagi.
metode init() mengambil satu argumen - referensi ke objek ServletConfig, yang berisi argumen untuk menginisialisasi servlet. Objek ini memiliki metode getServletContext(), yang mengembalikan objek ServletContext A yang berisi informasi tentang lingkungan servlet.
Inti servlet, metode layanan()
metode melayani() adalah jantung dari servlet. Setiap permintaan dari klien menghasilkan satu pemanggilan metode melayani(). Metode ini membaca permintaan dan menghasilkan pesan respons menggunakan dua argumen ServletRequest dan ServletResponse:
Jadi, ada dua cara untuk meneruskan informasi dari klien ke servlet. Yang pertama adalah melewati nilai dalam parameter permintaan. Nilai parameter dapat dimasukkan ke dalam URL. Cara kedua untuk meneruskan informasi dari klien ke servlet adalah melalui InputStream (atau Pembaca).
Metode kerja melayani() pada dasarnya sederhana - ini menciptakan respons terhadap setiap permintaan klien yang diteruskan dari server. Namun, perlu diingat bahwa mungkin ada beberapa permintaan paralel yang sedang diproses pada waktu yang bersamaan. Jika metode melayani() membutuhkan sumber daya eksternal apa pun seperti file, database, maka penting untuk memastikan bahwa akses ke sumber daya aman untuk thread.
Servlet membongkar, menghancurkan () metode
metode menghancurkan() dipanggil untuk melepaskan semua sumber daya (misalnya, membuka file dan koneksi basis data) sebelum membongkar servlet. Metode ini dapat dikosongkan jika tidak perlu melakukan operasi akhir apa pun. Sebelum memanggil metode menghancurkan() server menunggu penyelesaian semua operasi servis, atau untuk waktu tertentu. Ini berarti bahwa metode menghancurkan() dapat dipanggil selama eksekusi metode panjang apa pun melayani().
Penting untuk memformalkan metode ini menghancurkan() sedemikian rupa untuk menghindari penutupan sumber daya yang diperlukan sampai semua panggilan melayani() tidak akan berakhir.
Konfigurasi servlet, metode getServletConfig()
metode getServletConfig() mengembalikan referensi ke objek yang mengimplementasikan antarmuka ServletConfig. Objek ini menyediakan akses ke informasi konfigurasi servlet, mis. akses ke parameter inisialisasi servlet dan objek konteks servlet ServletContext, yang memberikan akses ke servlet dan lingkungannya.
Info servlet, metode getServletInfo()
metode getServletInfo() didefinisikan oleh pemrogram yang membuat servlet untuk mengembalikan string yang berisi informasi tentang servlet, seperti pembuat dan versi servlet.
Antarmuka ServletRequest
ServletRequest memberikan informasi klien tentang parameter permintaan HTTP ke servlet, mis. menyediakan data termasuk nama dan nilai parameter, atribut, dan aliran input. Informasi ini diteruskan ke metode melayani().
Lanjut contoh servlet menunjukkan cara mendapatkan informasi dari parameter meminta metode melayani():
Pembaca BufferedReader; String param1; String param2; layanan batal publik (permintaan ServletRequest, respons ServletResponse) ( pembaca = request.getReader(); param1 = request.getParameter("Pertama"); param2 = request.getParameter("Kedua"); )
Informasi tambahan tentang permintaan tersedia untuk servlet melalui metode, yang utama tercantum dalam tabel berikut:
dapatkan Atribut() | Mengembalikan nilai atribut yang ditentukan dari permintaan ini. |
getContentLength() | Request ukuran jika diketahui. |
getContentType() | Mengembalikan jenis MIME dari badan permintaan. |
getInputStream() | Mengembalikan InputStream untuk membaca data biner dari badan permintaan. |
DapatkanNamaParameter() | Mengembalikan array string dengan nama semua parameter. |
getParameterValues() | Mengembalikan array nilai untuk parameter yang ditentukan. |
getProtocol() | Mengembalikan protokol dan versi untuk permintaan sebagai string formulir |
getReader() | Mengembalikan BufferedReader untuk menerima teks dari badan permintaan. |
getRealPath() | Mengembalikan jalur nyata untuk jalur virtual yang ditentukan. |
getRemoteAddr() | Alamat IP klien yang mengirimkan permintaan ini. |
getRemoteHost() | Nama host mesin klien yang mengirim permintaan. |
getScheme() | Mengembalikan skema yang digunakan dalam URL permintaan ini (misalnya, https, http, ftp, dll.). |
getServerName() | Nama host server yang menerima permintaan ini. |
getServerPort() | Mengembalikan nomor port yang digunakan untuk menerima permintaan ini. |
antarmuka ServletResponse
Antarmuka ServletResponse adalah alat untuk mengirim data ke klien. Semua metode alat ini melayani tugas ini dengan tepat:
publik java.lang.String getCharacterEncoding() public void setLocale(java.util.Locale loc) publik java.util.Locale getLocale()
Metode pertama mengembalikan tipe pengkodean MIME (misalnya, UTF8) di mana informasi akan ditampilkan. Dua metode kedua juga bekerja dengan charset. Mereka menunjukkan bahasa yang digunakan dalam dokumen (misalnya - Rusia).
Public ServletOutputStream getOutputStream() melempar java.io.IOException
Metode getOutputStream mengembalikan aliran keluaran untuk servlet. Aliran ini digunakan, misalnya, untuk menampilkan file biner. Data teks dapat dihasilkan menggunakan java.io.Writer:
Public java.io.PrintWriter getWriter() melempar java.io.IOException
Metode getWriter() secara otomatis mengonversi string ke rangkaian karakter yang ditentukan dalam metode getCharacterEncoding() dan getLocale() .
public void setContentLength(int len)
Metode setContentLength menyetel nilai bidang tajuk HTTP "Panjang Konten"
public void setContentType (tipe String)
Metode setContentType digunakan untuk mengirim tipe konten MIME dokumen. Bidang tajuk HTTP "Tipe-Konten".
Aliran keluaran disangga. Ini berarti bahwa sebagian data akan diberikan kepada klien hanya setelah buffer penuh.
public void setBufferSize(int size) public int getBufferSize() public void flushBuffer() melempar java.io.IOException public void resetBuffer()
4 metode di atas memungkinkan, masing-masing, untuk mengatur ukuran buffer pengiriman, mendapatkan ukurannya, menginisialisasi pengiriman konten buffer ke klien tanpa menunggu sampai terisi, dan menghapus buffer ini dari data.
Boolean publik dikomit()
Menggunakan metode isCommitted, Anda bisa mendapatkan tanda apakah pengiriman data ke klien sudah dimulai. Bendera akan positif jika tajuk respons HTTP telah dikirim.
reset kekosongan publik ()
Jika header HTTP belum terkirim, maka metode reset "mengatur ulang" header HTTP ke nilai defaultnya.
Bagan JFreeChart di Servlets
Pustaka grafik JFreeChart dapat digunakan dalam servlet untuk membuat bagan dan menampilkannya sebagai gambar di halaman situs web. Detail deskripsi dan contoh penggunaan JFreeChart di servlet disediakan.
Servlet dengan pustaka grafis Chart.js
JNI di Servlet
Dalam beberapa kasus, Anda mungkin perlu menggunakan JNI di aplikasi WEB. Contoh penggunaan JNI di servlet disajikan.
Pesan JMS dalam servlet
Servlet dapat digunakan untuk bertukar JMS pesan antar aplikasi. Contoh penggunaan servlet untuk mengirim dan membaca pesan JMS dalam wadah JBoss disediakan.
Java Servlet adalah program sisi server yang ditulis dalam bahasa pemrograman dengan nama yang sama yang menerima sinyal dari klien dan mengirimkan respons kembali ke sana. Ini adalah elemen kunci yang membentuk Java EE yang khas, selain JSP, EJB, XML, dan teknologi terkait lainnya. Aplikasi dapat dikemas dalam file WAR (Web AR chive) untuk ditempatkan di server web. Server yang dapat menjalankan servlet Java disebut container. Program yang berjalan di server semacam itu dapat membuat halaman web yang dinamis.
Dasar Servlet Java
Wadah yang paling populer dan banyak digunakan adalah Tomcat dan JBoss. Secara teknis, Servlet adalah kelas Java normal yang memiliki ekstensi untuk Common Client/Server Protocol, atau HTTP. Dalam praktiknya, ini digunakan untuk memproses permintaan, masing-masing melalui HttpServlet GET dan POST override. Kontainer Java Servlet menyediakan Http.ServletRequest dan Http.ServletResponse, yang merupakan objek respons-permintaan. Dan biasanya digunakan bersamaan dengan JSP untuk menghasilkan konten dinamis.
Skenario model tipikal:
Filter Java Servlet adalah plug-in Java yang digunakan untuk mencegat dan memproses permintaan sebelum dikirim ke servlet dan ditanggapi setelah kodenya selesai, dan sebelum penampung mengirim tanggapan kembali ke klien.
Tugas umum yang harus dilakukan dengan filter:
Filter disertakan dan dikonfigurasi dalam file deskriptor penerapan (web.xml). Servlet dan filter tidak mengetahui satu sama lain, sehingga Anda dapat menambah atau menghapus filter hanya dengan mengedit web.xml. Dapat diterima untuk memiliki beberapa filter untuk satu sumber daya, atau filter berantai untuk web.xml, atau menjalankan filter Java Servlet dengan mengimplementasikan antarmuka javax.servlet.Filter.
Permintaan paralel ke server diproses oleh utas, yang memberikan kualitas penting dari web - multithreading dan paralelisme.
Fungsi utama:
Kebutuhan akan halaman web yang dinamis
Ada banyak alasan mengapa bisnis ingin membuat halaman web dinamis dengan cepat, seperti ketika data di situs web sering berubah. Situs berita dan cuaca biasanya mengandalkan CGI untuk menjaga konten tetap segar tanpa perhatian terus-menerus dari pengembang. Halaman web e-niaga yang mencantumkan harga saat ini dan tingkat stok menggunakan CGI untuk mendapatkan konten ini sesuai permintaan, mengambilnya dari infrastruktur internal perusahaan.
Banyak pengguna berpengalaman dalam menggunakan teknologi Java untuk membuat layanan web berbasis CGI, tetapi Servlet Java lebih efisien, bertenaga, lebih mudah digunakan, dan lebih murah daripada alternatif CGI tradisional.
Manfaat Java Servlet:
Hampir dua puluh tahun telah berlalu sejak munculnya bahasa pemrograman Java. Selama ini, Java dinubuatkan oleh kematian dan pelupaan, programmer di sini menertawakan kelambatan dan keserakahannya akan sumber daya. Tapi ada juga yang percaya pada Java, mereka mengembangkan semua jenis perpustakaan, mengembangkan komunitas, dengan keras kepala membuktikan bahwa tidak ada batasan untuk Java: realtime, embedded, AI - semuanya mungkin. Kami memutuskan untuk tidak mengesampingkan dan membuat serangkaian kecil artikel tentang Java di bagian ini. Pergi!
Ketel Anda memilih Java
Menurut Oracle sendiri, hari ini virtual mesin jawa dipasang di lebih dari tiga miliar perangkat. Dan ini bukan hanya komputer dan smartphone, tetapi juga kamera, TV, pemutar Blue-ray, printer, kartu SIM, ATM, dan bahkan mobil. Daftar ini akan terus bertambah, dan dengan itu, tawaran pekerjaan untuk pemrogram Java. Bahkan sekarang, jumlah lowongan untuk programmer Java melebihi yang lainnya. Dan perusahaan siap membayar lebih dan lebih, memburu karyawan dan mengatur kondisi kerja yang lebih menguntungkan.
Dan mengapa dia baik?
Pemrogram Java tertarik pada sintaks minimalis. Tidak ada pengubah tambahan dan kata-kata layanan. Bahkan tidak adanya pewarisan berganda, yang pada awalnya sedikit membingungkan programmer C++, pada akhirnya ternyata masuk akal dan dapat dibenarkan. Logika sederhana, kerja otomatis dengan memori, dokumentasi mendetail, forum dengan jawaban untuk semua jenis pertanyaan, sumber terbuka- semua ini memungkinkan Anda untuk dengan cepat memahami proses pengembangan dan secara signifikan mengurangi jumlah potensi kesalahan. Bahkan petani India belajar Jawa dalam beberapa bulan, setidaknya itulah yang tertulis di ijazah mereka :). Juga, Java adalah bahasa yang ditafsirkan. Kompiler menerjemahkan kode sumber menjadi apa yang disebut bytecode, yang mudah dikonversi kembali, yang membuat Java sangat menarik untuk rekayasa terbalik.
Baiklah, mari kita mulai
Java adalah bahasa berorientasi objek, yang berarti bahwa semua variabel, metode, konstanta dideklarasikan di dalam kelas. Selain kelas, ada juga antarmuka - konstruksi abstrak khusus yang memungkinkan Anda mendeskripsikan perilaku objek tanpa menentukan implementasi tertentu. Dan jika tidak ada pewarisan berganda kelas di Java, maka sebuah kelas dapat mengimplementasikan sejumlah antarmuka, yang memungkinkan satu objek memiliki banyak fungsi, tetapi hanya menyediakan sebagian saja.
Tipe data dapat dibagi menjadi dua kelompok: sederhana (int, long, char, dan sebagainya) dan tipe objek: kelas, antarmuka, array. Tipe sederhana selalu dan di mana saja dengan dimensi tetap. Misalnya, pada arsitektur dan perangkat apa pun, sebuah int menempati empat byte memori. Ini cukup nyaman untuk perhitungan. Larik data berisi atribut panjang khusus yang menyimpan ukuran larik, terima kasih khusus kepada para pengembang. Data dari tipe yang berbeda diteruskan ke metode dengan cara yang berbeda. Tipe sederhana selalu diteruskan dengan nilai. Objek - selalu dengan referensi untuk menghemat memori. Ini berarti bahwa jika kita meneruskan int a = 10 dan mengubah nilainya menjadi 5 dalam metode yang dipanggil, maka a akan tetap menjadi 10 dalam metode aslinya.Tetapi jika kita mengubah properti objek, itu akan berubah dalam metode aslinya sebagai dengan baik.
Ingat memori
Meskipun pemrogram Java dan dibebaskan dari kebutuhan untuk mengalokasikan dan membebaskan memori, ketidaktahuan tentang beberapa fitur pekerjaan mesin virtual dan pengumpul sampah dapat dengan mudah mengubah program Anda menjadi monster rakus yang menghabiskan waktu CPU dan semua memori yang tersedia.
Saat membuat larik baru, selalu ingat bahwa jauh lebih mudah membuat banyak memori kecil daripada satu memori besar. Jika tidak, Anda berisiko mengalami kesalahan memori Habis, yang secara kasar berarti Anda memiliki memori, tetapi semuanya keluar.
Banyak pemrogram, ketika mereka beralih ke Java dan belajar tentang pembersihan memori otomatis, mulai membuat objek dalam jumlah besar, berharap semuanya akan bersih dengan sendirinya. Sedangkan pemulung ibarat mesin yang hanya bisa memungut sampah yang dibuang ke tempat sampah di dekat rumah. Jika Anda tidak lagi membutuhkan beberapa data, Anda tidak boleh menyimpannya untuk berjaga-jaga, seperti tumpukan kartu pos lama - tetapkan nol ke penunjuk data, bantu pembersih membersihkan :). Ini juga praktik yang baik untuk menghapus daftar jika Anda tidak membutuhkannya lagi. Ingat, sebuah objek akan disimpan dalam memori selama ada referensi untuk itu di dalam kode. Bahkan jika program Anda berjalan pada memori 16 gigabyte dan tidak dalam bahaya kehabisan memori, itu akan menjadi semakin kikuk dan lambat karena penggunaan memori yang meluap-luap. 99% keluhan pengguna tentang program Java yang lambat disebabkan oleh penulisan yang tidak efisien Kode sumber. Jika Anda perlu terus-menerus membuat objek yang digunakan dengan cepat dan tidak diperlukan lagi, seperti banyak pesan kecil, pertimbangkan untuk membuat kumpulan yang akan menyimpan sejumlah instance untuk penggunaan berulang. Ingat, membuat dan menghapus objek adalah operasi yang mahal.
Mulai bekerja, Tuan-tuan.
Satu contoh lebih baik dari seribu kata. Anda dapat menelusuri manual dan melihat hellowords standar tanpa kami, jadi kami akan berasumsi bahwa Anda telah melakukan ini dan siap menerapkan contoh yang lebih menarik.
Anda dan saya akan menangani aplikasi server Java dan menulis program kecil untuk "memata-matai" pengguna jaringan sosial. Untuk melakukan ini, Anda bahkan tidak perlu mendapatkan pekerjaan di NSA - pengguna menyebarkan segala sesuatu tentang diri mereka sendiri, dan kami hanya perlu menerima, mensistematisasikan, dan menampilkan informasi ini dengan cara yang indah. Ambil salah satu yang populer layanan sosial, misalnya foursquare, dan gambarlah pergerakan teman kita di peta.
Pertama, mari kita lihat apa yang bisa kita dapatkan dari foursquare. Setelah menelusuri halaman untuk pengembang, kami mengalihkan perhatian kami ke dua metode:
- https://developer.foursquare.com/docs/users/checkins - tempat yang dikunjungi oleh pengguna. Sayangnya, saat ini hanya didukung untuk pengguna yang terdaftar dalam program, dan ada desas-desus bahwa karena keterbatasan implementasi, itu akan tetap demikian;
- https://developer.foursquare.com/docs/checkins/recent - tempat yang dikunjungi oleh teman dari pengguna terdaftar. Jika Anda bermain sedikit dengan fungsi ini, ternyata fakta yang menyedihkan: untuk setiap teman, tepat satu tempat dikembalikan - tempat terakhir dia memeriksa dirinya sendiri.
Untuk menggunakan API foursquare, Anda perlu mendaftarkan aplikasi masa depan kami, buka alamat ini: https://ru.foursquare.com/developers/register dan isi kolom (ya, Anda juga harus mendaftar di foursquare sendiri, tetapi Anda dapat melakukannya dengan sempurna tanpa saya).
Dari bidang-bidang penting, hanya "Nama aplikasi", "Unduh / url halaman selamat datang" (masukkan alamat web arbitrer di sini) dan "Redirect URI (s)" yang dapat dicatat di sini - ini adalah alamat yang akan dikirim oleh server kepada kami setelah pendaftaran. Kami akan memasukkan nilai yang diinginkan di sini nanti, tetapi untuk saat ini Anda cukup memasukkan alamat web apa saja. Klik "Simpan" dan aplikasi pelacak kami telah berhasil didaftarkan.
Kami naik ke awan
Captain Obvious menyampaikan bahwa setiap aplikasi server membutuhkan server untuk bekerja. Meningkatkan server sendiri adalah wasir, jadi kami akan menggunakan solusi cloud yang sekarang populer. Cloud akan disponsori oleh Google Corporation karena Google App Engine mereka gratis, cukup mudah disiapkan dan digunakan. Untuk memulai, buka di sini dan unduh Google App Engine SDK untuk Java.
Sekarang Anda dapat mulai membuat proyek. Untuk pengembangan Java, saya menggunakan IntelliJ IDEA, tetapi Anda dapat menggunakan lingkungan Eclipse yang gratis dan juga terkenal.
Mari pilih proyek Java baru. Sebut saja nsa_tracker.
Pada tab berikutnya, tandai Aplikasi Web dan Google App Engine di sebelah kiri dan tunjukkan jalur ke App Engine SDK yang diunduh dan dibongkar sebelumnya.
Sekarang duduk dan biarkan IDE melakukan tugasnya. Jika Anda memilih IDEA dan melakukan semuanya dengan benar, maka sebagai hasilnya Anda akan melihat proyek selesai yang, saat diluncurkan, membuka jendela browser dengan konten kosong. Anda dapat memulai pengkodean.
Kami mulai mencari
Jadi, kami memiliki folder proyek, yang berisi folder src. Di sinilah kita akan meletakkan kode sumber. Sumber di Java dikelompokkan berdasarkan paket. Paket adalah folder pada disk. Paket diperlukan agar tidak membuang semua sumber ke dalam tumpukan, tetapi untuk memisahkannya, dipandu oleh prinsip logika. Misalnya, kode yang terkait dengan antarmuka pengguna secara logis akan ditempatkan dalam paket ui, interaksi jaringan dalam paket jaringan. Ini sangat memudahkan pengembangan dan dukungan proyek nanti. Secara historis telah menjadi praktik untuk memulai struktur paket dengan nama perusahaan diikuti dengan nama program. Ini akan membantu untuk dengan mudah mengidentifikasi sumber kami di antara banyak sumber yang sama di masa mendatang. Untuk program kami, kami akan membuat paket org.nsa.tracker. Di dalamnya kita akan membuat kelas.
Servlet digunakan untuk memproses permintaan pengguna di server. Servlet adalah kelas yang biasanya mewarisi dari HttpServlet dan bekerja berdasarkan permintaan-respons. Yang diperlukan hanyalah mengganti metode doGet. Atas permintaan dari pengguna, kita perlu masuk ke foursquare, memuat daftar check-in teman dan mengalihkan permintaan ke halaman peta.
Untuk bekerja dengan API foursquare, kami akan menggunakan pustaka foursquare-api-java gratis, yang dapat diambil dari sini. Pustaka Java adalah arsip ZIP dengan ekstensi jar yang berisi kelas Java terkompilasi yang mengimplementasikan fungsionalitas tertentu. Untuk otorisasi, kami memerlukan ClientId dan ClientSecret yang diperoleh pada tahap pendaftaran aplikasi di foursquare. Karena parameter ini tidak berubah selama eksekusi program, kami mendeklarasikannya sebagai konstanta.
String akhir statis pribadi CLIENT_ID = "FAKE_CLIENT_ID"; String final statis pribadi CLIENT_SECRET = "FAKE_CLIENT_SECRET";
Final berarti bahwa variabel ini telah diberi nilai akhir yang tidak dapat diubah. Statis membuat variabel tersedia untuk semua instance dari kelas yang diberikan. Menggunakan contoh otorisasi dari pustaka foursquare-api-java, kami mendapatkan sesuatu seperti kode berikut:
Protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException ( FoursquareApi foursquareApi = new FoursquareApi(CLIENT_ID, CLIENT_SECRET, CALLBACK_URL); String code = req.getParameter("code"); if (code == null) ( // Buka halaman pendaftaran resp.sendRedirect(foursquareApi.getAuthenticationUrl()); ) else ( try ( foursquareApi.authenticateCode(code); // Pendaftaran berhasil, unggah data Hasil
Perhatikan "melempar ServletException, IOException" dalam deklarasi metode. Baris ini berarti bahwa metode tersebut berpotensi membuang salah satu dari pengecualian ini. Pengecualian di Jawa adalah objek yang menandakan bahwa pengecualian telah terjadi. Mereka dapat diverifikasi dan tidak dapat diverifikasi. Pengecualian yang diperiksa harus ditangani dengan mengelilingi bagian kode dengan blok try-catch, atau diteruskan di atas. Pengecualian yang tidak dicentang umumnya tidak ditangani karena terjadi saat program tidak dapat memulihkan statusnya. Dalam metode ini, kami hanya menangani FoursquareApiException.
Saat server web menerima permintaan untuk suatu aplikasi, ia menggunakan deskriptor penerapan untuk mencocokkan URL permintaan dengan kode yang harus menangani permintaan tersebut. Deskriptor penyebaran adalah file XML yang disebut web.xml. Mari tambahkan deskripsi servlet pelacakan.
Sekarang permintaan ke / lacak akan diproses oleh servlet kami bernama TrackerServlet. Anda dapat menyetel parameter Callback Url ke nilai yang benar http://localhost:8080/track.
Untuk menampilkan hasilnya, Anda dapat menggunakan Static Maps API, yang disediakan oleh perusahaan Google yang sama (https://developers.google.com/maps/documentation/staticmaps/). Servlet kami akan menghasilkan halaman HTML sederhana dan mengembalikannya sebagai tanggapan atas permintaan pengguna.
StringBuilder sb = StringBuilder baru("
- "); indeks = 1; untuk (Checkin checkin: result.getResult()) ( sb.append("
Untuk menghasilkan halaman, kelas StringBuilder digunakan, hal ini disebabkan fakta bahwa string di Java adalah objek yang tidak dapat diubah. Saat menggabungkan string menggunakan operator +. dibuat garis baru dalam pikiran. StringBuilder menghemat memori karena menggunakan array char untuk menyimpan string yang akan digabungkan. Mengirim respons ke pengguna:
Hasil byteBytes = sb.toString().getBytes("utf-8"); resp.setContentLength(resultBytes.panjang); resp.getOutputStream().write(resultBytes);
… Dan semuanya sudah siap. Kami meluncurkan dan melihat sesuatu yang mirip dengan gambar dengan tulisan "Hasil program".
Apa berikutnya?
Aplikasi dapat ditingkatkan, seperti memisahkan pengumpulan dan tampilan data. Transfer pengumpulan data ke layanan terpisah yang akan bekerja terus-menerus dan mengingat semua pergerakan pengguna dalam database. Maka dimungkinkan untuk menampilkan bukan titik individu, tetapi rute yang terhubung. Dengan sedikit menggali ke dalam API foursquare, Anda dapat mengekstrak lebih banyak informasi tentang aktivitas pengguna.
Tapi saya harap saya berhasil melakukan hal utama: meyakinkan Anda bahwa Java itu sederhana dan keren. Sampai jumpa dalam sebulan!
Buku untuk Programmer Java
Kami menyarankan Anda untuk mulai belajar bahasa dengan buku “Java. Java: Panduan Pemula oleh Herbert Schildt. Level selanjutnya adalah "Java. Panduan Lengkap” darinya, dan Anda dapat mempelajari lebih lanjut tentang servlet di Java Servlet dan JSP Cookbook oleh Bruce W. Perry.