osgi - 将 JSP 包含到 sling servlet 中

标签 osgi aem sling

我目前正在做一个小项目,试图帮助别人弄清楚如何连接一个组件。

理想情况下我们想做两件事:

  1. 有一个呈现模板的jsp
  2. 将我们所有的业务登录到 SlingAllMethodServlet 中

servlet 定义要点:

package definition...

import statements...

@SuppressWarnings("serial")
@SlingServlet(
    resourceTypes="path/to/my/component",
    methods="GET",
    extentions="HTML")
@Properties({
  @Property(name="service.pid", value="<my service class>", propertyPrivate=false),
  @Property(name="service.description",value="<description>", propertyPrivate=false),
  @Property(name="service.vendor",value="<company>", propertyPrivate=false)
})

public class MyComponentServlet extends SlingAllMethodsServlet {
  @Override
  protected void doGet  (SlingHttpServletRequest pRequest, SlingHttpServletResponse pResponse) throws ServletException, IOException {
    ...
  }

  @Override
  protected void doPost(SlingHttpServletRequest pRequest, SlingHttpServletResponse pResponse) throws ServletException, IOException {
    ...
  }
}

当我在运行的页面上包含该组件时,这实际上非常有效。问题(如您所料)是我在这里使用 HTML 扩展。所以“component.jsp”没有被提取出来进行渲染。

我很好奇是否有人知道如何执行以下操作之一:

  1. 在这个 servlet 中包含用于呈现的 JSP(即我在 6dimensions 上看到一些关于 pageContext#include 和 pageContext#pushBody 的有趣内容:http://labs.sixdimensions.com/blog/2013-08-13/cq-resource-inclusion-servlet/)

  2. 设置此 servlet,以便此 servlet 在呈现 JSP 之前在该路径上运行。

任何见解都会很棒。

谢谢你 布罗迪

最佳答案

包括脚本

使用以下构造将脚本 /apps/test.jsp 包含在 servlet 中并向其传递一些值(绑定(bind)):

@Reference
private ServletResolver servletResolver;

public void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
    Servlet servlet = servletResolver.resolveServlet(request.getResource(), "/apps/test.jsp");
    request.setAttribute("sampleBinding", "bindingValue");
    servlet.service(request, response);
}

脚本本身可能如下所示:

<%@page session="false" contentType="text/html; charset=utf-8"
%><%@include file="/libs/foundation/global.jsp"%>

Binding value: ${sampleBinding}

使用模型

您还可以考虑第二种方法 - 不要为每个组件创建 servlet,而是坚持使用 JSP 并在每个脚本的开头创建一个模型 对象。示例脚本:

<%@page session="false" contentType="text/html; charset=utf-8"
%><%@include file="/libs/foundation/global.jsp"%><%
  pageContext.setAttribute("model", new MyModel(slingRequest, slingResponse));
%>

Value from model: ${model.value}

和示例模型:

public class MyModel {

    private final SlingHttpServletRequest request;

    private final SlingHttpServletResponse response;

    public MyModel(SlingHttpServletRequest request, SlingHttpServletResponse response) {
        this.request = request;
        this.response = response;
    }

    public String getValue() {
        // you may use request & response objects here
        return "sample value";
    }
}

如果您喜欢这种方法,您可以使用一个框架来简化此类模型的编写。两个有趣的解决方案是:

关于osgi - 将 JSP 包含到 sling servlet 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24745449/

相关文章:

aem - 多字段组件问题

java - 获取子节点返回无法循环错误

maven - 带有 maven-bundle-plugin 的 OSGI JAR 包

java - "IA64_32"osgi.arch 是什么意思?

java - 在 Eclipse 中使用多个 OSGi 包

aem - 仅加载当前页面中的组件脚本

aem - 如何检查 HTL (AEM) 中 undefined variable 属性?

osgi - 通过 Maven Bundle 和 sling 插件安装 osgi 依赖项

aem - CQ5 - 在选择 xtype 中动态填充选项

java - 如何在程序分发中安装OSGi bundle