2009-12-26 20 views
13

¿Hay alguna manera con la que pueda capturar el contenido dinámico generado en el servidor y obtener ese archivo o cadena objeto de la misma para el servlet.Capturar contenido dinámico generado en el lado del servidor

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

Necesito acceso a contenido dinámico generado en el servidor.

Cualquier ayuda será apreciada.

+1

¿Qué quiere decir contenido dinámico? Imágenes? Páginas web ? Todo esto es posible, pero debe ser más específico. –

+0

Creo que Vishwanath está sugiriendo que el 'contenido dinámico' generado por Javascript en el cliente, por lo tanto, no es accesible para el servidor ... a menos que haya * otra forma * – pavium

+0

Por contenido dinámico quise decir lo que hacemos con las aplicaciones web . El contenido que está en el lado del servidor, que procederá de la base de datos decir que el usuario ha almacenado anteriormente. Para ser simple, solo quiero la página web que creo en el tiempo de ejecución y enviar a webclient, en lugar de enviarla al cliente web, la necesito en el servidor en forma de archivo o decir el objeto de cadena que contiene toda la página. que puedo escribir en el archivo. Saludos cordiales, Vishwanath – Vishwanath

Respuesta

15

Si la solicitud es idempotente (como las solicitudes GET), simplemente utilice 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 POST solicitudes son), entonces usted necesita para crear un Filter cuales wraps la ServletResponse con una implementación personalizada de la PrintWriter con los cinco write() métodos sido invalidada en el que se copia de salida en algún buffer/builder que almacene 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 subsiguientes. 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 a la salida final en cualquier servlet de la solicitud posterior (tenga en cuenta que no puede acceder a ella en cualquier servlet de la corriente solicitud, porque ya es demasiado tarde para hacer algo con él) con sólo el acceso a la CopyWriter en la sesión:

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

en cuenta que debe asignar este filtro en un url-pattern cubriendo las páginas JSP de interés y por lo tanto no en /* más o menos, de lo contrario se correría el archivos estáticos (css, js, imágenes, etc.) que están incluidos 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 utilizando un url-pattern adecuado u otra forma de almacenarlo en sesión, p. en sabor de un Map<URL, CopyWriter> más o menos.

Espero que esto ayude.

+0

Eso fue genial. La respuesta exacta que quería, supongo. Aunque no estoy muy versado con el JSP y los filtros. Pero tengo la manera de comenzar. Y creo que Balu me ha dado todo lo que necesito saber cuando trato con cualquier tipo de situación. Gracias Balu. Saludos, Vishwanath – Vishwanath

0

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

Here es un pequeño tutorial sobre el uso de servlets.

0

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

Una nota lateral 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 dinámico representado por objetos, hacer cualquier procesamiento que necesite, establecer estos datos para que los JSP puedan acceder (en request attribute por ejemplo), acceda y formatee para el cliente en el JSP. Para familiarizarse, echa un vistazo a Story of a Servlet: An Instant Tutorial, The Java™ EE 5 Tutorial on Web tier.

+0

Conozco MVC y servlets. Para ser precisos, sé de servlets más que JSPs. Y malinterpretaste mi pregunta. Necesito la página web generada dinámicamente en el lado del servidor. Eso es todo lo que necesito, la plantilla HTML http://html-tmpl-java.sourceforge.net/ es una forma de hacerlo. Pero su tecnología anterior quería saber cómo se puede hacer con JSP y Servlets. Saludos cordiales, Vishwanath – Vishwanath

+0

Quizás deba consultar uno de los idiomas de plantilla de Java en: http://java-source.net/open-source/template-engines, yo personalmente prefiero freemarker. –

+0

¡Ese fue un buen enlace que proporcionaste a Zoran Regvart! Gracias por eso . – Vishwanath

2

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

Se puede utilizar un Filter y crear un envoltorio de su HttpServletResponse, anular algunos write métodos y capturar todo el contenido que se envía al navegador.

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

+0

Esto es exactamente lo que necesitaba, realmente lo agradeceré si continúa con su respuesta. La razón por la que estaba preguntando esto es, mi organización utiliza HTML Template: java para hacer el thingie dinámico. En realidad, un marco desarrollado por ellos mismos en HTML Template: java que puede hacer lo mencionado anteriormente, pero no fue capaz de obtener cómo puedo hacer esto con los JSP o servlets. Saludos, Vishwanath – Vishwanath

+0

Más bien necesita reemplazar los cinco métodos 'write', no los' 'print (ln)'. – BalusC

Cuestiones relacionadas