将JSP包含在sling servlet中

时间:2014-07-14 20:31:35

标签: osgi cq5 sling

我目前正在开展一个小项目,试图帮助有人找出如何连接组件。

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

  1. 有一个呈现模板的jsp
  2. 让我们所有的业务登录SlingAllMethodServlet
  3. 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(即我在6个维度上看到了有关pageContext #include和pageContext#pushBody:http://labs.sixdimensions.com/blog/2013-08-13/cq-resource-inclusion-servlet/的一些有趣内容)

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

    3. 任何见解都会很棒。

      谢谢你, 布罗迪

2 个答案:

答案 0 :(得分:7)

包含脚本

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

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

如果你喜欢这种方法,你可以使用一个框架,使编写这样的模型更容易。两个有趣的解决方案是:

答案 1 :(得分:-1)