ここから UpperCaseFilter および CharResponseWrapper クラスをダウンロードしました。
UpperCaseFilter.java
package filters;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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 UpperCaseFilter implements Filter {
protected FilterConfig config;
public void init(FilterConfig config) throws ServletException {
this.config = config;
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws ServletException, IOException {
ServletResponse newResponse = response;
System.out.println("UpperCasefilter begin");
if (request instanceof HttpServletRequest) {
newResponse = new CharResponseWrapper((HttpServletResponse) response);
}
chain.doFilter(request, newResponse);
System.out.println("UpperCaseFilter end");
if (newResponse instanceof CharResponseWrapper) {
String text = newResponse.toString();
if (text != null) {
text = text.toUpperCase();
response.getWriter().write(text);
}
}
}
}
CharResponseWrapper.java
package filters;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
class CharResponseWrapper extends HttpServletResponseWrapper {
protected CharArrayWriter charWriter;
protected PrintWriter writer;
protected boolean getOutputStreamCalled;
protected boolean getWriterCalled;
public CharResponseWrapper(HttpServletResponse response) {
super(response);
charWriter = new CharArrayWriter();
}
public ServletOutputStream getOutputStream() throws IOException {
if (getWriterCalled) {
throw new IllegalStateException("getWriter already called");
}
getOutputStreamCalled = true;
return super.getOutputStream();
}
public PrintWriter getWriter() throws IOException {
if (writer != null) {
return writer;
}
if (getOutputStreamCalled) {
throw new IllegalStateException("getOutputStream already called");
}
getWriterCalled = true;
writer = new PrintWriter(charWriter);
return writer;
}
public String toString() {
String s = null;
if (writer != null) {
s = charWriter.toString();
}
return s;
}
}
web.xml ファイルを次のように変更します。
<filter>
<filter-name>Filter1</filter-name>
<filter-class>filters.UpperCaseFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
また、メインの Apache Foundation Web サイトから「apache-tomcat-6.0.37」をダウンロードしました。
Web アプリを実行すると、System.out.println() ステートメントが実行されているのを確認できるので、UpperCaseFilter クラスが実行されていることがわかります。
ただし、どのhttp://127.0.0.1:8080
文字にも大文字で移動するときはありません。すべてが正常に見えます (標準の Tomcat ホームページ)。
これをデバッグするために、「./catalina.sh jpda start」を実行することにしました。CharWrapperResponse.getWriter() 関数が呼び出されないため、「ライター」オブジェクトが初期化されないことに気付きました。したがって、UpperCaseFilter が CharResponseWrapper.toString() を呼び出すと、ライターが null であるため、"text" 変数は null になります (つまり、writer=null のため、テキストに何も書き込めません)。
UpperCaseFilter.getWriter() が呼び出されない理由がわかりません。