- mengenai rangkaian ;
- mengenai seni bina perisian ;
- mengenai protokol HTTP/HTTPS ;
- tentang asas Maven .
Apa itu servlet
Mula-mula, mari kita ketahui apa itu servlet dan sebab anda sering mendengar tentangnya. Java Servlet API ialah API piawai yang direka bentuk untuk pelaksanaan pada pelayan dan bekerja dengan klien menggunakan skema permintaan-tindak balas. Servlet ialah kelas yang boleh menerima permintaan daripada klien dan mengembalikan respons kepadanya. Ya, servlet dalam Java adalah elemen yang membina seni bina pelayan-pelanggan. Jika anda masih ingat, kami telah membincangkannya dalam salah satu artikel dalam siri ini. Jangan main-main: mari tulis beberapa kod dengan segera.Perkara yang anda perlukan untuk membuat aplikasi web
Untuk bekerja dengan selesa dengan servlet di Java, anda memerlukan Intellij IDEA Ultimate Edition. Ia berbayar, tetapi anda boleh mengaktifkan tempoh percubaan 30 hari atau menggunakan versi akses awal - ia sentiasa percuma. Pasang juga pelayan aplikasi kami - Apache Tomcat. Tomcat ialah bekas servlet: ia adalah bekas yang memproses permintaan masuk dari luar dan menghantarnya ke aplikasi kami. Anda boleh memuat turun Tomcat dari pautan ini .Mencipta aplikasi web pertama
Jika semuanya sudah siap, mari buat projek Maven. Jika anda tidak biasa dengan Maven, perhatikan artikel sebelumnya . Mari mulakan!-
Dalam pom.xml, tambahkan kebergantungan javax.servlet-api dan tetapkan perang pembungkusan:
<?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, URL yang kami boleh mengakses pelayan dan port. Anda sepatutnya mendapat sesuatu seperti ini:
-
Yang tinggal hanyalah untuk menentukan artifak (projek yang dipasang ke dalam arkib balang), yang akan digunakan dalam bekas. Anda boleh mengklik butang Betulkan dan pilih perang meledak : ini bermakna selepas projek dibina semula, artifak akan diletakkan secara automatik dalam bekas servlet.
-
Konteks Aplikasi ditetapkan kepada servlets_war_exploded secara lalai , yang bermaksud bahawa aplikasi mesti diakses di: http://localhost:8080/servlets_war_exploded .
Mengapa kita memerlukan teks tambahan? Mari buang perkara yang tidak perlu. Sekarang alamat permohonan kami ialah: http://localhost:8080 .
-
Klik OK. Kami melihat bahawa kami kini mempunyai peluang untuk melancarkan aplikasi:
Sekarang, apabila anda melancarkan aplikasi, penyemak imbas harus membuka dan memaparkan ralat 404. Ini adalah logik, kerana di alamat http://localhost:8080/ harus ada servlet dengan pemetaan "/", dan satu-satunya servlet kami mempunyai pemetaan "/hello" .
-
Kami menghubunginya di http://localhost:8080/hello dan dapatkan respons yang diharapkan - rentetan “Hello”!
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();
}
}
Servlet sedang menjalankan sesi, menambah visitCounter setiap kali halaman dilawati. Jika atribut visitCounter belum lagi dibuat (kali pertama anda melawat halaman), kaedah getAttribute() akan mengembalikan null, jadi anda perlu menyemak nol. Perkara yang sama berlaku untuk parameter permintaan. Jika pengguna tidak melepasi parameter nama pengguna, nilainya akan menjadi batal. Dalam kes ini, kami akan menyambut pengguna sebagai tanpa nama. Untuk menghantar parameter dalam permintaan GET, pembolehubah laluan digunakan, iaitu, anda perlu mengakses pautan http://localhost:8080/hello?username=Pavel . Anda boleh membaca lebih lanjut mengenai permintaan http dalam artikel sebelumnya dalam siri ini. Sekarang aplikasi kami mempunyai logik yang minimum, tetapi ralat 404 dalam laluan akar agak menjengkelkan. Untuk membetulkannya, mari buat servlet lain dan petakannya ke halaman awal @WebServlet("/"). Tugas servlet ini adalah untuk mengubah hala permintaan ke laluan "/hello". Terdapat dua cara untuk melakukan ini: menggunakan ke hadapan atau ubah hala. Mungkin ia bernilai memahami apa perbezaan antara mereka. ke hadapan - mewakilkan permintaan pemprosesan ke servlet lain pada pelayan, pelanggan tidak terlibat. Untuk melakukan ini, anda perlu menambah kod berikut pada kaedah doGet() servlet baharu:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
Dalam kod ini, kami mengakses konteks servlet, dapatkan pengurus permintaan servlet yang dikehendaki daripadanya dan minta ia memproses permintaan tertentu dengan parameter yang ditentukan (req, resp). ubah hala - mengembalikan kepada klien alamat yang dia perlu hubungi untuk memproses permintaannya. Kebanyakan pelayar pergi ke pautan yang dihantar secara automatik. Untuk melaksanakan ubah hala anda perlu menambah kod ini:
resp.sendRedirect(req.getContextPath() + "/hello");
Dalam HttpServletResponse kami memanggil kaedah redirect() dan menghantarnya ke alamat yang perlu dihubungi oleh pelanggan. Butiran penting: Parameter http juga mesti ditambah pada penghujung laluan ubah hala penuh, yang tidak begitu mudah. Dalam keadaan kita, lebih baik menggunakan ke hadapan, tetapi ia berlaku bahawa lebih baik menggunakan ubah hala. Jika anda memahami perbezaan dalam kerja mereka, anda tidak akan salah dengan pilihan anda. 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