レスポンスの処理

ターゲットリソースにアクセスした後に、レスポンスヘッダーを追加または更新することによってレスポンスオブジェクトを変更できます。また、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 を拡張します。このクラスは、次のアクティビティを示しています。

// 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>

サーブレットの出力を変更するフィルタの関連サンプルについては、 「リソース」 にリストしたリンクを参照してください。