我目前正在做一个小项目,试图帮助别人弄清楚如何连接一个组件。
理想情况下我们想做两件事:
- 有一个呈现模板的jsp
- 将我们所有的业务登录到 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”没有被提取出来进行渲染。
我很好奇是否有人知道如何执行以下操作之一:
在这个 servlet 中包含用于呈现的 JSP(即我在 6dimensions 上看到一些关于 pageContext#include 和 pageContext#pushBody 的有趣内容:http://labs.sixdimensions.com/blog/2013-08-13/cq-resource-inclusion-servlet/)
设置此 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/