
Apa itu servlet?
Pertama, mari kita cari tahu apa itu servlet dan mengapa Anda begitu sering mendengarnya. Java Servlet API adalah API standar yang dimaksudkan untuk diimplementasikan di server. Ini berinteraksi dengan klien sesuai dengan skema permintaan-respons. Servlet adalah kelas yang dapat menerima permintaan dari klien dan mengembalikan respons ke klien . Faktanya, servlet adalah blok bangunan yang kami gunakan untuk membuat arsitektur client-server di Java. Anda mungkin ingat bahwa kami telah berbicara tentang arsitektur itu di salah satu artikel lain dalam seri ini. Kami tidak akan bertele-tele: mari kita menulis beberapa kode segera.Apa yang Anda butuhkan untuk membuat aplikasi web
Untuk kenyamanan maksimal saat bekerja dengan servlet Java, Anda memerlukan IntelliJ IDEA Ultimate Edition. Ini adalah produk berbayar, tetapi Anda dapat mengaktifkan uji coba 30 hari atau menggunakan versi akses awal, yang selalu gratis. Juga, instal Apache Tomcat — server aplikasi kita. Tomcat adalah wadah servlet: ia memproses permintaan yang masuk dan meneruskannya ke aplikasi kita. Unduh Tomcat di sini .Mari buat aplikasi web pertama kita
Jika semuanya sudah siap, buat proyek Maven. Jika Anda tidak terbiasa dengan Maven, lihat artikel sebelumnya . Mari kita mulai!-
Di pom.xml, tambahkan dependensi javax.servlet-api dan tentukan kemasan WAR:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>servlets</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> </dependencies> </project>
Kelas servlet sederhana:
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet("/hello") public class MainServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter printWriter = resp.getWriter(); printWriter.write("Hello!"); printWriter.close(); } }
-
Untuk menjalankan aplikasi, Anda perlu membuat konfigurasi Tomcat:
-
Selanjutnya, kami menunjukkan versi Tomcat mana yang akan kami gunakan, dan URL serta port untuk berkomunikasi dengan server. Anda harus memiliki sesuatu seperti ini:
-
Sekarang kita hanya perlu menentukan artefak (proyek rakitan di arsip JAR) yang akan diterapkan di wadah. Anda dapat mengklik tombol Perbaiki dan memilih perang meledak : ini berarti bahwa setelah proyek dibangun kembali, artefak akan secara otomatis ditempatkan di wadah servlet.
-
Nilai default untuk Application context adalah servlets_war_exploded . Artinya kita mengakses aplikasi di: http://localhost:8080/servlets_war_exploded .
Mengapa kita menginginkan teks tambahan? Mari kita hapus apa yang tidak perlu. Sekarang alamat aplikasi web kami adalah: http://localhost:8080 .
-
Klik Oke. Kami melihat bahwa kami sekarang dapat meluncurkan aplikasi:
Sekarang ketika Anda membuka aplikasi di browser Anda, Anda akan mendapatkan error 404. Ini masuk akal, karena alamatnya http://localhost:8080/ membutuhkan servlet yang dipetakan ke "/", tetapi satu-satunya servlet kami dipetakan ke "/hello" .
-
Kita dapat mengaksesnya di http://localhost:8080/hello . Setelah kami melakukannya, kami mendapatkan jawaban yang diharapkan — string "Halo"!
@WebServlet()
anotasi. Di sinilah kami mengikat (atau memetakan) servlet ke jalur tertentu ("/hello"). Anotasi ini hanya muncul di Java Servlet API 3.0, sehingga Internet memiliki banyak contoh di mana pemetaan servlet terjadi melalui file XML. Ini tidak lagi diperlukan. Untuk menangani permintaan GET , kami mengganti doGet()
metode. Perhatikan parameter metode: HttpServletRequest
dan HttpServletResponse
. Objek tersebut HttpServletRequest
memberi kami semua informasi yang diperlukan tentang permintaan tersebut. Di HttpServletResponse
, kami menulis tanggapan kami dan mengatur tajuk yang diperlukan.
Bekerja dengan parameter dan sesi
Mari tingkatkan servlet kita sehingga dapat memproses parameter permintaan dan bekerja dengan sebuah sesi:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/hello")
public class MainServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
Integer visitCounter = (Integer) session.getAttribute("visitCounter");
if (visitCounter == null) {
visitCounter = 1;
} else {
visitCounter++;
}
session.setAttribute("visitCounter", visitCounter);
String username = req.getParameter("username");
resp.setContentType("text/html");
PrintWriter printWriter = resp.getWriter();
if (username == null) {
printWriter.write("Hello, Anonymous" + "<br>");
} else {
printWriter.write("Hello, " + username + "<br>");
}
printWriter.write("Page was visited " + visitCounter + " times.");
printWriter.close();
}
}
Sekarang servlet bekerja dengan sebuah sesi, meningkatkan nilai visitCounter
setiap kali halaman dikunjungi. Jika visitCounter
atribut belum dibuat (pada kunjungan pertama ke halaman), metode getAttribute()
mengembalikan null, jadi kita perlu memeriksa null. Hal yang sama berlaku untuk parameter permintaan. Jika pengguna tidak melewati parameter username, maka nilainya akan menjadi null. Dalam hal ini, kami menyapa pengguna sebagai pengunjung anonim. Untuk mengirimkan parameter dalam permintaan GET, string kueri digunakan, Misalnya, kita dapat menggunakan URL berikut: http:// localhost:8080/hello? Nama pengguna=Paul. Anda dapat membaca lebih lanjut tentang permintaan HTTP di artikel sebelumnyadalam seri. Aplikasi kami saat ini tidak memiliki banyak logika, tetapi agak mengganggu karena kami mendapatkan kesalahan 404 di jalur root. Untuk memperbaikinya, kami akan membuat servlet lain dan memetakannya ke halaman awal: @WebServlet("/")
. Tujuan dari servlet ini adalah untuk mengalihkan permintaan ke jalur "/hello". Ada dua cara untuk melakukannya: menggunakan "maju" atau "mengalihkan". Mungkin bermanfaat untuk memahami perbedaan di antara mereka. Forward mendelegasikan pemrosesan permintaan ke servlet lain di server . Klien tidak terlibat. Untuk melakukannya, tambahkan kode berikut ke metode doGet() servlet yang baru:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
Dalam kode ini, kami mengakses konteks servlet, mendapatkan pengirim permintaan untuk servlet yang relevan, dan memintanya memproses permintaan khusus dengan argumen yang ditentukan (req, resp). Redirect mengembalikan ke klien alamat yang harus digunakan klien untuk memproses permintaannya . Sebagian besar browser secara otomatis menavigasi ke URL yang dikembalikan. Untuk mengimplementasikan pengalihan, Anda perlu menambahkan kode ini:
resp.sendRedirect(req.getContextPath() + "/hello");
Kami memanggil redirect()
metode pada HttpServletResponse
parameter dan meneruskannya ke alamat yang perlu digunakan klien. Inilah detail penting: Parameter HTTP juga harus ditambahkan di akhir jalur pengalihan penuh, yang sangat tidak nyaman. Dalam situasi kami, lebih baik menggunakan forward
, tetapi terkadang menggunakan redirect
lebih baik. Jika Anda memahami perbedaan cara kerjanya, Anda tidak akan membuat pilihan yang salah. Kode untuk servlet baru terlihat seperti ini:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/")
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// getServletContext().getRequestDispatcher("/hello").forward(req, resp);
resp.sendRedirect(req.getContextPath() + "/hello");
}
}
GO TO FULL VERSION