Apache Tomcatをベースにした製品だと、JDKではなくJREがバンドルされていて、JSP(Java Server Pages)は既に事前コンパイルされているなんてことがよくあります。先週は、ちょっと元のJSPに手を入れなきゃいけなくて、久しぶりに触らなきゃいけない羽目になりました。

使ってないとすぐ忘れちゃうなぁ、、、、

まずJSPの文字化けで軽くハマる



最終的にJSPで表示される文字セットはUTF-8にしたいわけですが、いろいろと途中段階があるんで軽くハマります。今回はWindows環境で書いたりコンパイルするので以下のようにしました。編集も楽ですしね。

・JSPはShift_JIS(=Windows-31J)で書くことにする
・JSPから生成されるJavaコードはUTF-8にすることにする
・JavaのコードがUTF-8であるとしてコンパイルする

まず、お膳立てとして記述する日本語が含まれるJSPはShift_JISで保存し、pageディレクティブは以下のように記述します。表示される時(=contentType)の文字セットはUTF-8なんだけど、JSPは自体はWindows-31Jで書かれているよ(=pageEncoding)ってことです。

<%@ page contentType="text/html;charset=utf-8" pageEncoding="Windows-31J"%>


昔はApache Antも比較的真面目にウォッチしてたんですが最近はホントご無沙汰で、build.xmlのテンプレートファイルをコピッってbuild.propertiesをちょこちょこっとイジるだけなんです。今回はちょっと手を入れる必要があります。

jasperに関しては特に文字セットについてはイジルところは無しで、JavaのコンパイルのところだけJavaのソースコードがUTF-8で書かれているのでbuild.xmlのjavacタスクでencodingを指定します。

<javac destdir="./target/classes.part"
   optimize="off"
   debug="on" failonerror="false"
   srcdir="./target/java.part/org/apache/jsp"
   encoding="UTF-8">


でJSPのコンパイル



日本語の問題はこれで解決されたとして、次はJSPのコンパイルですが、Antにはjspcタスクもあるんですけど、参考にしたページがそれを使わずにやっていたのでそうしてみました。何か問題があるのかな、、、

ITmediaエンタープライズ: Java Tips; JSPをデプロイする前にチェックするには
jajakarta.org: Tomcat5サーブレット/JSPコンテナ Jasper 2 JSP Engineの設定方法
org.apache.jasper.JspC Class

<target name="jspc2">
 <taskdef name="jasper2" classname="org.apache.jasper.JspC" >
  <classpath id="jspc.classpath">
   <pathelement location="${java.home}/../lib/tools.jar"/>
   <fileset dir="${tomcat.home}/bin">
    <include name="*.jar"/>
   </fileset>
   <fileset dir="${tomcat.home}/server/lib">
    <include name="*.jar"/>
   </fileset>
   <fileset dir="${tomcat.home}/common/lib">
    <include name="*.jar"/>
   </fileset>
  </classpath>
 </taskdef>
 <jasper2
      package="org.apache.jsp.hoge"
      uriroot="./src"
      outputDir="./target/java.part"
 />
</target>


今回、個人的に重要だったのはpackage=でパッケージ名を指定できること。デフォルトでは org.apache.jsp パッケージになりますけど、これを自由に "jp.hoge" とか好きに設定できるわけです。