
Apa itu servlet?
Mula-mula, mari kita ketahui apa itu servlet dan sebab anda sering mendengar tentangnya. Java Servlet API ialah API piawai yang bertujuan untuk dilaksanakan pada pelayan. Ia berinteraksi dengan pelanggan mengikut skema permintaan-tindak balas. Servlet ialah kelas yang boleh menerima permintaan daripada klien dan mengembalikan respons kepada klien . Malah, servlet ialah blok binaan yang kami gunakan untuk mencipta seni bina pelayan-pelanggan di Java. Anda mungkin masih ingat bahawa kami telah bercakap tentang seni bina itu dalam satu lagi artikel dalam siri ini. Kami tidak akan bermain-main: mari tulis beberapa kod dengan segera.Perkara yang anda perlukan untuk membuat aplikasi web
Untuk kemudahan terbaik apabila bekerja dengan servlet Java, anda memerlukan IntelliJ IDEA Ultimate Edition. Ia adalah produk berbayar, tetapi anda boleh mengaktifkan percubaan 30 hari atau menggunakan versi akses awal, yang sentiasa percuma. Juga, pasang Apache Tomcat — pelayan aplikasi kami. Tomcat ialah bekas servlet: ia memproses permintaan masuk dan menghantarnya ke aplikasi kami. Muat turun Tomcat di sini .Mari buat aplikasi web pertama kami
Jika semuanya sudah sedia, buat projek Maven. Jika anda tidak biasa dengan Maven, lihat artikel sebelumnya . Mari kita mulakan!-
Dalam pom.xml, tambahkan kebergantungan javax.servlet-api dan tentukan pembungkusan 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 mudah:
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:
-
Seterusnya, kami menunjukkan versi Tomcat yang akan kami gunakan, dan URL serta port untuk berkomunikasi dengan pelayan. Anda sepatutnya mempunyai sesuatu seperti ini:
-
Sekarang kita hanya perlu menentukan artifak (projek yang dipasang dalam arkib JAR) yang akan digunakan dalam bekas. Anda boleh mengklik butang Betulkan dan pilih perang meledak : ini bermakna selepas projek dibina semula, artifak secara automatik akan diletakkan di dalam bekas servlet.
-
Nilai lalai untuk konteks Aplikasi ialah servlets_war_exploded . Ini bermakna kami mengakses aplikasi di: http://localhost:8080/servlets_war_exploded .
Mengapa kami mahukan sebarang teks tambahan? Mari padamkan apa yang tidak perlu. Sekarang kami alamat aplikasi web kami ialah: http://localhost:8080 .
-
Klik OK. Kami melihat bahawa kami kini boleh melancarkan aplikasi:
Sekarang apabila anda membuka aplikasi dalam penyemak imbas anda, anda sepatutnya mendapat ralat 404. Ini masuk akal, kerana alamat http://localhost:8080/ memerlukan servlet yang memetakan ke "/", tetapi satu-satunya servlet kami memetakan ke "/hello" .
-
Kami boleh mengaksesnya di http://localhost:8080/hello . Sebaik sahaja kami berbuat demikian, kami mendapat jawapan yang diharapkan — rentetan "Hello"!
@WebServlet()
anotasi. Di sinilah kita mengikat (atau memetakan) servlet ke laluan tertentu ("/hello"). Anotasi ini hanya muncul dalam Java Servlet API 3.0, jadi Internet mempunyai banyak contoh di mana pemetaan servlet berlaku melalui fail XML. Ini tidak perlu lagi. Untuk mengendalikan permintaan GET , kami mengatasi doGet()
kaedah tersebut. Beri perhatian kepada parameter kaedah: HttpServletRequest
dan HttpServletResponse
. Objek HttpServletRequest
memberikan kami semua maklumat yang diperlukan tentang permintaan itu. Dalam HttpServletResponse
, kami menulis respons kami dan menetapkan pengepala yang diperlukan.
Bekerja dengan parameter dan sesi
Mari perbaiki servlet kami supaya ia boleh memproses parameter permintaan dan berfungsi dengan 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 berfungsi dengan sesi, meningkatkan nilai visitCounter
setiap kali halaman dilawati. Jika visitCounter
atribut belum lagi dibuat (semasa lawatan pertama ke halaman), kaedah getAttribute()
mengembalikan null, jadi kita perlu menyemak nol. Perkara yang sama berlaku untuk parameter permintaan. Jika pengguna tidak melepasi parameter nama pengguna, maka nilainya akan menjadi batal. Dalam kes ini, kami menyambut pengguna sebagai pelawat tanpa nama. Untuk menghantar parameter dalam permintaan GET, rentetan pertanyaan digunakan, Sebagai contoh, kita boleh menggunakan URL berikut: http:// localhost:8080/hello? Nama pengguna=Paul. Anda boleh membaca lebih lanjut tentang permintaan HTTP dalam artikel sebelumnyadalam siri tersebut. Aplikasi kami pada masa ini tidak mempunyai banyak logik, tetapi agak menjengkelkan bahawa kami mendapat ralat 404 pada laluan akar. Untuk membetulkannya, kami akan mencipta servlet lain dan memetakannya ke halaman permulaan: @WebServlet("/")
. Tujuan servlet ini adalah untuk mengubah hala permintaan ke laluan "/hello". Terdapat dua cara untuk melakukan ini: menggunakan "forward" atau "redirect". Mungkin berbaloi untuk memahami perbezaan antara mereka. A hadapan mewakilkan pemprosesan permintaan kepada servlet lain pada pelayan. Klien tidak terlibat. Untuk melakukan ini, tambahkan kod berikut pada kaedah doGet() servlet baharu:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
Dalam kod ini, kami mengakses konteks servlet, dapatkan penghantar permintaan untuk servlet yang berkaitan, dan minta ia memproses permintaan khusus dengan argumen yang ditentukan (req, resp). Ubah hala mengembalikan kepada klien alamat yang pelanggan mesti gunakan untuk memproses permintaannya. Kebanyakan penyemak imbas menavigasi secara automatik ke URL yang dikembalikan. Untuk melaksanakan ubah hala, anda perlu menambah kod ini:
resp.sendRedirect(req.getContextPath() + "/hello");
Kami memanggil redirect()
kaedah pada HttpServletResponse
parameter dan memberikannya alamat yang perlu digunakan oleh pelanggan. Berikut ialah butiran penting: Parameter HTTP juga mesti ditambah pada penghujung laluan ubah hala penuh, yang tidak begitu mudah. Dalam keadaan kita, lebih baik menggunakan forward
, tetapi kadangkala menggunakan redirect
adalah lebih baik. Jika anda memahami perbezaan dalam cara ia berfungsi, anda tidak akan membuat pilihan yang salah. Kod untuk servlet baharu kelihatan 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