Capture conteúdo dynamic gerado no lado do servidor

Existe alguma maneira com a qual eu possa capturar conteúdo dynamic gerado no lado do servidor e obter esse arquivo ou object de string do mesmo para o servlet.

Podemos gerar conteúdo dynamic com JSPs, mas não temos access ao conteúdo dynamic gerado no lado do servidor. Assim que fazemos, o container forward gera o conteúdo dynamic e o envia para a resposta.

Preciso acessar o conteúdo dynamic gerado no lado do servidor.

Qualquer ajuda será apreciada.

Se a solicitação for idempotente (como as solicitações GET ), use java.net.URL para obter um InputStream da saída JSP. Por exemplo

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

Se a solicitação não for idempotente (como são as solicitações POST ), será necessário criar um Filter que ServletResponse o ServletResponse com uma implementação personalizada do PrintWriter com os cinco methods write() substituídos em que você copia a saída para algum buffer / construtor que você armazena na session ou em uma pasta temporária no sistema de arquivos do disco local, para que possa ser acessada posteriormente nas solicitações subsequentes. Por exemplo

 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(); } } 

Você pode acessar a saída final em qualquer servlet da solicitação subsequente (observe que você não pode acessá-la em nenhum servlet da solicitação atual , porque já é tarde demais para fazer algo com ela) acessando apenas o CopyWriter na session:

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

Observe que você deve mapear esse filtro em um url-pattern cobrindo as páginas JSP de interesse e, portanto, não em /* ou então, caso contrário, ele seria executado em arquivos estáticos (css, js, imagens, etc) que estão incluídos no mesmo JSP também.

Observe também que várias solicitações dentro da mesma session se sobrepõem, cabe a você distinguir entre essas solicitações usando um url-pattern adequado ou outra maneira de armazená-las na session, por exemplo, no sabor de um Map ou então.

Espero que isto ajude.

Tanto quanto eu entendo o seu objective, você deseja armazenar o conteúdo gerado. Embora eu não consiga pensar em nenhum motivo para fazer isso, é possível.

Você pode usar um Filter e criar um wrapper do seu HttpServletResponse , replace alguns methods de write e capturar todo o conteúdo que será enviado ao navegador.

Editar: A resposta da BalusC é a extensão exata que você precisa, então não vou entrar em detalhes.

Você precisa ter access a servlets apropriados no servidor ou pode escrever seu servlet.

Aqui está um pequeno tutorial sobre o uso de servlets.

É importante notar que as JSPs são compiladas para servlets por meio do compilador JSP (que pode gerar código java no meio do caminho), portanto, qualquer coisa que você possa fazer em um JSP que você pode fazer com servlets.

Nota de um lado sobre o assunto: você deve estar ciente do MVC , em geral os servlets atuam como Controladores, JSPs como View e quaisquer estruturas de dados (java beans e outros) atuam como o Model.

Para o seu problema, você deve gerar o conteúdo / dados no servlet – este é seu conteúdo dynamic representado por objects, faça o processamento necessário, defina esses dados para que os JSPs possam acessá-los (no atributo request, por exemplo), access e formate-o para o cliente no JSP.

Para se familiarizar, você deve verificar a História de um Servlet: um tutorial instantâneo , o tutorial Java ™ EE 5 na camada da Web .