いやん、文字コード。
いやぁ、Eclipse3.1に乗り換えた時にですね、
なんかTomcatの設定を間違えちゃったんだか
JSPの@pageディレクティブで
文字コードにWindows-31Jとか、Shift_JIS、MS932とか指定すると…
org.apache.jasper.JasperException: サポートされていないエンコーディングです
…と出てみたり、Tomcat起動時に…
WARNING: Default charset MS932 not supported, using ISO-8859-1 instead
…なんて出てきたりして、
一体何を間違えてしまったんだ?(汗)とか思ってたんだけど。
ググりまくった結果、解決しました(^-^)/
その他もろもろ、最近の些細な問題・エラーと対処した方法をメモ。
トラブル対処に際し、助言や解決方法を教えてくれた皆さん、
どうもありがとう!
さて、まず文字コードのトラブルの件。
Yahoo!グループの「Subject: Re: 突然の日本語化け現象」
によると、charsets.jar にパスを通してやると良いらしい。
- 「Window」メニューの「Preferences...」を選択
- 「Preferences」ウインドウ内の左側から「Tomcat」を選択
- 「JVMの設定」を選択
- 「クラスパス(生成されたクラスパスの前)」で「Jar/Zip」ボタンを押す
- Tomcatを解凍したフォルダ内の「lib」フォルダ内の「charsets.jar」を選択
- 一番下の「Apply」ボタンを押してから「OK」ボタンを押す
- Tomcatを再起動
ちなみに @IT の「Java Solution 会議室」中の
「件名:EclipseでMS932がサポートされていないと言われる」
にて、デフォルト・システム・ライブラリーを使用してれば良いとの事で…
- 「Window」メニューの「Preferences...」を選択
- 「Preferences」ウインドウ内の左側から「Java」を選択
- 「Installed JREs」を選択
- チェックしているJREを選択してから「Edit...」ボタンを押す
- 「Edit JRE」ウインドウ中で「Use default system libraries」にチェックを入れる
- 「OK」ボタンを押す
- 戻ってきた画面で「OK」ボタンを押す
- Tomcatを再起動
…と設定すれば直るはずなんだけど、私の環境下では問題解決しませんでした。
その他、最近くらったちょっとしたトラブルとか。
■JSTL(標準タグライブラリ)の呼び出しにご注意
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
ここでuri中の「jsp」を抜かすと、JSTL1.0を利用する事になり、
サーブレット2.4、JSP2.0以降と一緒に使うと
EL式使った時にエラーが発生する。
■JSP2.0でEL式が使えない
web.xml のweb-appタグのバージョンが古いかも。
-------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<?web-app
version="2.4"
mlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<?!-- 設定をここに書く -->
<?/web-app>
-------------------------------------------------------
■Tomcatプロジェクトでデバッグ時に、デバッガーがソースを追ってくれない
「ウインドウ」メニューの「設定」を選択
「Tomcat」の「Source Path」で、ソースを追って欲しいプロジェクトにチェックを入れる
■フィルタークラスの作り方
Filterをimplementsしたクラスを作る
doFilter() メソッド内に、処理を書く
init() と destroy() メソッドも中身空でいいから作る
chain.doFilter(request, response); の前までが
目的のページに着く前の処理
この行の後がクライアントにHTMLを出力する手前で実行される処理
web.xml にフィルタの設定をする
---------------------------------------------package filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class FilterTest implements Filter {
public void init(FilterConfig config) throws ServletException {
// フィルターが呼ばれた時の処理
// ※必要なら処理を書く
}
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// フィルターをかける目的のサーブレットが実行される前の処理
// ※必要なら処理を書く
// フィルターをかけた目的のサーブレットを実行
chain.doFilter(request, response);
// フィルターをかけた目的のサーブレットの実行後の処理
// ※必要なら処理を書く
}
public void destroy() {
// フィルタークラスのインスタンスが消滅する時の処理
// ※必要なら処理を書く
}
}
web.xml の中に書き込む内容
<web-app...>
<filter>
<filter-name>FilterTest</filter-name>
<filter-class>filter.FilterTest</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterTest</filter-name>
<url-pattern>test.do</url-pattern>
</filter-mapping>
</web-app>
…これ↑をふまえて
■フォームに入力された日本語が化ける場合、
面倒だから文字コード指定のフィルターを全サーブレットにかける。
<web-app...>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>filter.SetCharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
フィルタークラス
package filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class FilterTest implements Filter {
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest)request;
httpServletRequest.setCharacterEncoding("Windows-31J");
chain.doFilter(request, response);
}
public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
}