May 1, 2020
Estimated Post Reading Time ~

A servlet to output html markup template of your AEM page.

If you want to get the html markup template of your AEM page which doesn't have css or js and pure html with white-spaces stripped off, here's a servlet for you.

You can invoke this servlet in any of your aem page by using the page path with 'template' selector and it will output the plain html for you.
Ex: http://localhost:4502/content/we-train/en.template.html

In few of the projects, when aem is integrated with SPA framework, where the role of aem is just hosting pages with structure and content and the client-side rendering is done through external SPA framework, it is often required to deliver the html from aem to front-end SPA team. In those cases, this servlet can be utilized.

So below is the AEM servlet registered with default resourceType - sling/servlet/default, and selector as template, so it can be invoked on any page.
I have written the comments as well in the code for understanding what each piece is doing.

package com.foo.community.core.servlets;

import org.apache.commons.lang.StringUtils;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
import org.apache.sling.engine.SlingRequestProcessor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.day.cq.contentsync.handler.util.RequestResponseFactory;
import com.day.cq.wcm.api.WCMMode;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * A default resourceType servlet called with 'template' selector to output
 * html template without css and js
 */
@SlingServlet(methods = {"GET"},
resourceTypes = {"sling/servlet/default"},
selectors = {"template"})
public class TemplateServlet extends SlingSafeMethodsServlet {

    private static final long serialVersionUID = 1L;
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
    /** Service to create HTTP Servlet requests and responses */
    @Reference
    private RequestResponseFactory requestResponseFactory;
    
    /** Service to process requests through Sling */
    @Reference
    private SlingRequestProcessor requestProcessor;

    @Override
    protected void doGet(final SlingHttpServletRequest request,
            final SlingHttpServletResponse response) throws ServletException,
              IOException {
        
        String requestPath = request.getRequestPathInfo().getResourcePath() +
             "." + request.getRequestPathInfo().getExtension();
        logger.info("requestPath is : "+requestPath);
  
        /** Setup request */
        HttpServletRequest req = 
                        requestResponseFactory.createRequest("GET", requestPath);
        WCMMode.DISABLED.toRequest(req);

        /** Setup response */
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        HttpServletResponse resp = requestResponseFactory.createResponse(out);

        /** Process request through Sling */
        requestProcessor.processRequest(req, resp, request.getResourceResolver());
        String htmlcontent = out.toString();
     
        /** Replacing js and css files extension in html */
        String content = htmlcontent.replace(".js", ".nojs");
        content = content.replace(".css", ".nocss");
  
        /** Setting up the writer to write html template */
         PrintWriter writer = null;
        if (StringUtils.isNotBlank(content)) {
            content = content.replaceAll("(\r?\n+\t?\\s*)", "\n");
            content = content.replaceAll("\n", ""); 
            logger.info("content written is :\n"+content);
            response.setCharacterEncoding("UTF-8");  
            response.setContentType("text/html");  
            writer = response.getWriter();
            writer.write(content);
            writer.close();
        }
    }
}

Below is the screenshot of how any page looks like in aem author
and by using template selector on the above page, you will get its html output-




By aem4beginner

No comments:

Post a Comment

If you have any doubts or questions, please let us know.