JSPの動作確認は,通常,Tomcatにデプロイし,ブラウザでアクセスと手順をとります。Tomcatには,JSPをコンパイルするツールとしてJSPコンパイラが付属しており,Tomcatにデプロイする前にエラーがないかチェックすることが可能です。ここでは,JSPコンパイラの基本的な使い方を紹介します。
Webアプリの開発を行っているとJSPをデプロイする前に,エラーがないかチェックしたいときがあります。TomcatにデプロイされたJSPは,JSPエンジンであるJasper/Jasper2によってJavaソースコードに変換され,さらにJavaクラスファイルにコンパイルされます。この一連の作業を,Tomcatにデプロイする前に行ってみたいと思います。準備するツールはAntとJ2SDKです。Antは最新の1.6.1を使用します。Tomcatは,4.1系と5.0系の両方がターゲットで,動作環境はWindows XPとします。
テスト用のJSP(リスト1)とJSPをプリコンパイルするビルドファイルを同じディレクトリに作成します。
リスト1 test.jsp
<%@ page contentType="text/html; charset=Windows-31J" %>
<html>
<head>
<title>test</title>
</head>
<body>
<h2>test</h2>
<%=new java.util.Date()%>
</body>
</html>
ビルドファイルは,Tomcatに付属するドキュメント「User Guide - 11)JSPs」で紹介されているものを参考に作成します。なお,AntにはJSPをコンパイルするjspcタスクが用意されていますが,ここでは利用しません。
リスト2 JSPからJavaソースファイルを生成(build.xml)
<project name="JSP Precompilation" default="jspc" basedir=".">
<target name="jspc">
<taskdef classname="org.apache.jasper.JspC" name="jasper2" >
<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
uriroot="./"
outputDir="./"
/>
</target>
</project>
実行は,antコマンドのパラメータとしてtomcat.homeにTomcatがインストールされたディレクトリのパス名を指定して行います。下に示す例のように,パス名に空白文字を含んでいる場合は,"(ダブルクォーテーション)で囲む必要があります。
> ant -Dtomcat.home="C:\Program Files\Apache Software Foundation\Tomcat 5.0"
JSPに誤りがなければ,実行したディレクトリ以下にorg/apache/jspディレクトリが作られ,その中にtest_jsp.javaファイルが作成されます。この段階は,JSPからJavaソースを生成するだけです。pageディレクティブの記述ミスのようなJSPの文法エラーは,次に示すような例外が発生し,この段階でわかります。
jspc:
[jasper2] 2004-06-25 12:26:11 - エラー: ファイル '\test.jsp' は次の例外を発生
しました:
BUILD FAILED
C:\user\jsp\build.xml:23: org.apache.jasper.JasperException: Error compiling \te
st.jsp
JSPからJavaソースファイルを生成しただけでは,Javaの構文チェックは行われていません。ビルドファイルを修正して,Javaソースファイルをコンパイルする機能を追加します(リスト3)。
リスト3 JSPからクラスファイルを生成(build.xml)
<project name="JSP Precompilation" default="all" basedir=".">
<target name="all" depends="jspc,compile" />
<target name="jspc">
<taskdef classname="org.apache.jasper.JspC" name="jasper2" >
<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
uriroot="./"
outputDir="./"
/>
</target>
<target name="compile">
<javac destdir="./org/apache/jsp"
optimize="off"
debug="on" failonerror="false"
srcdir="./org/apache/jsp">
<classpath>
<pathelement location="${tomcat.home}/common/classes"/>
<fileset dir="${tomcat.home}/common/lib">
<include name="*.jar"/>
</fileset>
<pathelement location="${tomcat.home}/shared/classes"/>
<fileset dir="${tomcat.home}/shared/lib">
<include name="*.jar"/>
</fileset>
<fileset dir="${tomcat.home}/bin">
<include name="*.jar"/>
</fileset>
</classpath>
</javac>
</target>
</project>
太字の部分が,修正または追加した部分です。JSPから生成したJavaソースファイルをコンパイルするだけなら,jasper2要素に次の太字で示したcompile属性とその値として"true"を追加するだけも可能です。
<jasper2
uriroot="./"
outputDir="./"
compile="true"
/>
この場合,Javaの構文エラーが発生しても,エラーの場所がわかるログを出力しません。今回の目的はJSPのチェックが目的ですから,javacタスクを使用しました。
先ほど作成されたJavaソースファイルをorgディレクトリごと削除して,再度antコマンドを実行します。
> ant -Dtomcat.home="C:\Program Files\Apache Software Foundation\Tomcat 5.0"
JSPに構文エラーがなければ,org/apache/jspディレクトリに,test_jsp.javaとtest_jsp.classファイルが生成されます。JSPをわざとコンパイルエラーが発生するように修正し,antコマンドを実行すると,次のようなログが出力されます。
compile:
[javac] Compiling 1 source file to C:\user\jsp\org\apache\jsp
[javac] C:\user\jsp\org\apache\jsp\test_jsp.java:
48: シンボルを解決できません。
[javac] シンボル: クラス Date2
[javac] 場所 : util の パッケージ
[javac] out.print(new java.util.Date2());
[javac] ^
[javac] エラー 1 個
[javac] Compile failed; see the compiler error output for details.
このようなJSPなら,エラーの場所を見つけるのも容易でしょう。
JAVA Developerより毎週Java Tipsをお届けしましょう。バックナンバーもよろしく。
Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.