Page property in servlet | Community
Skip to main content
Level 6
December 31, 2021
Solved

Page property in servlet

  • December 31, 2021
  • 3 replies
  • 3968 views

I have a servlet which provides JSON for the page. I wanted to get page properties in my code in that servlet. But every time I add page manager or current page to my servlet, the JSON stops loading. And there's no error.

I have the page path. But adapting it to a page is causing issue.

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
Best answer by DEBAL_DAS

You can refer below code , I am accessing servlet via resourceType-

 


package com.aem.demo.core.servlets;

import java.io.IOException;
import java.util.Objects;

import javax.servlet.Servlet;

import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.api.servlets.HttpConstants;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.day.cq.wcm.api.Page;

@8220494(service = Servlet.class, property = { "sling.servlet.resourceTypes=" + "demo/components/page",
"sling.servlet.methods=" + HttpConstants.METHOD_GET })
public class ReadPageInformationServlet extends SlingAllMethodsServlet {

private final Logger logger = LoggerFactory.getLogger(ReadPageInformationServlet.class);

/**
*
*/
private static final long serialVersionUID = 1L;

protected void doGet(SlingHttpServletRequest slingHttpServletRequest,
SlingHttpServletResponse slingHttpServletResponse) {

String requestURI = slingHttpServletRequest.getRequestURI();

String currentpagePath = requestURI.substring(0, requestURI.lastIndexOf("/"));

ResourceResolver resourceResolver = slingHttpServletRequest.getResourceResolver();

Resource resource = resourceResolver.getResource(currentpagePath);
if (Objects.nonNull(resource) && resource.isResourceType("cq:Page")) {

Page page = resource.adaptTo(Page.class);
ValueMap pageproperties = page.getProperties();
try {
slingHttpServletResponse.getWriter().println(pageproperties);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}

}

3 replies

Level 3
December 31, 2021

Hi ,

 

 

Read the value in servlet by passing the current page pat in ajax-data.

 

where you consume the servlet - data - URI = ${currentPage.path @2941342= ""}.

 

Read the URI value in servlet - request.getParameter("URI");

 

Thanks,

Nani

lukasz-m
Community Advisor
Community Advisor
December 31, 2021

Hi @shaheena_sheikh, I am not sure how you are trying to retrieve page properties, however you can try below code. It assumes that resource resolver from request will have read permissions to the page which page properties you would like to get.

 

ResourceResolver resourceResolver = request.getResourceResolver(); PageManager pageManager = resourceResolver.adaptTo(PageManager.class); Page page = pageManager.getPage(pagePath); ValueMap pageProperties = page.getProperties();

 

DEBAL_DAS
DEBAL_DASAccepted solution
January 2, 2022

You can refer below code , I am accessing servlet via resourceType-

 


package com.aem.demo.core.servlets;

import java.io.IOException;
import java.util.Objects;

import javax.servlet.Servlet;

import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.api.servlets.HttpConstants;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.day.cq.wcm.api.Page;

@8220494(service = Servlet.class, property = { "sling.servlet.resourceTypes=" + "demo/components/page",
"sling.servlet.methods=" + HttpConstants.METHOD_GET })
public class ReadPageInformationServlet extends SlingAllMethodsServlet {

private final Logger logger = LoggerFactory.getLogger(ReadPageInformationServlet.class);

/**
*
*/
private static final long serialVersionUID = 1L;

protected void doGet(SlingHttpServletRequest slingHttpServletRequest,
SlingHttpServletResponse slingHttpServletResponse) {

String requestURI = slingHttpServletRequest.getRequestURI();

String currentpagePath = requestURI.substring(0, requestURI.lastIndexOf("/"));

ResourceResolver resourceResolver = slingHttpServletRequest.getResourceResolver();

Resource resource = resourceResolver.getResource(currentpagePath);
if (Objects.nonNull(resource) && resource.isResourceType("cq:Page")) {

Page page = resource.adaptTo(Page.class);
ValueMap pageproperties = page.getProperties();
try {
slingHttpServletResponse.getWriter().println(pageproperties);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}

}

Level 3
May 23, 2023

Hi,

I tried that code and somehow it returns me null resource and I am not able to get page properties.

I tried with static page path but it doesn't work.

Any help on this would be appreciated.

 

Thanks

Level 3
May 23, 2023

I forgot to mention that I am accessing servlet via path.

 

Does that make any difference?