Last time we see how to use Sling servlets with old legacy URL. Today we’ll see how to create Sling Servlets in the Sling-way: using resourceType.
Scenario
We want a component that can be dragged into a parsys. With a form that submit data to a sling servlet. Then the servlet will do the operations required.
Process
Let’s create the component following the CQ guidelines for making it drag-droppable into a parsys (allowedParents): geometrixx/components/test003. The test003.jsp will look like the following:
<%@include file="/libs/foundation/global.jsp"%>
<form name="frm" method="post" action="<c:out value="${resource.path}" />.c">
<input type="submit" />
</form>
This JSP will answer at a GET http call showing the form. In order to use, create a content page and drag the component into a parsys.
Now it’s time to create the servlet. As usual you’ll have to register it using some felix annotations. The following servlet will be used when posting (HTTP POST) to a resource of type geometrixx/components/test003 with an extension of “c”.
package com.samples.sling;
import java.io.IOException;
import javax.servlet.ServletException;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @scr.component immediate="true" metatype="false"
* @scr.service interface="javax.servlet.Servlet"
* @scr.property name="sling.servlet.methods" values.0="POST"
* @scr.property name="sling.servlet.resourceTypes" values.0="geometrixx/components/test003"
* @scr.property name="sling.servlet.extensions" values.0="c"
*/
public class ResourceTypePostServlet extends SlingAllMethodsServlet {
private static final long serialVersionUID = 8795673847499208743L;
private final static Logger logger = LoggerFactory.getLogger(ResourceTypePostServlet.class);
@Override
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
logger.debug("ResourceTypePostServlet::doPost()");
response.setContentType("text/plain");
response.getOutputStream().print("Hello ResourceTypePostServlet World!");
}
}
We used the sling.servlet.methods to specify which HTTP method the servlet listen to, the sling.servlet.resourceTypes to specify all the resource types is should listen to and the .extensions if you wish to specify an extension.
Remember that if you specify a sling.servlet.paths, resourceTypes, extensions and selectors will be ignored.
Now build the bundle and refresh the previously created content page (should not necessary actually). If you click on the “submit” button you’ll see the Hello World.
References: