Annotation (chú thích) là gì?

  • Annotation là các chú thích (bắt đầu bằng @) được thêm trực tiếp vào mã nguồn Java.
  • Bắt đầu từ Servlet 3.0 (Java EE 6), Annotation cho phép thay thế web.xml trong nhiều trường hợp.
  • Khai báo servlet, filter, listener một cách nhanh chóng ngay trong code, giúp giảm sự phụ thuộc vào web.xml.

Ví dụ

import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/hello")
public class MyServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        resp.getWriter().println("Hello from annotation!");
    }
}

Các ví dụ khác

@WebServlet

import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.*;

@WebServlet(name = "HelloServlet", urlPatterns = {"/hello"})
public class HelloServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        try {
            response.setContentType("text/html");
            response.getWriter().println("<h1>Hello from @WebServlet!</h1>");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

@WebFilter

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter("/hello") // Áp dụng cho URL /hello
public class LoggingFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("Request received at: " + new java.util.Date());
        chain.doFilter(request, response);
    }
}

@WebListener

import jakarta.servlet.annotation.WebListener;
import jakarta.servlet.ServletContextListener;
import jakarta.servlet.ServletContextEvent;

@WebListener
public class AppContextListener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("Ứng dụng được khởi động");
    }

    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("Ứng dụng đã dừng");
    }
}

@MultipartConfig

Dùng để hỗ trợ upload file:

import jakarta.servlet.annotation.*;
import jakarta.servlet.http.*;
import java.io.*;

@WebServlet("/upload")
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) {
        try {
            Part filePart = request.getPart("file"); // input name="file"
            String fileName = filePart.getSubmittedFileName();
            InputStream fileContent = filePart.getInputStream();
            // Lưu file, xử lý...
            response.getWriter().println("Uploaded: " + fileName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Ưu điểm của Annotation

  • Ngắn gọn và dễ hiểu: Viết trực tiếp trong class liên quan.
  • Không cần web.xml cho các cấu hình cơ bản.
  • Giảm lỗi đồng bộ giữa mã và cấu hình.
  • Hỗ trợ IDE tốt hơn (autocomplete, highlight, v.v.).

Lưu ý

  • Annotation chỉ dùng được từ Servlet 3.0+ (Java EE 6).
  • Nếu bạn sử dụng cấu hình kết hợp (vừa web.xml, vừa annotation), thì web.xml sẽ được ưu tiên hơn nếu có xung đột.