Capture contenido dynamic generado en el lado del servidor

¿Hay alguna manera con la que pueda capturar el contenido dynamic generado en el servidor y obtener ese archivo o cadena objeto de la misma para el servlet.

Podemos generar contenido dynamic con JSP, pero no tenemos acceso al contenido dynamic generado en el servidor. Tan pronto como lo hagamos, el contenedor directo genera el contenido dynamic y lo envía a la respuesta.

Necesito acceso al contenido dynamic generado en el servidor.

Cualquier ayuda será apreciada.

Si la solicitud es idempotente (como las solicitudes GET ), simplemente use java.net.URL para obtener un InputStream de la salida JSP. P.ej

 InputStream input = new URL("http://localhost/context/page.jsp").openStream(); 

Si la solicitud no es idempotente (como son las solicitudes POST ), entonces necesita crear un Filter que envuelva ServletResponse con una implementación personalizada de PrintWriter con los cinco métodos write() anulados en donde copia el resultado en algún buffer / builder que almacena en la sesión o una carpeta temporal en el sistema de archivos del disco local para que se pueda acceder posteriormente en las solicitudes posteriores. P.ej

 package mypackage; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.Writer; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; public class CopyResponseFilter implements Filter { public void init(FilterConfig config) throws ServletException { // NOOP. } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // Set character encoding for better world domination. response.setCharacterEncoding("UTF-8"); // Create copy writer. HttpServletResponse httpResponse = (HttpServletResponse) response; CopyWriter copyWriter = new CopyWriter(new OutputStreamWriter( httpResponse.getOutputStream(), httpResponse.getCharacterEncoding())); // Filter request with response which is wrapped with new writer. chain.doFilter(request, wrapResponse(httpResponse, copyWriter)); // Store the copy writer afterwards in session so that it's available in next request. HttpServletRequest httpRequest = (HttpServletRequest) request; httpRequest.getSession().setAttribute("copyWriter", copyWriter); } public void destroy() { // NOOP. } private static HttpServletResponse wrapResponse (final HttpServletResponse response, final PrintWriter writer) { return new HttpServletResponseWrapper(response) { public PrintWriter getWriter() throws IOException { return writer; } }; } } class CopyWriter extends PrintWriter { StringBuilder copy = new StringBuilder(); public CopyWriter(Writer out) { super(out); } public void write(int c) { copy.append((char) c); // It is actually a char, not an int. super.write(c); super.flush(); } public void write(char[] chars) { copy.append(chars); super.write(chars); super.flush(); } public void write(char[] chars, int offset, int length) { copy.append(chars, offset, length); super.write(chars, offset, length); super.flush(); } public void write(String string) { copy.append(string); super.write(string); super.flush(); } public void write(String string, int offset, int length) { copy.append(string, offset, length); super.write(string, offset, length); super.flush(); } public String getCopy() { return copy.toString(); } } 

Puede acceder al resultado final en cualquier servlet de la solicitud subsiguiente (tenga en cuenta que no puede acceder a él en ningún servlet de la solicitud actual , porque ya es demasiado tarde para hacer algo con él) simplemente accediendo al CopyWriter en la sesión:

 CopyWriter copyWriter = (CopyWriter) request.getSession().getAttribute("copyWriter"); String outputOfPreviousRequest = copyWriter.getCopy(); 

Tenga en cuenta que debe mapear este filtro en un url-pattern cubra las páginas de interés JSP y, por lo tanto, no en /* o de lo contrario, se ejecutará en archivos estáticos (css, js, imágenes, etc.) que se incluyen en el mismo JSP también.

También tenga en cuenta que las solicitudes múltiples dentro de la misma sesión se anularían entre sí, depende de usted distinguir entre esas solicitudes mediante el uso de un url-pattern adecuado u otra forma de almacenarlo en sesión, por ejemplo, en el sabor de un Map más o menos.

Espero que esto ayude.

Por lo que entiendo tu objective, quieres almacenar el contenido generado. Si bien no puedo pensar en ninguna razón para hacer esto, es posible.

Puede usar un Filter y crear un contenedor de su HttpServletResponse , anular algunos métodos de write y capturar todo el contenido que se enviará al navegador.

Editar: La respuesta de BalusC es la extensión exacta que necesita, así que no entraré en los detalles.

Debe tener acceso a los servlets apropiados del lado del servidor o puede escribir su servlet.

Aquí hay un pequeño tutorial sobre el uso de servlets.

Lo importante a tener en cuenta es que las JSP se comstackn a los servlets a través del comstackdor JSP (que podría generar código java a la mitad), por lo que cualquier cosa que pueda hacer en un JSP lo puede hacer con los servlets.

Una nota al margen sobre el tema: debe tener en cuenta MVC , en general los servlets actúan como controladores, JSP como vista, y cualquier estructura de datos (java y similares) actúa como el modelo.

Para su problema, debe generar el contenido / datos en el servlet – este es su contenido dynamic representado por objetos, hacer el procesamiento que necesite, configurar estos datos para que los JSP puedan acceder a él (por ejemplo, en el atributo de solicitud ), acceder y formatee para el cliente en el JSP.

Para familiarizarse, consulte la Historia de un servlet: un tutorial instantáneo , el tutorial Java ™ EE 5 en el nivel web .