Aem CQ5.5获取servlet中资源的.infinity.json
如果我们将组件资源设置为:Aem CQ5.5获取servlet中资源的.infinity.json,aem,sling,Aem,Sling,如果我们将组件资源设置为: 真菌成分 mycomponent.jsp mycomponent.JSON.jsp 我们可以假设它会这样工作: /path/to/mycomponent.html=>参见html /path/to/mycomponent.json=>查看我的json 在servlet中,我们还可以执行以下操作 Resource myResource = resourceResolver.getResource(request, "path/to/mycomponent")
- 真菌成分
- mycomponent.jsp
- mycomponent.JSON.jsp
- /path/to/mycomponent.html=>参见html
- /path/to/mycomponent.json=>查看我的json
Resource myResource = resourceResolver.getResource(request, "path/to/mycomponent");
我只是想知道如何在servlet上下文中获得.json表示
我做了一些事情来解决这个问题,但我想知道是否有其他的方法,因为这个解决方案有很大的局限性。基本上,我在路径上加载节点,并对节点及其子节点执行JSONDUMP。这将允许我从mycomponent.getPath()的资源中获取更大的JSON集,但它不允许我提取通过mycomponent.JSON.jsp创建的自定义JSON视图
任何想法/建议都很好,谢谢。记住,您正在使用JSP页面呈现JSON。如果您使用SlingServlet来实现这一点,有几种方法是可行的,但如果您自己直接编写响应,这并不是最好的方法,特别是因为您有一个JSP视图来完成这一工作 看看这篇文章: 具体而言:
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请求
希望这会有所帮助。要捕获呈现资源的输出,您可以使用
SlingRequestProcessor
服务,该服务在内部发出请求,而无需经过网络层,但仍使用与处理HTTP请求相同的呈现机制
如果您只需要在正在计算的呈现中包含这样的输出,那么可以使用Request.getRequestDispatcher(somePathWithJsonExtension).include(Request,response)
,这就是Sling和CQ include JSP标记所做的
使用
resourcesolver.getResource(…)
不进行任何渲染,它只提供了一个原始资源,即数据/内容对象。问题的标题听起来像是希望获得对/path/to/mycomponent.-1.json
的cURL/AJAX调用,但在Servlet或其他Java类中
可以使用该类将JCR节点转储到具有无限递归的JSONObject中。通过将集合传递到构造函数中,您可以指定要从最终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);
}
}
@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();
}
您也可以使用上面讨论过的类。有关更多示例,请参见
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);
}
}
@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();
}
出于好奇。如果我正在构建某种定制的servlet应用程序,您认为RequestDispatcher会是一种选择吗?比如,如果我们想在/controlPanel上构建一些东西,那么当您点击/controlPanel时,servlet就会呈现出某个JSP或组件。RequestDispatcher将用于聚合由其他组件呈现的内容,但在脚本中使用标记可能更容易。在/controlPanel上创建一个资源,给它一个指向脚本的sling:resourceType,并在其中使用。