Pengenalan Servlet Java

1. Gambaran keseluruhan

Dalam artikel ini, kita akan melihat aspek inti dari pengembangan web di Java - Servlets.

2. Servlet dan Bekas

Secara sederhana, Servlet adalah kelas yang menangani permintaan, memprosesnya dan membalas dengan respons.

Sebagai contoh, kita dapat menggunakan Servlet untuk mengumpulkan input dari pengguna melalui formulir HTML, merekod pertanyaan dari pangkalan data, dan membuat halaman web secara dinamis.

Servlet berada di bawah kendali aplikasi Java lain yang disebut Servlet Container. Apabila aplikasi yang berjalan di pelayan web menerima permintaan , Pelayan menyerahkan permintaan itu ke Servlet Container - yang seterusnya menyebarkannya ke target Servlet.

3. Pergantungan Maven

Untuk menambahkan sokongan Servlet dalam aplikasi web kami, javax . Pergantungan servlet-api diperlukan:

 javax.servlet javax.servlet-api 3.1.0 

Pergantungan maven terkini boleh didapati di sini.

Sudah tentu, kita juga perlu mengkonfigurasi wadah Servlet untuk menyebarkan aplikasi kita ke; ini adalah tempat yang baik untuk memulakan cara menggunakan WAR di Tomcat.

4. Kitaran Hayat Servlet

Mari kita ikuti kaedah yang menentukan kitaran hidup Servlet.

4.1. di dalamnya()

The init kaedah direka untuk dipanggil sekali sahaja. Sekiranya contoh servlet tidak ada, wadah web:

  1. Memuatkan kelas servlet
  2. Membuat contoh kelas servlet
  3. Memulakannya dengan memanggil kaedah init

The init kaedah mesti melengkapkan berjaya sebelum servlet boleh menerima apa-apa permintaan. Wadah servlet tidak dapat menempatkan servlet ke dalam perkhidmatan jika kaedah init melemparkan ServletException atau tidak kembali dalam jangka masa yang ditentukan oleh pelayan Web.

public void init() throws ServletException { // Initialization code like set up database etc.... }

4.2. perkhidmatan ()

Kaedah ini hanya dipanggil setelah kaedah inlet () servlet selesai dengan jayanya .

Container memanggil kaedah service () untuk menangani permintaan yang datang dari klien, menafsirkan jenis permintaan HTTP ( GET , POST , PUT , DELETE , dll.) Dan panggilan doGet , doPost , doPut , doDelete , dll. Kaedah yang sesuai.

public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { // ... }

4.3. memusnahkan ()

Dipanggil oleh Servlet Container untuk mengeluarkan Servlet daripada perkhidmatan.

Kaedah ini hanya dipanggil apabila semua utas dalam kaedah servis servlet telah keluar atau setelah masa tamat habis. Setelah kontena memanggil kaedah ini, ia tidak akan memanggil kaedah perkhidmatan lagi di Servlet.

public void destroy() { // }

5. Contoh Servlet

Mari kita sediakan contoh penuh pengendalian maklumat menggunakan borang.

Untuk memulakan, mari kita tentukan servlet dengan pemetaan / hitungServlet yang akan menangkap maklumat POSTed oleh borang dan mengembalikan hasilnya menggunakan RequestDispatcher:

@WebServlet(name = "FormServlet", urlPatterns = "/calculateServlet") public class FormServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String height = request.getParameter("height"); String weight = request.getParameter("weight"); try { double bmi = calculateBMI( Double.parseDouble(weight), Double.parseDouble(height)); request.setAttribute("bmi", bmi); response.setHeader("Test", "Success"); response.setHeader("BMI", String.valueOf(bmi)); RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp"); dispatcher.forward(request, response); } catch (Exception e) { response.sendRedirect("index.jsp"); } } private Double calculateBMI(Double weight, Double height) { return weight / (height * height); } }

Seperti yang ditunjukkan di atas, kelas yang diberi penjelasan dengan @WebServlet mesti melanjutkan kelas javax.servlet.http.HttpServlet . Penting untuk diperhatikan bahawa anotasi @WebServlet hanya tersedia dari Java EE 6 dan seterusnya.

The @WebServlet anotasi diproses oleh bekas pada masa penempatan, dan Servlet yang sama disediakan di pola URL tertentu. Perlu diperhatikan bahawa dengan menggunakan anotasi untuk menentukan corak URL, kita dapat mengelakkan penggunaan deskriptor penyebaran XML bernama web.xml untuk pemetaan Servlet kami.

Sekiranya kita ingin memetakan Servlet tanpa anotasi, kita boleh menggunakan web.xml tradisional sebagai gantinya:

  FormServlet com.root.FormServlet   FormServlet /calculateServlet  

Seterusnya, mari buat borang HTML asas :


    
Your Weight (kg) :
Your Height (m) :

${bmi}

Akhirnya - untuk memastikan semuanya berjalan seperti yang diharapkan, mari kita tulis ujian pantas:

public class FormServletLiveTest { @Test public void whenPostRequestUsingHttpClient_thenCorrect() throws Exception { HttpClient client = new DefaultHttpClient(); HttpPost method = new HttpPost( "//localhost:8080/calculateServlet"); List nvps = new ArrayList(); nvps.add(new BasicNameValuePair("height", String.valueOf(2))); nvps.add(new BasicNameValuePair("weight", String.valueOf(80))); method.setEntity(new UrlEncodedFormEntity(nvps)); HttpResponse httpResponse = client.execute(method); assertEquals("Success", httpResponse .getHeaders("Test")[0].getValue()); assertEquals("20.0", httpResponse .getHeaders("BMI")[0].getValue()); } }

6. Servlet, HttpServlet dan JSP

Penting untuk memahami bahawa teknologi Servlet tidak terhad pada protokol HTTP.

Dalam praktiknya hampir selalu ada, tetapi Servlet adalah antara muka generik dan HttpServlet adalah lanjutan antara muka itu - menambah sokongan khusus HTTP - seperti doGet dan doPost , dll.

Akhirnya, teknologi Servlet juga menjadi pemacu utama sejumlah teknologi web lain seperti JSP - JavaServer Pages, Spring MVC, dll.

7. Kesimpulannya

Dalam artikel ringkas ini, kami memperkenalkan dasar Servlets dalam aplikasi web Java.

Projek contoh boleh dimuat turun dan dijalankan seperti projek GitHub.