CodeGym/Blog Java/rawak/Bahagian 5. Servlets dan Java Servlet API. Menulis aplika...
John Squirrels
Tahap
San Francisco

Bahagian 5. Servlets dan Java Servlet API. Menulis aplikasi web yang mudah

Diterbitkan dalam kumpulan
Bahan ini adalah sebahagian daripada siri "Pengenalan kepada Pembangunan Perusahaan". Artikel sebelumnya: Bahagian 5. Servlets dan Java Servlet API.  Menulis aplikasi web yang mudah - 1Adakah anda sudah tahu cara menulis aplikasi Java yang memaparkan teks pada konsol, tetapi anda masih tidak tahu cara membuat aplikasi web pertama anda? Hebat, buat diri anda selesa. Dalam artikel ini, kami akan berkenalan dengan servlet dan menulis aplikasi yang boleh anda banggakan kepada rakan anda tanpa menghantar fail JAR kepada mereka dan tanpa memaksa mereka memuat turun Java. Mari kita tulis aplikasi web yang mudah . Jika anda belum biasa dengan pendekatan yang digunakan dalam pembangunan web, saya syorkan anda mulakan dengan membaca artikel pertama dalam siri " Pengenalan kepada Pembangunan Perusahaan ".

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!
  1. 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();
       }
    }
  2. Untuk menjalankan aplikasi, anda perlu membuat konfigurasi Tomcat:

    Bahagian 5. Servlets dan Java Servlet API.  Menulis aplikasi web yang mudah - 2Bahagian 5. Servlets dan Java Servlet API.  Menulis aplikasi web yang mudah - 3

  3. Seterusnya, kami menunjukkan versi Tomcat yang akan kami gunakan, dan URL serta port untuk berkomunikasi dengan pelayan. Anda sepatutnya mempunyai sesuatu seperti ini:

    Bahagian 5. Servlets dan Java Servlet API.  Menulis aplikasi web yang mudah - 4
  4. 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. Bahagian 5. Servlets dan Java Servlet API.  Menulis aplikasi web yang mudah - 5

  5. 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 .

    Bahagian 5. Servlets dan Java Servlet API.  Menulis aplikasi web yang mudah - 6
  6. Klik OK. Kami melihat bahawa kami kini boleh melancarkan aplikasi:

    Bahagian 5. Servlets dan Java Servlet API.  Menulis aplikasi web yang mudah - 7

    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" .

  7. Kami boleh mengaksesnya di http://localhost:8080/hello . Sebaik sahaja kami berbuat demikian, kami mendapat jawapan yang diharapkan — rentetan "Hello"!

Jika semuanya berfungsi, mari analisa kod tersebut. Untuk membuat HTTP-servlet daripada kelas biasa , ia mesti mewarisi kelas HttpServlet. Di atas pengisytiharan kelas, kami menunjukkan @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: HttpServletRequestdan HttpServletResponse. Objek HttpServletRequestmemberikan 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 visitCountersetiap kali halaman dilawati. Jika visitCounteratribut 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 HttpServletResponseparameter 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 redirectadalah 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");
   }
}

Ringkasan

Aplikasi web pertama anda telah selesai. Dalam artikel seterusnya, anda akan belajar cara menggunakan ia tanpa menggunakan IntelliJ IDEA. Kami menulis aplikasi yang memproses permintaan GET sahaja. Kaedah HTTP yang selebihnya dikendalikan dengan cara yang sama — dengan mengatasi kaedah sepadan kelas induk. Anda boleh menggunakan servlet mudah seperti ini untuk membina aplikasi web serba boleh yang canggih. Sudah tentu, menggunakan rangka kerja yang besar seperti Spring menjadikannya lebih mudah. Tetapi jika anda benar-benar ingin mendalami semua keupayaan servlet, anda boleh membaca spesifikasi rasmi . Bahagian 6. Bekas Servlet Bahagian 7. Memperkenalkan corak MVC (Model-View-Controller)
Komen
  • Popular
  • Baru
  • Tua
Anda mesti log masuk untuk meninggalkan ulasan
Halaman ini tidak mempunyai sebarang ulasan lagi