Как вызвать Sling Servlet, который использует resourceType вместо путей в аннотации @SlingServlet

Как вызвать сервлет Sling, который использует свойство «resourceType» внутри @SlingServlet? Когда я использую «пути», я просто вызываю его с помощью вызова ajax, но я не уверен, что делать, если я изменю свой сервлет, чтобы использовать «resourceType» вместо «пути». (Я вношу изменения в учебных целях)

Я все еще изучаю CQ5, Sling и т. д.

Мой сервлет следует.

package com.mypackage.weather;

import org.apache.sling.api.resource.*;
import org.apache.sling.commons.osgi.PropertiesUtil;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import javax.servlet.ServletException;
import java.io.BufferedReader;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SlingServlet(
        name="Weatherservlet",
        //paths="/bin/Weather",
        resourceType="OpenWeather/components/page/contentPage",
        methods="GET",
        metatype=true)
@Properties({
        @org.apache.felix.scr.annotations.Property(name="WeatherServlet", description="Get JSON String weather info", value="mitch weather"),
        @org.apache.felix.scr.annotations.Property(name = "apikey", label = "The api key", value = "d8e39388b0bc54a62ffc6b385639b3dc") // register the api key in the OSGi console
})

/**
 * Handles requests for getting weather information from OpenWeatherMap.org.  returns the information as a JSon string.
 */
public class WeatherServlet extends SlingSafeMethodsServlet {

    private static final String SERVER = "localhost:4502";
    private static final String RESOURCE_PATH = "/content/OpenWeather";
    private String apikey = "";
    private String location = "";
    private ResourceResolver resourceResolver;

    private Logger logger = LoggerFactory.getLogger(WeatherServlet.class);

    @Override
    public void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        logger.info("Reconfigured Weather Servlet");
        getWeather(request, response);

    }

    /**
     * Gets current weather information from OpenWeatherMap.org API
     * @param request
     * @param response
     * @throws IOException
     */
    public void getWeather(SlingHttpServletRequest request, SlingHttpServletResponse response)   {
        logger.info("api key: " + apikey);
        location = request.getParameter("city");
        logger.info("city sent: " + location);
        String urlString = "http://api.openweathermap.org/data/2.5/weather?q=" + location + "&units=imperial&APPID=" + apikey;
        logger.info("urlString: " + urlString);
        URL url = null;
        HttpURLConnection connection = null;
        int responseCode = -9;
        String result = "";
        logger.info("Before call to Open Weather");
        long startTime = System.currentTimeMillis();
        try {
            url = new URL(urlString);
            logger.info("url: " + url);
            connection = (HttpURLConnection) url.openConnection();
            logger.info("Connection: " + connection);
            connection.setRequestMethod("GET");
            responseCode = connection.getResponseCode();
            logger.info("After calling Open Weather");
            BufferedReader reader;
            reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            logger.info("reader: " + reader);
            result = reader.readLine();
            long stopTime = System.currentTimeMillis();
            long elapsedTime = stopTime - startTime;
            logger.info("Elapsed Time is... " + elapsedTime);
            logger.info("result: " + result);
            PrintWriter writer = response.getWriter();
            response.setContentType("application/json");
            response.setCharacterEncoding("UTF-8");
            writer.write(result);
        } catch (MalformedURLException e) {
            logger.info("MalformedURL");
            e.printStackTrace();
        } catch (IOException e) {
            logger.info("IOException!!!!!!!!");
            e.printStackTrace();
            logger.info("Cause: " + e.getCause());
        }
    }


    protected void activate(ComponentContext context)
    {
        apikey = PropertiesUtil.toString(context.getProperties().get("apikey"), "d8e39388b0bc54a62ffc6b385639b3dc"); // Get the api key from the OSGi console
        System.out.println("weather servlet activated");
    }
}

person mitchj    schedule 17.03.2015    source источник


Ответы (1)


Вместо ajax-вызова пути в сервлете вы делаете ajax-вызов компоненту. Если вы хотите, чтобы сервлет работал с resourceType, сервлет должен иметь дополнительную конфигурацию для свойства extensions (sling.servlet.extensions). Эта конфигурация позволяет запускать сервлет в контекст ресурса (определенного типа ресурса) вместо глобального.

Поясню на примере. Рассмотрим страницу content/home.html с компонентом foo (resourceType="/apps/someproject/components/foo) по пути /par/foo . Обычно на странице компонент будет запрашиваться с помощью селектора .html, а ресурс будет отображаться сценарием по умолчанию (foo.jsp). Давайте добавим сервлет со следующей аннотацией

@SlingServlet( name="Weatherservlet", extensions = "pdf", resourceType="someproject/components/foo", methods="GET", metatype=true), который даст представление ресурса в формате pdf.

Запрос GET к /content/home/jcr:content/par/foo.pdf будет обрабатываться сервлетом вместо foo.jsp.

request.getResource() внутри doGet сервлета вернет ресурс компонента.

конфигурация пути переопределит конфигурацию resourceType.

person Sharath Madappa    schedule 17.03.2015
comment
Большое спасибо! Ваш ответ вместе с ответом коллеги помогает мне более полно понять, как делать сервлеты Sling с resourceType. - person mitchj; 17.03.2015
comment
Обратите внимание, что абсолютные типы ресурсов, такие как /apps/someproject/components/foo, не рекомендуются, в этом случае вам следует использовать someproject/components/foo. /apps — это префикс, определяемый конфигурацией преобразователя Sling, который может измениться в будущем. - person Bertrand Delacretaz; 18.03.2015
comment
@BertrandDelacretaz, спасибо, что указали на это. Изменен код - person Sharath Madappa; 18.03.2015
comment
Может ли кто-нибудь из вас ответить на этот вопрос: stackoverflow .com/questions/35076684/ - person Sri; 29.01.2016
comment
Отличный и четкий ответ здесь. Молодец, Шарат. - person Josh Boyle; 16.01.2017