Aplikasi Web Java Tanpa web.xml

1. Ikhtisar

Dalam tutorial ini, kami membuat aplikasi web Java menggunakan Servlet 3.0+.

Kita akan melihat tiga anotasi - @WebServlet , @WebFilter , dan @WebListener - yang dapat membantu kita memperbaiki file web.xml kita .

2. Ketergantungan Maven

Untuk menggunakan anotasi baru ini, kita perlu menyertakan dependensi javax.servlet-api :

 javax.servlet javax.servlet-api 4.0.1 

3. Konfigurasi Berbasis XML

Sebelum Servlet 3.0, kami akan mengonfigurasi aplikasi web Java di file web.xml :

  com.baeldung.servlets3.web.listeners.RequestListener   uppercaseServlet com.baeldung.servlets3.web.servlets.UppercaseServlet   uppercaseServlet /uppercase   emptyParamFilter com.baeldung.servlets3.web.filters.EmptyParamFilter   emptyParamFilter /uppercase  

Mari mulai mengganti setiap bagian konfigurasi dengan masing-masing penjelasan yang diperkenalkan di Servlet 3.0.

4. Servlet

JEE 6 dikirimkan dengan Servlet 3.0 yang memungkinkan kita menggunakan anotasi untuk definisi servlet, meminimalkan penggunaan file web.xml untuk aplikasi web.

Misalnya, kita dapat mendefinisikan servlet dan mengeksposnya dengan anotasi @WebServlet

Mari tentukan satu servlet untuk pola URL / huruf besar . Ini akan mengubah nilai parameter permintaan masukan menjadi huruf besar:

@WebServlet(urlPatterns = "/uppercase", name = "uppercaseServlet") public class UppercaseServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { String inputString = request.getParameter("input").toUpperCase(); PrintWriter out = response.getWriter(); out.println(inputString); } }

Perhatikan bahwa kami mendefinisikan nama untuk servlet ( uppercaseServlet) yang sekarang dapat kami rujuk. Kami akan menggunakan ini di bagian selanjutnya.

Dengan anotasi @WebServlet , kami mengganti bagian servlet dan servlet-mapping dari file web.xml .

5. Filter

Sebuah Filter adalah obyek yang digunakan untuk permintaan mencegat atau tanggapan, melakukan tugas pra atau post-processing.

Kita dapat mendefinisikan filter dengan anotasi @WebFilter .

Mari buat filter untuk memeriksa apakah parameter permintaan input ada:

@WebFilter(urlPatterns = "/uppercase") public class EmptyParamFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { String inputString = servletRequest.getParameter("input"); if (inputString != null && inputString.matches("[A-Za-z0-9]+")) { filterChain.doFilter(servletRequest, servletResponse); } else { servletResponse.getWriter().println("Missing input parameter"); } } // implementations for other methods }

Dengan anotasi @WebFilter , kami mengganti bagian filter dan pemetaan filter dari file web.xml .

6. Pendengar

Kami sering kali perlu memicu tindakan berdasarkan peristiwa tertentu. Di sinilah pendengar datang untuk menyelamatkan. Objek-objek ini akan mendengarkan sebuah acara dan menjalankan perilaku yang kita tentukan.

Seperti sebelumnya, kita bisa mendefinisikan pendengar dengan anotasi @WebListener .

Mari buat pendengar yang menghitung setiap kali kita melakukan permintaan ke server. Kami akan mengimplementasikan ServletRequestListener , mendengarkan ServletRequestEvent s:

@WebListener public class RequestListener implements ServletRequestListener { @Override public void requestDestroyed(ServletRequestEvent event) { HttpServletRequest request = (HttpServletRequest)event.getServletRequest(); if (!request.getServletPath().equals("/counter")) { ServletContext context = event.getServletContext(); context.setAttribute("counter", (int) context.getAttribute("counter") + 1); } } // implementations for other methods }

Perhatikan bahwa kami mengecualikan permintaan ke pola / penghitung URL .

Dengan anotasi @WebListener , kami mengganti bagian listener dari file web.xml .

7. Bangun dan Jalankan

Bagi mereka yang mengikuti, perhatikan bahwa untuk pengujian, ada servlet kedua yang telah kami tambahkan untuk endpoint / counter yang hanya mengembalikan atribut konteks servlet counter .

Jadi, mari gunakan Tomcat sebagai server aplikasi.

Jika kita menggunakan versi maven-war-plugin sebelum 3.1.0, kita perlu menyetel properti failOnMissingWebXml ke false .

Sekarang, kami dapat menerapkan file .war kami ke Tomcat , dan akses ke servlet kami.

Mari kita coba endpoint / huruf besar kita :

curl //localhost:8080/spring-mvc-java/uppercase?input=texttouppercase TEXTTOUPPERCASE

Dan kita juga harus melihat bagaimana penanganan kesalahan kita terlihat:

curl //localhost:8080/spring-mvc-java/uppercase Missing input parameter

Dan akhirnya, tes singkat pendengar kami:

curl //localhost:8080/spring-mvc-java/counter Request counter: 2

8. XML Masih Dibutuhkan

Bahkan, dengan semua fitur yang diperkenalkan di Servlet 3.0, ada beberapa kasus penggunaan yang masih membutuhkan file web.xml , di antaranya:

  • Kami tidak dapat menentukan urutan filter dengan anotasi - kami masih membutuhkan bagian jika kita memiliki beberapa filter yang perlu diterapkan dalam urutan tertentu
  • Untuk menentukan batas waktu sesi, kita masih perlu menggunakan bagian
  • Kami masih membutuhkan elemen untuk otorisasi berbasis kontainer
  • Dan untuk menentukan file selamat datang, kami masih membutuhkan file bagian

Atau, Servlet 3.0 juga memperkenalkan beberapa dukungan program melalui ServletContainerInitializer , yang juga dapat mengisi beberapa celah ini.

9. Kesimpulan

Dalam tutorial ini, kami mengonfigurasi Aplikasi web Java tanpa menggunakan file web.xml dengan menggunakan anotasi yang setara.

Seperti biasa, kode sumber untuk tutorial ini dapat ditemukan di GitHub. Selain itu, aplikasi yang menggunakan file web.xml tradisional juga dapat ditemukan di GitHub.

Untuk pendekatan berbasis Spring, buka tutorial web.xml vs. Penginisialisasi dengan Spring.