
Apa iku servlet?
Pisanan, ayo goleki apa servlet lan kenapa sampeyan kerep krungu babagan iki. Java Servlet API minangka API standar sing dimaksudake kanggo dileksanakake ing server. Sesambungan karo klien miturut skema panjalukan-respon. Servlet minangka kelas sing bisa nampa panjalukan saka klien lan menehi respon marang klien. Nyatane, servlet persis minangka blok bangunan sing digunakake kanggo nggawe arsitektur klien-server ing Jawa. Sampeyan bisa uga kelingan manawa kita wis ngomong babagan arsitektur kasebut ing salah sawijining artikel ing seri kasebut. Kita ora bakal ngalahake grumbulan: ayo langsung nulis kode.Apa sampeyan kudu nggawe aplikasi web
Kanggo luwih gampang nalika nggarap servlet Java, sampeyan butuh IntelliJ IDEA Ultimate Edition. Iki minangka produk mbayar, nanging sampeyan bisa ngaktifake uji coba 30 dina utawa nggunakake versi akses awal, sing mesthi gratis. Uga, instal Apache Tomcat — server aplikasi kita. Tomcat minangka wadhah servlet: ngolah panjaluk sing mlebu lan ngirim menyang aplikasi kita. Download Tomcat ing kene .Ayo nggawe aplikasi web pisanan kita
Yen kabeh wis siyap, nggawe proyek Maven. Yen sampeyan ora kenal karo Maven, deleng artikel sadurunge . Ayo miwiti!-
Ing pom.xml, tambahake dependensi javax.servlet-api lan nemtokake 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 prasaja:
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(); } }
-
Kanggo mbukak aplikasi, sampeyan kudu nggawe konfigurasi Tomcat:
-
Sabanjure, kita nuduhake versi Tomcat sing bakal digunakake, lan URL lan port kanggo komunikasi karo server. Sampeyan kudu duwe kaya iki:
-
Saiki kita mung kudu nemtokake artefak (proyek sing dirakit ing arsip JAR) sing bakal dipasang ing wadhah kasebut. Sampeyan bisa ngeklik tombol Ndandani lan pilih perang njeblug : iki tegese sawise proyek dibangun maneh, artefak kasebut bakal diselehake kanthi otomatis ing wadhah servlet.
-
Nilai standar kanggo konteks Aplikasi yaiku servlets_war_exploded . Iki tegese kita ngakses aplikasi ing: http://localhost:8080/servlets_war_exploded .
Napa kita pengin teks ekstra? Ayo mbusak sing ora perlu. Saiki alamat aplikasi web kita yaiku: http://localhost:8080 .
-
Klik OK. Kita weruh yen saiki bisa mbukak aplikasi kasebut:
Saiki nalika sampeyan mbukak aplikasi ing browser sampeyan, sampeyan kudu entuk kesalahan 404. Iki masuk akal, amarga alamat http: // localhost: 8080/ mbutuhake servlet sing peta menyang "/", nanging mung servlet kita peta menyang "/ hello" .
-
Kita bisa ngakses ing http://localhost:8080/hello . Sawise nindakake, kita entuk jawaban sing dikarepake - senar "Hello"!
@WebServlet()
anotasi. Iki ngendi kita ikatan (utawa map) servlet kanggo path tartamtu ("/ hello"). Anotasi iki mung katon ing Java Servlet API 3.0, mula Internet duwe akeh conto ing ngendi pemetaan servlet dumadi liwat file XML. Iki ora perlu maneh. Kanggo nangani panjalukan GET , kita ngilangi doGet()
cara kasebut. Pay manungsa waé kanggo paramèter cara kang: HttpServletRequest
lan HttpServletResponse
. Objek kasebut HttpServletRequest
menehi kabeh informasi sing dibutuhake babagan panjaluk kasebut. Ing HttpServletResponse
, kita nulis respon lan nyetel header sing perlu.
Nggarap paramèter lan sesi
Ayo nambah servlet supaya bisa ngolah paramèter panyuwunan lan nggarap 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();
}
}
Saiki servlet bisa digunakake karo sesi, nambah nilai visitCounter
saben kaca dibukak. Yen visitCounter
atribut durung digawe (nalika riko pisanan menyang kaca), getAttribute()
cara kasebut ngasilake null, mula kita kudu mriksa null. Padha dadi kanggo paramèter request. Yen pangguna ora ngliwati parameter jeneng pangguna, nilai kasebut bakal null. Ing kasus iki, kita menehi salam marang pangguna minangka pengunjung anonim. Kanggo pass parameter ing request GET, string query digunakake, Contone, kita bisa nggunakake URL ing ngisor iki: http: // localhost: 8080 / hello? Jeneng panganggo=Paulus. Sampeyan bisa maca liyane babagan panjalukan HTTP ing artikel sadurungeing seri. Aplikasi kita saiki ora duwe logika akeh, nanging rada ngganggu yen kita entuk kesalahan 404 ing path root. Kanggo ndandani iki, kita bakal nggawe servlet liyane lan peta menyang kaca wiwitan: @WebServlet("/")
. Tujuan saka servlet iki kanggo ngarahake panjalukan menyang path "/ hello". Ana rong cara kanggo nindakake iki: nggunakake "maju" utawa "pangalihan". Mbok menawa ana gunane kanggo mangerteni bedane. A maju delegasi pangolahan panjalukan kanggo servlet liyane ing server. Klien ora melu. Kanggo nindakake iki, tambahake kode ing ngisor iki menyang metode doGet() servlet anyar:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
Ing kode iki, kita ngakses konteks servlet, njaluk dispatcher panjalukan kanggo servlet sing cocog, lan takon kanggo ngolah panjalukan tartamtu kanthi argumen sing ditemtokake (req, resp). A pangalihan bali menyang klien alamat sing kudu digunakake klien kanggo proses panjalukane. Umume browser kanthi otomatis navigasi menyang URL sing bali. Kanggo ngleksanakake pangalihan, sampeyan kudu nambah kode iki:
resp.sendRedirect(req.getContextPath() + "/hello");
Kita nelpon redirect()
cara ing HttpServletResponse
parameter lan pass alamat sing klien kudu nggunakake. Punika rincian penting: Parameter HTTP uga kudu ditambahake ing mburi path pangalihan lengkap, sing ora trep banget. Ing kahanan kita, luwih becik nggunakake forward
, nanging kadhangkala nggunakake redirect
luwih apik. Yen sampeyan ngerti bedane cara kerjane, sampeyan ora bakal salah milih. Kode kanggo servlet anyar katon kaya iki:
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