Open In App

Servlet with Annotation

Last Updated : 30 Jan, 2022
Improve
Improve
Like Article
Like
Save
Share
Report

As we learned in previous chapters, the Servlet life cycle will be managed by the Servlet container that is under the Web/Application server. Whenever an HttpRequest comes from the client browser, the servlet container will map the request to the corresponding servlet based on the URL mappings provided in the deployment descriptor file – web.xml. For example: Consider the below servlet mappings in the web.xml file.

XML




<servlet>
   <servlet-name>HelloServlet</servlet-name>
   <servlet-class>HelloServlet</servlet-class>
</servlet>
  
<servlet-mapping>
   <servlet-name>HelloServlet</servlet-name>
   <url-pattern>/hello</url-pattern>
</servlet-mapping>


Here, whenever there is a “/hello” URL coming from the client request, we are mapping it to the “HelloServlet” class. Instead of providing these mappings in the web.xml file, we can simply provide an annotation in the Servlet as below,

Java




@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    // Code to be executed...
}


Servlet Annotations

Java Servlets provides a number of annotations to allow users to declare servlets, filters, listeners in the javax.servlet.annotation package. It also provides annotations to specify metadata for the components that are declared.

Annotation Type WebServlet:

Java




public @interface WebServlet


  • Available in javax.servlet.annotation package.
  • Used to declare a Servlet.
  • At the time of deployment, the servlet container will identify and process the annotation and makes the corresponding servlet available at the specified URL patterns.

Elements of @WebServlet Annotation:

Name

Modifier and Type

Description

Default value

asyncSupported boolean To specify whether the servlet supports asynchronous mode or not. false
description String To provide a description of the servlet. “”
displayName String To provide the Display name of the Servlet. “”
initParams WebInitParam[] To specify initialization parameters of the servlet. {}
name String To provide the name of the servlet. “”
value String[] To specify the URL pattern of the servlet that is to be mapped. {}
urlPatterns String[] To provide the URL patterns of the servlet that are to be mapped. {}
smallIcon String To specify the small icon name of the servlet. “”
loadOnStartup int To provide the load on the startup order of the servlet. -1
largeIcon String To specify the large icon name of the servlet. “”

The elements displayName, description, smallIcon and largeIcon are basically used by IDEs, tools or servlet containers. These do not affect the execution of the servlet.

Servlet with Annotation Examples

For better understanding, we will create a simple HTML page to map the Servlet with the URL.

Example 1:

Servlet annotated with only URL pattern:

index.html

HTML




<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Home</title>
</head>
<body>
    <form action="hello" method="post">
  
        Welcome Page: <input type="submit" />
  
    </form>
</body>
</html>


Html page which maps the servlet with URL “/hello”.

HelloServlet.java

Java




import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
  
    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response)
        throws ServletException, IOException
    {
  
        // set the response content type
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
  
        // Print hello message to the client browser in
        // response object
        out.println(
            "<h3>Hello, Welcome to GeeksforGeeks!!</h3>");
        out.close();
    }
}


  • When user clicks submit for the welcome page, container will process the “@WebServlet(“/hello”)” annotation and maps the “HelloServlet” class.
  • As the method is mentioned as “post” in Html page, container will execute “doPost()” method in “HelloServlet” class.

Output:

  • Run the project on the server to get the output.
  • URL: http://localhost:8081/ServletFlow/index.html

index.html file

  • Click on Submit.

Welcome Page

You can see the URL mapping to the “HelloServlet” class and the output.

Example 2:

Servlet annotated with servlet information:

HelloServlet.java

Java




import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
@WebServlet(name = "Hello Servlet",
            displayName = "Annotated Hello Servlet",
            description
            = "This is annotated servlet example.",
            value = "/hello")
public class HelloServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
  
    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response)
        throws ServletException, IOException
    {
  
        // set the response content type
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
  
        // Print hello message to the client browser in
        // response object
        out.println(
            "<h3>Hello, Welcome to GeeksforGeeks!!</h3>");
        out.println(
            "<h4>Annotated servlet with elements - name, displayName, description and value</h4>");
        out.close();
    }
}


  • To include the name of the servlet and any description related to the servlet, we can use annotated elements as shown above.
  • The URL mapping can be specified using value element.

Output:

  • Run the project and click on submit.

Welcome Page

Example 3:

Servlet annotated with Initialization parameters:

HelloServlet.java

Java




import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
@WebServlet(
    value = "/hello",
    initParams
    = { @WebInitParam(name = "name", value = "Geek")
        , })
public class HelloServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
  
    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response)
        throws ServletException, IOException
    {
  
        // Get the initialized parameter value
        String name = getInitParameter("name");
  
        // set the response content type
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
  
        // Print hello message to the client browser in
        // response object
        out.println("<h3>Hello " + name
                    + ", Welcome to GeeksforGeeks!!</h3>");
        out.println(
            "<h4>Annotated servlet with Initialization parameter.</h4>");
        out.close();
    }
}


  • Here, we are specifying the parameter values using @WebInitParam annotation. We need to provide the parameter name which we want to initialize and the value to be set.
  • While Servlet Initialization, container will process the @WebInitParam annotation inside the @WebServlet annotation and initializes the specified values.
  • So, we are initializing the parameter “name” to value “Geek” and the same will written to the output in the response.

Output:

  • Run the project and click on submit.

Welcome Page

Example 4:

Servlet annotated with load-on-start up value and asynchronous support:

HelloServlet.java

Java




import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
@WebServlet(value = "/hello", loadOnStartup = 1,
            asyncSupported = true)
public class HelloServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
  
    public void init(ServletConfig config)
    {
        System.out.println(
            "Hello Servlet has been initialized");
    }
  
    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response)
        throws ServletException, IOException
    {
  
        // set the response content type
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
  
        // Print hello message to the client browser in
        // response object
        out.println(
            "<h3>Hello, Welcome to GeeksforGeeks!!</h3>");
        out.println(
            "<h4>Annotated servlet with load-on-start up value and asynchronous support.</h4>");
        out.close();
    }
}


  • Generally, when the first request comes from the client, then servlet container will identify the corresponding servlet and it will load, instantiate and initialize the servlet.
  • So, the response time for the first request to client is more when compared to the next client requests.
  • If we specify the Load-on-startup value as 1, at the time of servlet deployment into the server itself, container will load, instantiate and initialize the servlet when the server is started.
  • To specify this servlet can support asynchronous mode, set the element asyncSupported value as true.

Output:

  • Run the project on the server.
  • You can see the servlet is loaded, instantiated(init() method) and Initialized at the time of servlet deployment into the server.

Output

  • You can see the initialization message in the console at the time of server start and the servlet deployment.
  • And the response will be generated in the browser as below.

Welcome Page

Example 5:

Servlet annotated with multiple URL patterns:

index.html

HTML




<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Home</title>
</head>
<body>
    <form action="hello" method="post">
        Click here for Welcome Page(using /hello URL): <input type="submit" />
    </form>
    <form action="welcome" method="get">
        Click here for Welcome Page(using /welcome URL): <input type="submit" />
    </form>
</body>
</html>


Include two form pages with different URL mapping.

HelloServlet.java

Java




import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
@WebServlet(urlPatterns = { "/welcome", "/hello" })
public class HelloServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
  
    protected void doGet(HttpServletRequest request,
                         HttpServletResponse response)
        throws ServletException, IOException
    {
  
        // set the response content type
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
  
        // Print hello message to the client browser in
        // response object
        out.println(
            "<h3>Hello, Welcome to GeeksforGeeks!!</h3>");
        out.println(
            "<h4>Annotated servlet with multiple URLs inside Get method.</h4>");
        out.close();
    }
  
    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response)
        throws ServletException, IOException
    {
  
        // set the response content type
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
  
        // Print hello message to the client browser in
        // response object
        out.println(
            "<h3>Hello, Welcome to GeeksforGeeks!!</h3>");
        out.println(
            "<h4>Annotated servlet with multiple URLs inside Post method.</h4>");
        out.close();
    }
}


  • When the URL request comes to the servlet, whether it is “/hello” or “/welcome”, both will be mapped to the same servlet.
  • As specified in the HTML form, “/hello” action is with method “/post”. so, container will execute “doPost()” method in the servlet and  “/welcome” action is with method “/get“. so, container will execute “doGet()” method in the servlet.

Output:

  • Run the project.

index.html

  • When click on “/hello” submit button, container will execute “doPost()” method in the “HelloServlet” and below output will be generated with that URL.

Welcome page - Post method

  • When click on “/welcome” submit button, container will execute “doGet()” method in the “HelloServlet” and below output will be generated with that URL.

Welcome page - Get method

  • You can see the difference between the URL based on the action which we are calling the corresponding servlet.
  • As we included multiple URLs in the Servlet, the container is able to map the request coming from both “/hello” and “/welcome” to the “HelloServlet” and generate the response.

Conclusion

This way we can use different annotations available in javax.servlet.annotation package to declare and set the metadata of the Java Servlets inside the servlet itself instead of using web.xml file based on our project requirement.



Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads