サーブレット上で処理の実行はできているものの、日本語の出力が「???」となってしまったときの対処法をまとめておきます。

 

症状

JSPからデータを追加するクライアントのリクエストを受け取り、Dサーブレットが処理してレスポンスを返すという「Insert」の基本的なコードを書きました。

追加したいデータの入力もでき、実際にデータも問題なく追加されているのですが、「登録が完了しました」という出力画面が「???????」と文字化けされました。

 

対処法

処理自体はうまくいくけど、出力で文字化けする

こんな場合は、文字エンコーディングに誤りがある可能性が高いです。

文字エンコーディングを「UTF-8」で指定してあげる必要があるのですが、文字エンコーディングは主に2つの盤面でしなくてはなりません。

 

使用するメソッド エンコーディングの対象
setCharacterEncoding() リクエストパラメータの取得
setContentType() レスポンスの出力

 

今回の場合では、「出力結果」に文字化けが生じているので、setContentType()メソッドが記述されていない(or 記述に誤りがある)ことが考えられます。

出力するサーブレットの.javaファイルを確認すれば解決です。

 

改善

ただし、今回のようにクライアントサイドからサーバサイドにデータのやり取りがあるような場合には、その間でフィルタをかませてあげるとより簡単に「文字化け問題」を解決できます。

 

フィルタを作るには、Filterインタフェースを実装する必要があります。

Filterインタフェースでは3つのメソッドをオーバーライドします。

メソッド名 機能
init() フィルタの開始時に呼ばれる
doFilter() フィルタが適用されたときに呼び出す
destory() フィルタの終了時に呼ばれる

 

サンプルコードはこんな感じです。

 

FilterChainインタフェースのdoFilterメソッドは、次に実行すべき「フィルタ」があればそれを探しに行って実行します。なければリクエストされたサーブレットやJSPを呼び出します。

今回は1つのフィルタを使うことを想定しているので、FilterChainインタフェースのdoFilter()の前後で「呼び出す前か、後か」が変わることになります。

ちなみにフィルタを複数使う場合は、フィルタの順序はweb.xmlで指定します。