frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

いやん、文字コード。

いやぁ、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 にパスを通してやると良いらしい。

  1. 「Window」メニューの「Preferences...」を選択
  2. 「Preferences」ウインドウ内の左側から「Tomcat」を選択
  3. JVMの設定」を選択
  4. 「クラスパス(生成されたクラスパスの前)」で「Jar/Zip」ボタンを押す
  5. Tomcatを解凍したフォルダ内の「lib」フォルダ内の「charsets.jar」を選択
  6. 一番下の「Apply」ボタンを押してから「OK」ボタンを押す
  7. Tomcatを再起動

ちなみに @IT の「Java Solution 会議室」中の

件名:EclipseでMS932がサポートされていないと言われる

にて、デフォルト・システム・ライブラリーを使用してれば良いとの事で…

  1. 「Window」メニューの「Preferences...」を選択
  2. 「Preferences」ウインドウ内の左側から「Java」を選択
  3. 「Installed JREs」を選択
  4. チェックしているJREを選択してから「Edit...」ボタンを押す
  5. 「Edit JRE」ウインドウ中で「Use default system libraries」にチェックを入れる
  6. 「OK」ボタンを押す
  7. 戻ってきた画面で「OK」ボタンを押す
  8. 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() {

}

}