Servlet in AEM

What/Why servlet
Creating/registering a servlet in aem

What/why servlet:
Servlet is a JAVA class used to extend the capabilities of server using request/response programming model.

Creating/registering a servlet in aem:
Servlet can be registered as OSGI service using SCR annotations or using OSGI declarative services
  • Register servlet using SCR annotation
@SlingServlet(paths="/bin/learnAEM", methods = "GET")
public class TestServlet extends SlingSafeMethodsServlet {
private static final long serialVersionUID = 2598426539166789515L;
           
     @Override
     protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServerException, IOException {
    response.setContentType("text/json");
    PrintWriter out = response.getWriter();
    out.println("test data");
    out.close();
   
    }
}

This is the sample example of servlet here we used the @SlingServlet scr annotation to make java class as a sling servlet.
Here I am registering servlet with path /bin/learnAEM if you are registering your servlet with some different path like /bin/projectName/TestServletor /lib/ProjectName/TestServlet you should register you servlet in Apache Sling Servlet/Script Resolver and Error Handler Configuration.

  • Register servlet using OSGI declarative services
@Component
@Service(Servlet.class)
@Properties({
@Property(name="sling.servlet.paths",value="/bin/learnAEM"),
@Property(name="sling.servlet.methods",value="GET"),
@Property(name="sling.servlet.extensions",value="HTML")
})
public class TestServlet extends SlingSafeMethodsServlet {
     private static final long serialVersionUID = 2598426539166789515L;             
     @Override
     protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)  throws ServerException, IOException {
    response.setContentType("text/json");
    PrintWriter out = response.getWriter();
    out.println("test data");
    out.close();
   
    }
}
Using these two ways we make servlet as a OSGI service now we will see how to register service in AEM

  1. Register servlet by path 
  2. Register servlet by resource  
Register servlet by path : To register servlet by we use the same approach discussed above.
Register servlet by resource :
@SlingServlet(name="TestServlet",
resourceTypes="/blog/component/servletExample",
extensions = "pdf",
paths="/bin/learnAEM",
methods = "GET",
metatype=true)
@Properties({
@Property(name="service.description",value="test servlet", propertyPrivate=false),
@Property(name="service.pid", value="com.day.servlets.TestServlet",propertyPrivate=false),
})
public class TestServlet extends SlingSafeMethodsServlet {
     private static final long serialVersionUID = 2598426539166789515L;   
           
     @Override
     protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServerException, IOException {
    response.setContentType("text/json");
    response.getWriter().print("test Data");
    response.getWriter().close();   
    }
}

when you are registering a sevlet using resourceTypes servlet will need additional configuration  property extension(sling.servlet.extension) 
This configuration will let your servlet run in context of a resource instead of global/by default

We have two type of servlet
  1. SlingSafeMethodServlet : Helper base class for read-only servlet in sling. It support GET, HEAD, OPTIONS, TRACE, GENERIC, SERVLETINFO etc. methods.
  2. SlingAllMethodServlet : Helper base class for data modifying servlet in sling. It support SlingSafeMethodServlet methods and POST, PUT, DELETE methods.
KEEP EDUCATING YOURSELF!!!!

Comments

Popular posts from this blog

AEM in docker

Sling API vs JCR API

Creating or finding .M2 folder