Se la richiesta è idempotente (come ad esempio le richieste GET
), utilizzare semplicemente java.net.URL
per ottenere un InputStream dell'output JSP. Per esempio.
InputStream input = new URL("http://localhost/context/page.jsp").openStream();
Se la richiesta non è idempotente (come POST
richieste sono), quindi è necessario creare un Filter
che wraps la ServletResponse
con un'implementazione personalizzata del PrintWriter
con i cinque write()
metodi stato uno scostamento in cui si copia in uscita in un buffer/builder memorizzato nella sessione o una cartella temporanea sul file system del disco locale in modo che possa essere successivamente richiamato nelle richieste successive. Per esempio.
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();
}
}
È possibile accedere l'output finale in ogni servlet della successiva richiesta (si noti che è l'accesso che non può in qualsiasi servlet della corrente richiesta , perché è già troppo tardi per fare qualcosa con esso) semplicemente accedendo al CopyWriter
nella sessione:
CopyWriter copyWriter = (CopyWriter) request.getSession().getAttribute("copyWriter");
String outputOfPreviousRequest = copyWriter.getCopy();
nota che si dovrebbe mappare questo filtro su un url-pattern
che copre le pagine JSP di interesse e quindi non su /*
o giù di lì, altrimenti si correrebbe il file statici (css, js, immagini, ecc.) che sono inclusi nello stesso JSP.
Si noti inoltre che più richieste all'interno della stessa sessione si annulleranno a vicenda, spetta a te distinguere tra quelle richieste utilizzando un opportuno url-pattern
o un altro modo di memorizzarlo in sessione, ad es. nel sapore di un Map<URL, CopyWriter>
o così.
Spero che questo aiuti.
Cosa intendi con contenuto dinamico? Immagini ? Pagine web ? Tutto questo è possibile, ma devi essere più specifico. –
Penso che Vishwanath suggerisca che il "contenuto dinamico" generato da Javascript nel client, non è quindi accessibile al server ... a meno che non ci sia * un altro modo * – pavium
Per contenuto dinamico intendevo quello che facciamo con le applicazioni web . Il contenuto che si trova sul lato server, da cui proviene, indica il database che l'utente ha precedentemente memorizzato. Per essere semplici, voglio solo la pagina web che creo in fase di esecuzione e la invio al webclient, invece di inviarla al webclient ne ho bisogno sul lato server in forma di file o di dire oggetto stringa contenente l'intera pagina. che posso scrivere su file. Cordiali saluti, Vishwanath – Vishwanath