JavaRush /Blog Java /Random-MS /Bahagian 5. Servlets, Java servlet API. Menulis aplikasi ...

Bahagian 5. Servlets, 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, Java servlet API.  Menulis aplikasi web yang mudah - 1Adakah anda sudah tahu cara menulis aplikasi Java yang mengeluarkan teks ke 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 tunjukkan kepada rakan anda tanpa menghantar jarnik atau memaksa mereka memuat turun Java. Mari tulis aplikasi web . Jika anda belum biasa dengan pendekatan yang digunakan dalam pengaturcaraan web, saya menasihati anda untuk mula membaca dari 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 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!
  1. 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();
       }
    }
  2. Untuk menjalankan aplikasi, anda perlu membuat konfigurasi Tomcat:

    Bahagian 5. Servlets, Java servlet API.  Menulis aplikasi web yang mudah - 2 Bahagian 5. Servlets, Java servlet API.  Menulis aplikasi web yang mudah - 3

  3. Seterusnya, kami menunjukkan versi Tomcat yang akan kami gunakan, URL yang kami boleh mengakses pelayan dan port. Anda sepatutnya mendapat sesuatu seperti ini:

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

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

    Bahagian 5. Servlets, Java servlet API.  Menulis aplikasi web yang mudah - 6

  6. Klik OK. Kami melihat bahawa kami kini mempunyai peluang untuk melancarkan aplikasi:

    Bahagian 5. Servlets, Java servlet API.  Menulis aplikasi web yang mudah - 7

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

  7. Kami menghubunginya di http://localhost:8080/hello dan dapatkan respons yang diharapkan - rentetan “Hello”!

Jika semuanya berfungsi, mari kita lihat kodnya. Untuk membuat servlet http daripada kelas biasa , anda perlu mewarisinya daripada kelas HttpServlet. Di atas kelas kami menentukan anotasi @WebServlet(), di mana kami mengikat (memetakan) servlet ke laluan tertentu (“/hello”). Anotasi ini hanya muncul dalam Java Servlet API 3.0, jadi terdapat banyak contoh di Internet di mana pemetaan servlet berlaku melalui fail XML. Sekarang ini tidak perlu. Untuk memproses permintaan GET , kami mengatasi kaedah doGet(). Beri perhatian kepada hujah kaedah - HttpServletRequest dan HttpServletResponse. Daripada objek HttpServletRequest kami boleh mengambil semua maklumat yang diperlukan tentang permintaan, dalam HttpServletResponse kami boleh merekodkan 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();
   }
}
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");
   }
}

Pokoknya

Aplikasi web pertama anda sudah sedia. Dalam artikel seterusnya anda akan belajar cara untuk menggunakan ia tanpa menggunakan Intellij IDEA. Kami menulis aplikasi yang hanya memproses permintaan GET. Kaedah http yang selebihnya diproses dengan cara yang sama - mengatasi kaedah sepadan kelas induk. Menggunakan servlet mudah sedemikian, anda boleh membina aplikasi web yang kompleks dan kaya. Sudah tentu, menggunakan rangka kerja besar seperti Spring, ini lebih mudah dilakukan. Tetapi jika anda benar-benar ingin menyelidiki semua keupayaan servlet dengan lebih terperinci, anda boleh membaca spesifikasi rasmi . Bahagian 6. Bekas Servlet Bahagian 7. Pengenalan kepada corak MVC (Model-View-Controller) Bahagian 8. Menulis aplikasi kecil dalam spring-boot
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION