サーブレット上で処理の実行はできているものの、日本語の出力が「???」となってしまったときの対処法をまとめておきます。
症状
JSPからデータを追加するクライアントのリクエストを受け取り、Dサーブレットが処理してレスポンスを返すという「Insert」の基本的なコードを書きました。
追加したいデータの入力もでき、実際にデータも問題なく追加されているのですが、「登録が完了しました」という出力画面が「???????」と文字化けされました。
対処法
処理自体はうまくいくけど、出力で文字化けする
こんな場合は、文字エンコーディングに誤りがある可能性が高いです。
文字エンコーディングを「UTF-8」で指定してあげる必要があるのですが、文字エンコーディングは主に2つの盤面でしなくてはなりません。
使用するメソッド | エンコーディングの対象 |
() | リクエストパラメータの取得 |
レスポンスの出力 |
今回の場合では、「出力結果」に文字化けが生じているので、setContentType()メソッドが記述されていない(or 記述に誤りがある)ことが考えられます。
出力するサーブレットの.javaファイルを確認すれば解決です。
改善
ただし、今回のようにクライアントサイドからサーバサイドにデータのやり取りがあるような場合には、その間でフィルタをかませてあげるとより簡単に「文字化け問題」を解決できます。
フィルタを作るには、Filterインタフェースを実装する必要があります。
Filterインタフェースでは3つのメソッドをオーバーライドします。
メソッド名 | 機能 |
init() | フィルタの開始時に呼ばれる |
doFilter() | フィルタが適用されたときに呼び出す |
destory() | フィルタの終了時に呼ばれる |
サンプルコードはこんな感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException { // サーブレットやJSPの呼び出し前に行う処理 chain.doFilter(request, response) // サーブレットやJSPの呼び出し後に行う処理 } public void init(FilterConfig filterconfig) {} public void destroy() {} |
次に実行すべき「フィルタ」があればそれを探しに行って実行します。なければリクエストされたサーブレットやJSPを呼び出します。
今回は1つのフィルタを使うことを想定しているので、FilterChainインタフェースのdoFilter()の前後で「呼び出す前か、後か」が変わることになります。
コメントを残す