これは少し混乱するかもしれませんが、私はいくつかの問題を抱えています。私の目標は、入力 HTML ドキュメントを取得し、そのドキュメントを処理し、HTML データを使用して画像ドキュメントを出力することです。たとえば、ユーザーがクエリ文字列に action=png を含む URL を要求すると、その URL に対してフィルターが呼び出され、画像ドキュメントが出力されます。
私はすべてを試しましたが、私の環境 (Websphere) では、1 つのタイプしか出力できません。入力タイプが 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 at 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() を呼び出すことができないためです。