我目前正在开展一个小项目,试图帮助有人找出如何连接组件。
理想情况下,我们想做两件事:
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”没有被渲染用于渲染。
如果有人知道如何做以下其中一项,我很好奇:
在此servlet中包含用于渲染的JSP(即我在6个维度上看到了有关pageContext #include和pageContext#pushBody:http://labs.sixdimensions.com/blog/2013-08-13/cq-resource-inclusion-servlet/的一些有趣内容)
设置此servlet,以便在呈现JSP之前,此servlet在该路径上运行。
任何见解都会很棒。
谢谢你, 布罗迪答案 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)
另请参阅BindingsValueProvider。
https://sling.apache.org/apidocs/sling6/org/apache/sling/scripting/api/BindingsValuesProvider.html