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
在servlet中,我们还可以执行以下操作

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,并在其中使用。