Including a JSP into a sling servlet

天大地大妈咪最大 提交于 2019-12-21 20:54:15

问题


I'm currently working on a small project, trying to help someone figure out how to wire up a component.

Ideally we'd like to do 2 things:

  1. have a jsp that renders the template
  2. have all our business login in a SlingAllMethodServlet

Gist of servlet definition:

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 {
    ...
  }
}

This actually works great, when I include the component on a page this runs. The problem (as you might expect) is that I'm consuming the HTML extension here. So "component.jsp" isn't getting picked up for render.

I'm curious if someone knows how to do one of the following:

  1. Include the JSP for render in this servlet (i.e. i saw some interesting stuff on 6dimensions regarding pageContext#include and pageContext#pushBody: http://labs.sixdimensions.com/blog/2013-08-13/cq-resource-inclusion-servlet/)

  2. Set up this servlet, so that this servlet runs at that path before the JSP is rendered.

Any insight would be great.

thank you, brodie


回答1:


Including scripts

Use following construction to include script /apps/test.jsp inside the servlet and pass some values (bindings) to it:

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

The script itself may look like this:

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

Binding value: ${sampleBinding}

Using models

You may also consider a second approach - don't create servlet for each component, but stick to JSP and at the beginning of each script create a model object. Sample script:

<%@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}

And sample model:

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

If you like this approach, you may use a framework that makes writing such models easier. Two interesting solutions are:

  • Sling models
  • Slice



回答2:


Also have a look at the BindingsValueProvider.

https://sling.apache.org/apidocs/sling6/org/apache/sling/scripting/api/BindingsValuesProvider.html



来源:https://stackoverflow.com/questions/24745449/including-a-jsp-into-a-sling-servlet

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!