servlets - 如何在@SlingServlet 注释中调用使用 "resourceType"而不是 "paths"的 Sling Servlet

标签 servlets aem sling

如何调用在@SlingServlet 中使用“resourceType”属性的 Sling Servlet?当我使用“paths”时,我只是用 ajax 调用来调用它,但是如果我将 servlet 更改为使用“resourceType”而不是“paths”,我不确定该怎么做。 (我是出于学习目的进行更改)

我还在学习CQ5,Sling等。

我的servlet如下。

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");
    }
}

最佳答案

不是对 servlet 中的路径进行 ajax 调用,而是对组件进行 ajax 调用。如果您希望 servlet 与 一起使用资源类型 servlet 应该有一个额外的扩展属性配置( sling.servlet.extensions )。这个配置让你在资源(特定资源类型)而不是全局资源的上下文中运行 servlet。

让我用一个例子来解释。考虑一个带有 的页面 content/home.html foo 组件( resourceType="/apps/someproject/components/foo )在路径 /par/foo 。通常在页面上,组件将使用 .html 选择器请求,资源将由默认脚本 ( foo.jsp ) 呈现。让我们添加一个带有以下注释的 servlet
@SlingServlet( name="Weatherservlet", extensions = "pdf", resourceType="someproject/components/foo", methods="GET", metatype=true)这将给出资源的pdf表示。

/content/home/jcr:content/par/foo.pdf 的 GET 请求将由 servlet 而不是 处理foo.jsp .
request.getResource() servlet 内部 doGet将返回组件资源。

路径配置将覆盖资源类型配置。

关于servlets - 如何在@SlingServlet 注释中调用使用 "resourceType"而不是 "paths"的 Sling Servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29102285/

相关文章:

Django 中的 Java 应用程序上下文

java - 是否有另一种方法可以从 Spring MVC 中的 HttpServletRequest 对象获取用户的时区?

java - 激活页面时,sling 事件处理程序仅响应一次

java - 如何为SlingClient编写拦截器

java - getResourceAsStream 上下文初始化

java - JSP : getOutputStream() has already been called for this response

java - 如何防止用户进入 'back' 但在 JSP 中注销后保留缓存?

java - 如何了解在 Mac 上双击 .jar 文件时会发生什么情况?

java - 如何在 MongoDB 中存储 Apache Sling 内容?

jcr - Apache 吊索 : Accessing Versions through REST API