Matt said:
If the JSP page regularly appears correctly in a browser, the problem will
probably be in your code. Show us the code for reading the output and
writing the file. You may not be reading all the output or closing the file
properly.
Cheers,
Matt Humphrey (e-mail address removed)
http://www.iviz.com/
Here it is:
package filtertest;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import java.net.*;
import java.util.*;
public class PrePostFilterMain extends GenericFilter {
public void doFilter(final ServletRequest request,
final ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
OutputStream out = response.getOutputStream();
GenericResponseWrapper wrapper =
new GenericResponseWrapper((HttpServletResponse) response);
wrapper.setBufferSize(16384);
chain.doFilter(request, wrapper);
// look up file name that matches the original request URL
String filename = null;
String requestedPage = ((HttpServletRequest) request).getServletPath();
requestedPage =
requestedPage.substring(requestedPage.lastIndexOf('/') + 1);
ServletContext sc = getFilterConfig().getServletContext();
if (sc == null)
throw new javax.servlet.ServletException("Servlet context missing");
filename = sc.getInitParameter(requestedPage + ".file");
if (filename == null)
throw new javax.servlet.ServletException("lookup of property \"" +
requestedPage + ".file\"
failed");
byte[] data = wrapper.getData();
createFile(data, filename);
out.write(("<hr>PrePostFilterMain output sent to file: " + filename
+ ": " +
data.length + "/" + wrapper.getContentLength() + "
bytes<hr>").getBytes());
out.write(data);
out.write("<hr>FilterTest Post<hr>".getBytes());
out.flush();
out.close();
}
public void createFile(byte[] data, String filename)
throws IOException {
ServletContext sc = getFilterConfig().getServletContext();
String path = sc.getRealPath(filename);
FileOutputStream fos = new FileOutputStream(path);
fos.write(data);
fos.flush();
fos.close();
}
}
//------------------------------------------------------------
package filtertest;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import java.net.*;
import java.util.*;
public class GenericFilter implements javax.servlet.Filter {
private FilterConfig fc;
public GenericFilter() { }
public void doFilter(final ServletRequest request,
final ServletResponse response,
FilterChain chain)
throws java.io.IOException, javax.servlet.ServletException {
chain.doFilter(request, response);
}
public FilterConfig getFilterConfig() {
return fc;
}
public void init(FilterConfig fc) {
this.fc = fc;
}
public void destroy() {
this.fc = null;
}
}
//--------------------------------------------------------------------
package filtertest;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import java.net.*;
import java.util.*;
public class GenericResponseWrapper extends HttpServletResponseWrapper {
private ByteArrayOutputStream output;
private int contentLength;
private String contentType;
public GenericResponseWrapper(HttpServletResponse response) {
super(response);
output = new ByteArrayOutputStream();
}
public ServletOutputStream getOutputStream() {
return new FilterServletOutputStream(output);
}
public byte[] getData() {
return output.toByteArray();
}
public PrintWriter getWriter() {
return new PrintWriter(getOutputStream(), true);
}
public void setContentType(String type) {
this.contentType = type;
super.setContentType(type);
}
public String getContentType() {
return this.contentType;
}
public int getContentLength() {
return contentLength;
}
public void setContentLength(int length) {
this.contentLength = length;
super.setContentLength(length);
}
}