Getパラメータのデコードについて
ServletRequest#getParameterメソッドで日本語を受け取るときには、このメソッドより上の部分で、ServletRequest#setCharacterEncodingメソッドを呼び出す必要がある。
また、Tomcatの設定についても以下の内容を変更する必要がある。
対象ファイルは、<Tomcatをインストールしたディレクトリ>\conf\server.xmlで93行目付近の下記項目に赤字の部分を追加する。
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true"
useBodyEncodingForURI="true" />
追加する useBodyEncodingForURI=”true” はURLデコード時にServletRequest#setCharacterEncodingメソッドで指定した文字エンコーディングを使用するための設定です。
ただし、サーブレットAPI2.3以前はパラメータを自前でエンコーディングしていたらしい。
1: String message = request.getParameter("message");
2: message = new String(message.getBytes("ISO8869-1"), "Shift_JIS");
サーブレットフィルタ
サーブレットフィルタはサーブレットやJSPの共通の前後処理を記述するために使用するもの。また、共通処理を記述することもできる。
フィルタの作成方法は、以下の方法で行う。
- javax.servlet.Filterインタフェースを実装したフィルタクラスの作成
- web.xmlにフィルタを登録する
javax.servlet.Filterインタフェースを実装することでinitメソッド、doFilterメソッド、destroyメソッドの3つのメソッドを実装する必要があります。
また、web.xmlファイルにはfilterとfilter-mappingをservletとservlet-mappingのように記述することでどのフィルタをどのURLに適用するか決定できます。また、複数のフィルタを使用する場合は、web.xmlに記載された順番通りにフィルタが適用されます。
さらには、filterに初期値をセットすることも可能なので、文字コードなど可変項目についてはweb.xmlに設定することも可能です。
参考にしている書籍はこちらです。.NETでASP.NETなどは使っていたからかもしれませんが、とてもわかりやすいですね。(先ほど確認したところ、最新版が出ているようなので注意してください。)