2015-06-10 3 views
3

В CQ нам нужно обработать jsp внутри сервлета, а затем объединить результат с другими результатами, которые мы получаем с сервера, прежде чем писать обратно в браузер.Получить JSP-выход в Servlet в AEM

Следующий код - это почти то, что нам нужно, за исключением того, что он возвращает результат в браузер после обработки jsp.

RequestDispatcher dispatcher = request.getRequestDispatcher(resource); 
dispatcher.forward(request, response); 

Мы попытались использовать макет ответ следующим образом:

RequestData requestData = new RequestData(slingRequestProcessor, request, mockResponse); 
SlingHttpServletRequest slingRequest = requestData.getSlingRequest(); 
SlingHttpServletResponse slingResponse = requestData.getSlingResponse(); 
RequestDispatcher dispatcher = request.getRequestDispatcher(resource); 
dispatcher.forward(slingRequest, slingResponse); 

но мы получаем вопросы.

+1

Я думаю, вам нужно будет использовать [SlingHttpServletResponseWrapper] (http://docs.adobe.com/docs/en/cq/ 5-6/javadoc/org/apache/sling/api/wrappers/SlingHttpServletResponseWrapper.html), чтобы предотвратить прямой возврат в браузер. – Thomas

ответ

4

Во-первых, на основе вашего описания, похоже, вы хотите использовать requestDispatcher.include, а не requestDispatcher.forward.

Что касается включения содержимого ответа, ответ, который вы передадите на вызов requestDispatcher.include, может быть объектом вашего собственного создания, которое будет записывать свой вывод в строку вместо того, чтобы возвращать его в браузер. Что-то вдоль линий следующих может быть целесообразным:

final ServletOutputStream outputStream = new ServletOutputStream() { 
    public void write(int b) throws IOException { 
     outputBuffer.append((char) b); 
    } 
}; 

SlingHttpServletResponseWrapper responseWrapper = new SlingHttpServletResponseWrapper(response) { 
    public ServletOutputStream getOutputStream() { 
     return outputStream; 
    } 

    public PrintWriter getWriter() throws IOException { 
     return new PrintWriter(outputBuffer); 
    } 

    public SlingHttpServletResponse getSlingResponse() { 
     return super.getSlingResponse(); 
    } 
}; 

После включения outputStream.toString() должен предоставить результат выполнения запроса ресурса.

0

Комбинируя обратную связь, это то, что мы придумали:

//Map<String, Object> jstlValues, final Map<String, Object> propertyValues, String resourceType, SlingHttpServletRequest request, SlingHttpServletResponse response 

    final StringWriter outputBuffer = new StringWriter(); 
    SlingHttpServletResponseWrapper responseWrapper = new SlingHttpServletResponseWrapper(response) { 
     public PrintWriter getWriter() throws IOException { 
      return new PrintWriter(outputBuffer); 
     } 

     public SlingHttpServletResponse getSlingResponse() { 
      return super.getSlingResponse(); 
     } 
    }; 

    ResourceMetadata resourceMetaData = new ResourceMetadata(); 
    resourceMetaData.setResolutionPath("/dummy"); 
    for (Map.Entry<String, Object> entry: jstlValues.entrySet()) { 
     request.setAttribute(entry.getKey(), entry.getValue()); 
    } 

    SyntheticResource resource = new SyntheticResource(request.getResourceResolver(), resourceMetaData, resourceType) { 
     public <T> T adaptTo(Class<T> type) { 
      if (type == ValueMap.class) { 
       ValueMap m = new ValueMapDecorator(propertyValues); 
       return (T) m; 
      } 
      return super.adaptTo(type); 
     } 
    }; 
    RequestDispatcher dispatcher = request.getRequestDispatcher(resource); 
    dispatcher.include(request, responseWrapper); 

    return outputBuffer.toString(); 
Смежные вопросы