いわずと知れたJ2EEサーバーで、「Servlet」「JSP」「EL」など基本的なものが利用できる。

背景

最近では「GlassFish」がいい。

2000年の初めから中頃にかけては、J2EEサーバーの製品は重くて起動に時間がかかった。
そのため起動が速かったTomcatは、開発ではよく利用されたし今もなんとなく使われている。

最近ではGlassFish等も起動スピードが改善されているので、そちらの方の利用を考える方が良い。
理由としては、TomcatではJMSをはじめとするJ2EEの他の機能が利用できない。

このようにGlassFishに移行する方が良いと思うが、実際には実務ではまだよくTomcatは利用される。
いろんなもの最新にしたがるのに、J2EEサーバーを最新にしたがらないのはなんでだろうか。

備忘録

Tomcatのバージョンと対応する仕様の一覧

Tomcat Servlet JSP EL
Tomcat 8 3.1 2.3 3.0
Tomcat 7 3.0 2.2 2.2
Tomcat 6 2.5 2.1  
Tomcat 5 2.4 2.0  

GETにおける文字化け

デフォルト設定で、GETリクエスト送信に日本語を含めると文字化けが起る。
よって、conf/server.xmlの「Connector」タグの属性にに次の設定を追加する。

追加する設定

useBodyEncodingForURI="true"

追加する場所

<Connector acceptCount="100" connectionTimeout="20000"
           disableUploadTimeout="true" enableLookups="false"
           maxHttpHeaderSize="8192" maxSpareThreads="75" maxThreads="150"
           minSpareThreads="25" port="8080" redirectPort="8443"
           useBodyEncodingForURI="true" />

この設定がないと、request.setCharacterEncoding()をいくらしても無効。

デフォルトエンコード以外のHTMLファイルの文字化け

Tomcatは、HTTPヘッダのContent-Typeにデフォルトの文字コードでレスポンスを返す。
それは、HTMLファイルの<meta>タグのcontentTypeをいくら設定しても反映してくれない。
これにより、デフォルトエンコード以外のHTMLファイルはすべて文字化けしてしまうことになる。

このとき、ServletやJSPはcontentTypeを設定できるので問題ない。
HTMLファイルは静的なためそういったこともでない。

よって、特定のHTMLだけ違うエンコードにしたい場合は、サーブレットを経由してrequest.setContentType()を設定する。
そして、HTMLファイルにフォワードする必要がある。

IPアドレスの取得について

Tomcatでは、次の起動オプションを追加しておかないと「IPv6」形式になってしまいます。
このオプションを追加することでIPv4でのIPアドレス取得が可能になる。

-Djava.net.preferIPv4Stack=true

サーブレットではrequest.getRemoteAddr()を使うことで、クライアントのIPアドレスを取得することができる。
これにより、IPアドレスによるアクセスの制御などを行うことができる。