Sobes.tech
Middle

What are the main features introduced in the Servlet 3 specification?

sobes.tech AI

Answer from AI

Main features of Servlet 3:

  • Asynchronous Processing: Allows a servlet to delegate request processing to another thread, freeing the current thread to handle new requests and improving scalability.
  • Annotations: Ability to configure servlets, filters, and listeners using annotations @WebServlet, @WebFilter, @WebListener instead of the deployment descriptor web.xml.
  • Pluggability: Enables adding servlets, filters, and listeners programmatically during web application startup or via web-fragment.xml.
  • Resource Provisioning: Specifies mechanisms for discovering and processing JAR files in WEB-INF/lib containing web application resources (Tld, web-fragment.xml, static resources).
  • Improved File Upload Support: Simplifies handling multipart requests used for file uploads with the @MultipartConfig annotation.

Example of asynchronous processing:

// servlet
import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(urlPatterns = "/async", asyncSupported = true) // Annotation and support for asynchronous processing
public class AsyncServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/plain");
        PrintWriter out = response.getWriter();
        out.println("Synchronous part...");

        AsyncContext asyncContext = request.startAsync(); // Start asynchronous context

        asyncContext.start(() -> { // Execute asynchronous task in another thread
            try {
                Thread.sleep(5000); // Simulate long operation
                PrintWriter asyncOut = asyncContext.getResponse().getWriter();
                asyncOut.println("Asynchronous part executed!");
                asyncContext.complete(); // Complete asynchronous context
            } catch (InterruptedException | IOException e) {
                e.printStackTrace();
            }
        });

        out.println("Synchronous part finished.");
    }
}

Example of using the @WebServlet annotation:

// servlet
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/hello") // Servlet configuration using annotation
public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().println("Hello from Servlet 3!");
    }
}