ターゲットリソースにアクセスした後に、レスポンスヘッダーを追加または更新することによってレスポンスオブジェクトを変更できます。また、ServletResponseWrapper
または HttpServletResponseWrapper
のいずれかを継承したオブジェクト内にレスポンスをラップすることによって、リクエストメソッド (request.getWriter
メソッドなど) をオーバーライドすることもできます。
レスポンスをカスタマイズするには、リクエストラッパークラスを使用してください。ラッパークラスの詳細については、 「ラッパーの使用」 を参照してください。このセクションでは、ラッパークラスを使用してレスポンスオブジェクトをカスタマイズするフィルタのサンプルを紹介します。
次の例は、レスポンス出力を読み取り、特定の文字列を置き換えます。このサンプルは、"Macromedia" または "Yahoo" という単語が発生するたびに株式表示記号および株式情報のハイパーリンクを付加します。
以下のアクティビティを次のサンプルフィルタコードで記述します。
chain.doFilter
呼び出しで、フィルタは、レスポンスオブジェクトではなく新規ラッパーを渡します。
package jrunsamples.filters; import java.io.*;
import java.util.*; import javax.servlet.*; import javax.servlet.http.*;
public final class ParseFilter extends GenericFilter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { ServletContext context = filterConfig.getServletContext();
PrintWriter out = response.getWriter();
HttpServletResponse resp = (HttpServletResponse)response;
CharWrapper wrapper = new CharWrapper(resp);
chain.doFilter(request, wrapper); String temp = wrapper.toString(); StringTokenizer st = new StringTokenizer(temp," ¥t¥n¥r"); while (st.hasMoreTokens()) {
String word = (String) st.nextToken(); if (word.equals("Macromedia")) { word = word + " (<A HREF=¥"http://finance.yahoo.com/ q?s=macr¥">MACR</A>)"; } else if (word.equals("Yahoo")) { word = word + " (<A HREF=¥"http://finance.yahoo.com/ q?s=yhoo¥">YHOO</A>)"; } out.write(" " + word + " "); } response.setContentLength(temp.length()); out.close(); } }
クラス CharWrapper
は、HttpServletResponseWrapper
を拡張します。このクラスは、次のアクティビティを示しています。
CharArrayWriter
を使用して、getWriter
メソッドをコンストラクタでオーバーライドします。オーバーライドできるのは、getWriter
ではなく getOutputStream
です。両方をオーバーライドすることはできません。
toString
メソッドをオーバーライドして、toString
呼び出しを阻止し、CharArrayWriter
を使用してそれらを出力します。// Sun の "The Essentials of Filters" の CharResponseWrapper クラスに基づ く package jrunsamples.filters; import java.io.*;
import javax.servlet.*; import javax.servlet.http.*;
public class CharWrapper extends HttpServletResponseWrapper {
private CharArrayWriter cawout;
public CharWrapper(HttpServletResponse response){
super(response); cawout = new CharArrayWriter(); }
public String toString() {
return cawout.toString(); }
public PrintWriter getWriter(){
return new PrintWriter(cawout); } }
Web アプリケーションの web.xml デプロイメントディスクリプタで、フィルタを定義し、そのマッピングを追加します。次に例を示します。
<filter>
<filter-name>ParseFilter</filter-name> <filter-class>jrunsamples.filters.ParseFilter</filter-class> </filter>
<filter-mapping>
<filter-name>ParseFilter</filter-name> <url-pattern>/macromedia.html</url-pattern> </filter-mapping>
サーブレットの出力を変更するフィルタの関連サンプルについては、 「リソース」 にリストしたリンクを参照してください。