DataSource Servlet For Dynamic Drop Down | Community
Skip to main content
February 26, 2019
Solved

DataSource Servlet For Dynamic Drop Down

  • February 26, 2019
  • 1 reply
  • 3997 views

Hi,

I am using granite select resourceType to populate list of options. My servlet is written in a way which render different list based upon different parameter.

Below is the sample servlet

@SlingServlet(paths = "/api/bin/dropdown/vivek.json",

    selectors = {"abc","def"},

    extensions = ".html",

    methods = "GET")

public class AvailableThemeServlets extends SlingSafeMethodsServlet {

    private static final long serialVersionUID = 1668099305241096740L;

    @Override

    protected void doGet(SlingHttpServletRequest request,

                         SlingHttpServletResponse response) throws ServletException,

        IOException {

        /*String[] selector = request.getRequestPathInfo().getSelectors();

        for (String obj : selector) {

            System.out.println(obj);

        }*/

        List<Resource> themes = new ArrayList<Resource>();

        // set fallback

        ResourceResolver resolver = request.getResourceResolver();

        request.setAttribute(DataSource.class.getName(),

            EmptyDataSource.instance());

        ValueMap vm = null;

        for (int i = 0; i < 5; i++) {

            // allocate memory to the Map instance

            vm = new ValueMapDecorator(new HashMap<String, Object>());

            // Specify the value and text values

            String Value = "value" + i;

            String Text = "text" + i;

            // populate the map

            vm.put("value", Value);

            vm.put("text", Text);

            themes.add(new ValueMapResource(resolver, new ResourceMetadata(),

                "nt:unstructured", vm));

        }

        DataSource dataSource = new SimpleDataSource(themes.iterator());

        request.setAttribute(DataSource.class.getName(), dataSource);

    }

}

If I hit this servlet from browser say localhost:4502/api/bin/dropdown/vivek.json.abc.html , via debugging can see executions completes

If this servlet pass via datasource say /api/bin/dropdown/vivek.json.abc.html servlet doesn't execute.

If this servlet pass via datasource say /api/bin/dropdown/vivek.json servlet dynamic options displays in drop down [Expected Response]

Wondering why datasource doesn't working with selectors.

Regards

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 Gaurav-Behl

'selectors' won't work with 'path' but with resourceType. Modify your code to remove selectors & extension or change path to resourceType

sling.servlet.selectors

The request URL selectors supported by the servlet. The selectors must be configured as they would be specified in the URL that is as a list of dot-separated strings such as print.a4. In case this is not empty the first selector(s) (i.e. the one(s) on the left) in the request URL must match, otherwise the servlet is not executed. After that may follow arbitrarily many non-registered selectors. The property value must either be a single String, an array of Strings or a Vector of Strings. This property is only considered for the registration with sling.servlet.resourceTypes.

refer docs -

Apache Sling :: Servlets and Scripts

1 reply

Gaurav-Behl
Gaurav-BehlAccepted solution
February 26, 2019

'selectors' won't work with 'path' but with resourceType. Modify your code to remove selectors & extension or change path to resourceType

sling.servlet.selectors

The request URL selectors supported by the servlet. The selectors must be configured as they would be specified in the URL that is as a list of dot-separated strings such as print.a4. In case this is not empty the first selector(s) (i.e. the one(s) on the left) in the request URL must match, otherwise the servlet is not executed. After that may follow arbitrarily many non-registered selectors. The property value must either be a single String, an array of Strings or a Vector of Strings. This property is only considered for the registration with sling.servlet.resourceTypes.

refer docs -

Apache Sling :: Servlets and Scripts

February 24, 2022

Can we add params to the url?
eg.

<datasource
jcr:primaryType="nt:unstructured"
sling:resourceType="/test/run?a=hi"/>