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.
¿Qué quiere decir contenido dinámico? Imágenes? Páginas web ? Todo esto es posible, pero debe ser más específico. –
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
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