2014-04-16 61 views
3

如果我們組件資源設置爲這樣:CQ5.5獲取資源的.infinity.json在servlet

  • 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表示。

我已經做了一些解決這個問題,但我想知道是否有替代方法,因爲這個解決方案有很大的侷限性。基本上我加載節點的路徑,並做節點JSONDumps和它的孩子。這將允許我從mycomponent.getPath()的資源獲取更多的JSON集合,但它不允許我拉取通過mycomponent.JSON.jsp創建的自定義JSON視圖。

任何想法/建議會很好,謝謝。

回答

2

這個問題的標題聽起來像你 想要獲得相當於cURL/AJAX調用/path/to/mycomponent.-1.json,但在一個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); 
    } 
} 

您還可以使用org.apache.sling.engine.SlingRequestProcessor類作爲上面討論的Bertrand。有關更多示例,請參閱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(); 
} 
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請求。

希望有所幫助。

5

要捕獲渲染資源的輸出,您可以使用SlingRequestProcessor服務,該服務在內部發出請求而不通過網絡層,但仍使用所有用於處理HTTP請求的相同渲染機制。

如果您只需要在計算的渲染中包含這樣的輸出,則可以使用Request.getRequestDispatcher(somePathWithJsonExtension).include(request, response),這是Sling和CQ包含JSP標記所執行的操作。

使用resourceResolver.getResource(...)不做任何渲染,它只是提供一個原始資源,它是一個數據/內容對象。

+0

出於好奇。如果我正在構建某種自定義servlet應用程序,您認爲RequestDispatcher會是一條路嗎?就像我們想在/ controlPanel中創建一些東西一樣,所以當你點擊/ controlPanel時,servlet呈現出一個特定的JSP或Component。 – Brodie

+0

RequestDispatcher可用於彙總其他組件呈現的內容,但在腳本中使用標記可能更容易。在/ controlPanel創建一個資源,給它一個指向腳本的sling:resourceType,並在那裏使用。 –