在AEM中使用Sling Servlet

目录

  • Servlet
  • Sling Servlet
  • 注解说明
  • Servlet注册
  • Sling servlet可以通过两种方式注册
  • Servlet的类型
  • Sling Servlet示例
  • 配置
  • 最终效果

Servlet

Servlet是用于扩展服务器功能的类,该服务器承载通过请求-响应编程模型访问的应用程序。对于此类应用程序,Servlet技术定义了HTTP特定的Servlet类。
所有Servlet必须实现Servlet接口,该接口定义了生命周期方法。实现通用服务时,我们可以使用或扩展Java Servlet API的GenericServlet类。HttpServlet类提供的方法,如doGet()和doPost方法() ,用于处理HTTP特定服务。

Sling Servlet

在Sling中,可以将servlet注册为服务。当您使用maven原型18 创建AEM多模块项目时,都会生成Sling Servlet的默认模板- 例如:

/*
 *  Copyright 2015 Adobe Systems Incorporated
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package com.adobe.aem.guides.wknd.core.servlets;

import com.day.cq.commons.jcr.JcrConstants;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.servlets.HttpConstants;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
import org.apache.sling.api.resource.ValueMap;
import org.osgi.framework.Constants;
import org.osgi.service.component.annotations.Component;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import java.io.IOException;

/**
 * Servlet that writes some sample content into the response. It is mounted for
 * all resources of a specific Sling resource type. The
 * {@link SlingSafeMethodsServlet} shall be used for HTTP methods that are
 * idempotent. For write operations use the {@link SlingAllMethodsServlet}.
 */
@Component(service=Servlet.class,
           property={
                   Constants.SERVICE_DESCRIPTION + "=Simple Demo Servlet",
                   "sling.servlet.methods=" + HttpConstants.METHOD_GET,
                   "sling.servlet.resourceTypes="+ "wknd/components/structure/page",
                   "sling.servlet.extensions=" + "txt"
           })
public class SimpleServlet extends SlingSafeMethodsServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(final SlingHttpServletRequest req,
            final SlingHttpServletResponse resp) throws ServletException, IOException {
        final Resource resource = req.getResource();
        resp.setContentType("text/plain");
        resp.getWriter().write("Title = " + resource.getValueMap().get(JcrConstants.JCR_TITLE));
    }
}

注解说明

  • @Component注释-此OSGi注释表示该类是Service组件,并且在运行时不会被Service Component Runtime(SCR)实现进行处理。它必须由工具处理,并用于将组件描述添加到捆绑包中。
  • service property -表示将组件注册为服务的类型。在我们的例子中,该组件在Servlet类型下注册
  • Constants.SERVICE_DESCRIPTION- 为OSGi环境系统属性,服务属性和清单头属性键定义标准名称。在本例中,我们正在定义servlet的描述。
  • sling.servlet.methods-定义此servlet将使用的方法。在本例中,我们使用的是HTTP GET方法。
  • sling.servlet.resourceTypes-此属性定义我们如何访问servlet。有两种方法-通过资源类型和通过路径。
  • sling.servlet.extensions- Servlet支持的请求URL扩展。该属性值必须是单个字符串,字符串数组或字符串向量。仅向sling.servlet.resourceTypes注册时才考虑使用此属性。

Servlet注册

一个SlingServletResolver监听Servlet的服务和给出正确的服务注册属性,提供的servlet作为资源(虚拟)树。此类Servlet作为ServletResource实例提供,它们适合于javax.servlet.Servlet类。

对于要由Sling Servlet解析器使用的注册为OSGi服务的Servlet,必须设置sling.servlet.paths或sling.servlet.resourceTypes服务引用属性中的一个或两个。如果两者均未设置,则将忽略Servlet服务。

Sling servlet可以通过两种方式注册

  1. 使用resourceTypes(资源类型)- 使用这种方式,我们使用节点的 sling:resourceType 属性。因此,我们可以在浏览器中找到sling:resourceType 是给定路径。
  2. 使用paths(路径)- 通过这种方式,我们可以直接使用请求中指定的路径,然后将执行我们的servlet。

通过路径注册servlet比通过资源类型注册servlet相对容易,但是仍然建议使用资源类型代替路径(官方建议)。
原因:

  • 如果使用路径,则我们需要格外小心,因为我们不想随意给出任何路径。不能使用默认的JCR ACL对Servlet进行访问控制。
  • 路径绑定的servlet中没有后缀处理。
  • 我们还需要指定到servlet使用者的路径,并且路径的更改可能会产生严重的影响。

Servlet的类型

Sling中有两种类型的servlet,它们是在创建servlet时需要扩展的类。

  • SlingSafeMethodsServlet- 如果我们只想使用只读方法,则可以使用它。这个基类实际上只是Servlet API HttpServlet 类的一个实现,它考虑了可扩展性。因此,此类的扩展可以很好地控制要覆盖的方法。它支持GET,HEAD,OPTIONS等方法。
  • SlingAllMethodsServlet- 如果我们要使用也要编写方法,则可以使用它。 此类通过支持POST,PUT和DELETE方法扩展了SlingSafeMethodsServlet 。

Sling Servlet示例

在本课中,我们将创建自定义Sling Servlet,以从RESTful Web服务中获取JSON数据。

package com.adobe.aem.guides.wknd.core.servlets;

import static com.adobe.aem.guides.wknd.core.constants.AppConstants.URL;

import com.adobe.aem.guides.wknd.core.utils.Network;
import java.io.IOException;
import javax.servlet.Servlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.HttpConstants;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
import org.osgi.framework.Constants;
import org.osgi.service.component.annotations.Component;

/**
 * @author kevin.
 * @Title: rhtj.
 * @Package com.adobe.aem.guides.wknd.core.servlets.
 * @Description: 这个servlet使用HTTP GET方法从RESTful web服务读取数据..
 * @date 2020/3/312:22 下午.
 */
@Component(service = Servlet.class, property = {
    Constants.SERVICE_DESCRIPTION + "=从外部web服务读取数据的JSON Servlet",
    "sling.servlet.methods=" + HttpConstants.METHOD_GET, "sling.servlet.paths=" + "/bin/readjson" })
public class JsonServlet extends SlingSafeMethodsServlet {

  /**serialVersionUID.**/
  private static final long serialVersionUID = 4438376868274173005L;

  @Override
  protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
    //1.获取数据.
    String responseString = Network.readJson(URL);
    //2.返回数据.
    response.getWriter().println(responseString);

  }
}

如您所见,我们在代码中使用Network.java 和AppConstants.java,这个部分是上节课的的内容。
在AEM服务器上部署代码后,请访问 URL: http://localhost:4502/bin/readjson 您将在浏览器上看到返回的JSON字符串

配置

在AEM中使用Sling Servlet_第1张图片

最终效果

你可能感兴趣的:(#,9.2,记录)