Panduan untuk Anotasi Terkait Web Java EE

1. Ikhtisar

Anotasi Java EE membuat hidup developer lebih mudah dengan memungkinkan mereka menentukan bagaimana komponen aplikasi harus berperilaku dalam sebuah wadah. Ini adalah alternatif modern untuk deskriptor XML dan pada dasarnya, memungkinkan untuk menghindari kode boilerplate.

Dalam artikel ini, kita akan fokus pada penjelasan yang diperkenalkan dengan Servlet API 3.1 di Java EE 7. Kita akan memeriksa tujuannya dan melihat penggunaannya.

2. Anotasi Web

Servlet API 3.1 memperkenalkan satu set tipe anotasi baru yang dapat digunakan di kelas Servlet :

  • @Web
  • @Bayu_joo
  • @Web Filter
  • @Webener
  • @Jamur_kejang
  • @Bayu_joo
  • @HttphodCon
  • @Tokopedia

Kami akan memeriksanya secara rinci di bagian selanjutnya.

3. @WebService

Sederhananya, anotasi ini memungkinkan kita untuk mendeklarasikan kelas Java sebagai servlet :

@WebServlet("/account") public class AccountServlet extends javax.servlet.http.HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // ... } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { // ... } }

3.1. Menggunakan Atribut Anotasi @WebServlet

@WebServlet memiliki sekumpulan atribut yang memungkinkan kita menyesuaikan servlet:

  • nama
  • deskripsi
  • urlPatterns
  • initParams

Kami dapat menggunakan ini seperti yang ditunjukkan pada contoh di bawah ini:

@WebServlet( name = "BankAccountServlet", description = "Represents a Bank Account and it's transactions", urlPatterns = {"/account", "/bankAccount" }, initParams = { @WebInitParam(name = "type", value = "savings")}) public class AccountServlet extends javax.servlet.http.HttpServlet { String accountType = null; public void init(ServletConfig config) throws ServletException { // ... } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // ... } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { // ... } }

The Nama atribut menggantikan default nama servlet yang merupakan nama kelas yang memenuhi syarat secara default. Jika kita ingin memberikan gambaran tentang apa yang dilakukan servlet, kita bisa menggunakan atribut description .

The urlPatterns atribut digunakan untuk menentukan URL (s) di mana servlet tersedia (beberapa nilai dapat diberikan kepada atribut ini seperti yang ditunjukkan dalam contoh kode).

4. @WebInitParam

Anotasi ini digunakan dengan atribut initParams dari anotasi @WebServlet dan parameter inisialisasi servlet.

Dalam contoh ini, kami menetapkan jenis parameter inisialisasi servlet , ke nilai 'tabungan':

@WebServlet( name = "BankAccountServlet", description = "Represents a Bank Account and it's transactions", urlPatterns = {"/account", "/bankAccount" }, initParams = { @WebInitParam(name = "type", value = "savings")}) public class AccountServlet extends javax.servlet.http.HttpServlet { String accountType = null; public void init(ServletConfig config) throws ServletException { accountType = config.getInitParameter("type"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { // ... } }

5. @WebFilter

Jika kita ingin mengubah permintaan dan respon servlet tanpa menyentuh logika internalnya, kita dapat menggunakan anotasi WebFilter . Kita dapat mengasosiasikan filter dengan servlet atau dengan sekelompok servlet dan konten statis dengan menentukan pola URL.

Dalam contoh di bawah ini, kami menggunakan anotasi @WebFilter untuk mengalihkan akses tidak sah ke halaman login:

@WebFilter( urlPatterns = "/account/*", filterName = "LoggingFilter", description = "Filter all account transaction URLs") public class LogInFilter implements javax.servlet.Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; res.sendRedirect(req.getContextPath() + "/login.jsp"); chain.doFilter(request, response); } public void destroy() { } }

6. @WebListener

Jika kita menginginkan pengetahuan atau kontrol atas bagaimana dan kapan servlet dan permintaannya diinisialisasi atau diubah, kita dapat menggunakan anotasi @WebListener .

Untuk menulis pendengar web, kita perlu memperluas satu atau lebih antarmuka berikut:

  • ServletContextListener - untuk pemberitahuan tentang siklus hidup ServletContext
  • ServletContextAttributeListener - untuk pemberitahuan ketika atribut ServletContext diubah
  • ServletRequestListener - untuk pemberitahuan setiap kali permintaan sumber daya dibuat
  • ServletRequestAttributeListener - untuk pemberitahuan ketika atribut ditambahkan, dihapus atau diubah dalam ServletRequest
  • HttpSessionListener - untuk pemberitahuan ketika sesi baru dibuat dan dimusnahkan
  • HttpSessionAttributeListener - untuk pemberitahuan ketika atribut baru ditambahkan atau dihapus dari sesi

Di bawah ini adalah contoh bagaimana kita dapat menggunakan ServletContextListener untuk mengonfigurasi aplikasi web:

@WebListener public class BankAppServletContextListener implements ServletContextListener { public void contextInitialized(ServletContextEvent sce) { sce.getServletContext().setAttribute("ATTR_DEFAULT_LANGUAGE", "english"); } public void contextDestroyed(ServletContextEvent sce) { // ... } }

7. @Servurity

Saat kami ingin menentukan model keamanan untuk servlet kami, termasuk peran, kontrol akses, dan persyaratan otentikasi, kami menggunakan anotasi @ServletSecurity .

Dalam contoh ini kita akan membatasi akses ke kami AccountServlet menggunakan @ServletSecurity penjelasan:

@WebServlet( name = "BankAccountServlet", description = "Represents a Bank Account and it's transactions", urlPatterns = {"/account", "/bankAccount" }, initParams = { @WebInitParam(name = "type", value = "savings")}) @ServletSecurity( value = @HttpConstraint(rolesAllowed = {"Member"}), httpMethodConstraints = {@HttpMethodConstraint(value = "POST", rolesAllowed = {"Admin"})}) public class AccountServlet extends javax.servlet.http.HttpServlet { String accountType = null; public void init(ServletConfig config) throws ServletException { // ... } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // ... } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { double accountBalance = 1000d; String paramDepositAmt = request.getParameter("dep"); double depositAmt = Double.parseDouble(paramDepositAmt); accountBalance = accountBalance + depositAmt; PrintWriter writer = response.getWriter(); writer.println(" Balance of " + accountType + " account is: " + accountBalance + ""); writer.flush(); } }

Dalam hal ini, saat menjalankan AccountServlet, browser memunculkan layar login bagi pengguna untuk memasukkan nama pengguna dan kata sandi yang valid.

Kita dapat menggunakan @HttpConstraint dan @HttpMethodConstraint penjelasan untuk menentukan nilai untuk atribut nilai dan httpMethodConstraints, dari @ServletSecurity penjelasan.

Anotasi @HttpConstraint berlaku untuk semua metode HTTP. Dengan kata lain, ini menentukan batasan keamanan default.

@HttpConstraint memiliki tiga atribut:

  • nilai
  • roleAllowed
  • transportGuarantee

Out of these attributes, the most commonly used attribute is rolesAllowed. In the example code snippet above, users who belong to the role Member are allowed to invoke all HTTP methods.

@HttpMethodConstraint annotation allows us to specify the security constraints of a particular HTTP method.

@HttpMethodConstraint has the following attributes:

  • value
  • emptyRoleSemantic
  • rolesAllowed
  • transportGuarantee

In the example code snippet above, it shows how the doPost method is restricted only for users who belong to the Admin role, allowing the deposit function to be done only by an Admin user.

8. @MultipartConfig

This annotation is used when we need to annotate a servlet to handle multipart/form-data requests (typically used for a File Upload servlet).

This will expose the getParts() and getPart(name) methods of the HttpServletRequest can be used to access all parts as well as an individual part.

The uploaded file can be written to the disk by calling the write(fileName) of the Part object.

Now we will look at an example servlet UploadCustomerDocumentsServlet that demonstrates its usage:

@WebServlet(urlPatterns = { "/uploadCustDocs" }) @MultipartConfig( fileSizeThreshold = 1024 * 1024 * 20, maxFileSize = 1024 * 1024 * 20, maxRequestSize = 1024 * 1024 * 25, location = "./custDocs") public class UploadCustomerDocumentsServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { for (Part part : request.getParts()) { part.write("myFile"); } } }

@MultipartConfig has four attributes:

  • fileSizeThreshold - Ini adalah ambang ukuran saat menyimpan file yang diunggah untuk sementara. Jika ukuran file yang diunggah lebih besar dari ambang ini, itu akan disimpan di disk. Jika tidak, file disimpan dalam memori (ukuran dalam byte)
  • maxFileSize - Ini adalah ukuran maksimum dari file yang diunggah (ukuran dalam byte)
  • maxRequestSize - Ini adalah ukuran permintaan tertinggi, termasuk file yang diunggah dan data formulir lainnya (ukuran dalam byte)
  • lokasi - adalah direktori tempat menyimpan file yang diunggah

9. Kesimpulan

Pada artikel ini, kami melihat beberapa penjelasan Java EE yang diperkenalkan dengan Servlet API 3.1 dan tujuan serta penggunaannya.

Kode sumber yang terkait dengan artikel ini dapat ditemukan di GitHub.