如果我们设置了组件资源:
我们可以假设它可以这样工作:
同样在servlet中我们可能会做类似
的事情Resource myResource = resourceResolver.getResource(request, "path/to/mycomponent");
我很好奇我如何能够在servlet上下文中获取.json表示。
我已经做了一些解决这个问题的事情,但我想知道是否有另一种方式,因为这个解决方案有很大的局限性。基本上我在路径上加载Node并执行Node的JSONDumps和它的子节点。这将允许我从mycomponent.getPath()的资源中获取更大的JSON集,但它不允许我拉动我通过mycomponent.JSON.jsp创建的自定义JSON视图。
任何想法/建议都会很棒,谢谢。
答案 0 :(得分:5)
要捕获呈现资源的输出,您可以使用SlingRequestProcessor
服务,该服务在内部发出请求而不通过网络层,但仍使用用于处理HTTP请求的所有相同呈现机制。 / p>
如果您只需要在计算的渲染中包含此类输出,则可以使用Request.getRequestDispatcher(somePathWithJsonExtension).include(request, response)
,这是Sling和CQ包含的JSP标记。
使用resourceResolver.getResource(...)
不进行任何渲染,它只提供一个原始资源,它是一个数据/内容对象。
答案 1 :(得分:3)
问题的标题听起来像是想要想要获得等同于/path/to/mycomponent.-1.json
的cURL / AJAX调用,但是在Servlet或其他Java类中。
您可以使用org.apache.sling.commons.json.jcr.JsonItemWriter类将JCR节点转储为具有无限递归的JSONObject。通过将Set传入构造函数,您可以指定要从最终JSON中排除的属性。有关更多示例,请参阅http://www.nateyolles.com/blog/2015/12/converting-aem-sling-resources-to-json。
Resource resource = resolver.getResource("/content/my-app/my-page");
if (resource != null) {
Node node = resource.adaptTo(Node.class);
StringWriter stringWriter = new StringWriter();
JsonItemWriter jsonWriter = new JsonItemWriter(null);
try {
jsonWriter.dump(node, stringWriter, -1);
JSONObject jsonObject = new JSONObject(stringWriter.toString());
} catch (RepositoryException | JSONException e) {
LOGGER.error("Could not create JSON", e);
}
}
您也可以像上面讨论的Bertrand一样使用org.apache.sling.engine.SlingRequestProcessor类。有关更多示例,请参阅http://www.nateyolles.com/blog/2015/10/get-rendered-html-for-an-aem-resource-or-component。
@Reference
private RequestResponseFactory requestResponseFactory;
@Reference
private SlingRequestProcessor requestProcessor;
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
throws ServletException, IOException {
/* Setup request */
HttpServletRequest req = requestResponseFactory.createRequest("GET",
"/content/my-app/my-page.-1.json");
/* Setup response */
ByteArrayOutputStream out = new ByteArrayOutputStream();
HttpServletResponse resp = requestResponseFactory.createResponse(out);
/* Process request through Sling */
requestProcessor.processRequest(req, resp, request.getResourceResolver());
String jsonString = out.toString();
}
答案 2 :(得分:0)
请记住,您正在使用JSP页面来呈现您的JSON。如果您使用sling servlet执行此操作,有几种方法是可行的,但这不是尝试直接写出响应的最佳方法,尤其是因为您有一个JSP视图来执行此操作对你而言。
看一下这篇文章:
servlet result display in jsp page
具体做法是:
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
Object data = "Some data, can be a String or a Javabean";
request.setAttribute("data", data);
request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response);
}
如果你只想渲染一些JSON。
否则,另一个不太优雅的选择是向JSON发出同步本地HTTP请求。
希望有所帮助。