这可能有点令人困惑,但我遇到了一些麻烦。我的目标是获取输入的HTML文档,然后处理该文档并使用HTML数据输出图像文档。例如,用户将请求一个URL,在查询字符串中使用一些action = png,然后将为该URL和输出图像文档调用过滤器。如何使用Java中的过滤器输出基于HTML文档的二进制文档
我已经尝试了一切,但在我的环境(Websphere)中,我只能输出一种类型。如果输入类型是text/html,那么我只能输出一个文本文档,我似乎无法输出二进制文档。为什么?因为每次都会收到非法的状态异常。
[1/29/09 17:59:57:576 EST] 00000020 SystemErr R java.lang.IllegalStateException:SRVE0209E:作者已经获得 [1/29/09 17:59:57:576 EST] 00000020 SystemErr [R在com.ibm.ws.webcontainer.srt.SRTServletResponse.getOutputStream(SRTServletResponse.java:505)
我使用伪代码不透露我的所有代码:
<filter>
<filter-name>TestFilter</filter-name>
<filter-class>
com.util.TestFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>/index_test2.html</url-pattern>
</filter-mapping>
包装类代码基本上是这样的:
public class ContentCaptureServletResponse extends HttpServletResponseWrapper {
private ByteArrayOutputStream contentBuffer;
private PrintWriter writer;
public PrintWriter getWriter() throws IOException {
if (writer == null) {
contentBuffer = new ByteArrayOutputStream();
writer = new PrintWriter(contentBuffer);
}
return writer;
}
public String getContent(){
try {
writer = getWriter();
} catch (IOException e) {
e.printStackTrace();
}
writer.flush();
String xhtmlContent = new String(contentBuffer.toByteArray());
System.out.println(xhtmlContent);
return xhtmlContent;
}
}
和过滤器的代码是这样的:
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
final String renderType = request.getParameter("R");
final String renderClassName = request.getParameter("C");
if ((renderType != null) && (renderClassName != null)) {
try {
this.setFilterChain(filterChain);
response.setContentType("image/png");
PrintWriter out = response.getWriter();
// I call getWriter but not BOTH!
//response.getOutputStream();
response.getWriter();
// Build up the HTML document into a string.
CaptureResponse capContent = new CaptureResponse(response);
this.mainFilterChain.doFilter(req,);
String myString = capHtmlContent.getContent();
// What I really want to do here is output an output stream
// so I can write a binary image
processStr(myString);
response.getOutputStream();
response.write(binaryimage)
} catch (Exception e) {
e.printStackTrace();
}
// No data will be output to the user.
} else {
filterChain.doFilter(request, response);
} // End of if-else
} // End of the method.
,如果我想采取一些输入HTML文本文档代码工作。我假设是因为公开的printwriter流。但是我遇到了不同格式的问题。基本上,因为我不能调用response.getOutputStream()
我想我可能已经想通了。我可以使用'response.getOutputstream'。但是我有代码,浏览器不会重建页面,所以看起来我得到了一个零响应。基本上,我的方法将起作用。 – 2009-01-30 00:02:40
你能解释为什么你需要使用response.getWriter()吗? – 2009-01-30 00:07:47