Panduan untuk Anotasi Berkaitan Web Java EE

1. Gambaran keseluruhan

Anotasi Java EE menjadikan kehidupan pemaju lebih mudah dengan membiarkan mereka menentukan bagaimana komponen aplikasi harus berkelakuan di dalam wadah. Ini adalah alternatif moden untuk penerangan XML dan pada dasarnya, memungkinkan untuk mengelakkan kod plat boiler

Dalam artikel ini, kami akan memfokuskan pada anotasi yang diperkenalkan dengan Servlet API 3.1 di Java EE 7. Kami akan memeriksa tujuannya dan melihat penggunaannya.

2. Anotasi Web

Servlet API 3.1 memperkenalkan sekumpulan jenis anotasi baru yang dapat digunakan di kelas Servlet :

  • @WebServlet
  • @WebInitParam
  • @WebFilter
  • @WebListener
  • @ServletSecurity
  • @HttpConstraint
  • @HttpMethodConstraint
  • @MultipartConfig

Kami akan memeriksanya secara terperinci di bahagian seterusnya.

3. @WebServlet

Ringkasnya, penjelasan ini memungkinkan kita untuk menyatakan 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 mempunyai sekumpulan atribut yang membolehkan kami menyesuaikan servlet:

  • nama
  • penerangan
  • urlPatterns
  • initParams

Kita dapat menggunakannya seperti dalam contoh di bawah:

@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 { // ... } }

Yang nama atribut mengatasi nama servlet lalai iaitu nama kelas yang layak sepenuhnya secara lalai. Sekiranya kita ingin memberikan keterangan tentang apa yang dilakukan servlet, kita dapat menggunakan atribut deskripsi .

The urlPatterns atribut digunakan untuk menetapkan URL (s) di mana servlet tersedia (berbilang nilai boleh diberikan kepada sifat ini seperti yang ditunjukkan dalam contoh kod).

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 'simpanan':

@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

Sekiranya kita ingin mengubah permintaan dan respons servlet tanpa menyentuh logik dalamannya, kita dapat menggunakan anotasi WebFilter . Kita boleh mengaitkan penapis dengan servlet atau dengan sekumpulan servlet dan kandungan statik dengan menentukan corak URL.

Dalam contoh di bawah ini, kami menggunakan anotasi @WebFilter untuk mengarahkan semula akses tanpa kebenaran ke halaman log masuk:

@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

Sekiranya kita mahukan pengetahuan atau kawalan tentang bagaimana dan kapan servlet dan permintaannya dimulakan atau diubah, kita dapat menggunakan anotasi @WebListener .

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

  • ServletContextListener - untuk pemberitahuan mengenai kitaran hayat ServletContext
  • ServletContextAttributeListener - untuk pemberitahuan apabila atribut ServletContext diubah
  • ServletRequestListener - untuk pemberitahuan setiap kali permintaan untuk sumber dibuat
  • ServletRequestAttributeListener - untuk pemberitahuan apabila atribut ditambahkan, dihapus atau diubah dalam ServletRequest
  • HttpSessionListener - untuk pemberitahuan apabila sesi baru dibuat dan dimusnahkan
  • HttpSessionAttributeListener - untuk pemberitahuan apabila atribut baru ditambahkan atau dikeluarkan dari sesi

Berikut adalah contoh bagaimana kita dapat menggunakan ServletContextListener untuk mengkonfigurasi 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. @ServletSecurity

Apabila kami ingin menentukan model keselamatan untuk servlet kami, termasuk peranan, kawalan akses dan syarat pengesahan, kami menggunakan anotasi @ServletSecurity .

Dalam contoh ini, kami akan menyekat akses ke AccountServlet kami menggunakan anotasi @ServletSecurity :

@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 kes ini, ketika menggunakan AccountServlet, penyemak imbas muncul skrin masuk untuk pengguna memasukkan nama pengguna dan kata laluan yang sah.

Kita boleh menggunakan @HttpConstraint dan @HttpMethodConstraint anotasi untuk menentukan nilai-nilai bagi atribut nilai dan httpMethodConstraints, daripada @ServletSecurity anotasi.

Anotasi @HttpConstraint berlaku untuk semua kaedah HTTP. Dengan kata lain, ia menentukan kekangan keselamatan lalai.

@HttpConstraint mempunyai tiga atribut:

  • nilai
  • peranan Dibolehkan
  • Jaminan pengangkutan

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 semasa menyimpan fail yang dimuat naik buat sementara waktu. Sekiranya ukuran fail yang dimuat naik lebih besar daripada ambang ini, ia akan disimpan di cakera. Jika tidak, fail disimpan dalam memori (ukuran dalam bait)
  • maxFileSize - Ini adalah ukuran maksimum fail yang dimuat naik (ukuran dalam bait)
  • maxRequestSize - Ini adalah ukuran permintaan tertinggi, termasuk fail yang dimuat naik dan data bentuk lain (ukuran dalam bait)
  • lokasi - Ini adalah direktori di mana fail yang diunggah disimpan

9. Kesimpulannya

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

Kod sumber yang berkaitan dengan artikel ini boleh didapati di GitHub.