- - PR -
EclipseWSTがJSPをServletにする際のpackageの謎
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-05-12 13:10
いつも勉強させていただいております。 Win2000 j2sdk1.4.2_09 Tomcat5 Eclipse WST 1.5 を使用してWebアプリを開発しています。 Eclipseのナビゲータでプロジェクトを右クリックした時に出てくるコンテキストメニューから [デバッグ]-[Debug on server]とし、Webアプリを動作させると JSPから作成されるServletのjavaファイルとclassファイルが \workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Standalone\localhost\ に作成されると思います。 その際のServletのpackageが全て org.apache.jsp となっています。 もちろん、ルートディレクトリに置いてあるJSPなら納得なのですが、 サブディレクトリにJSPを置いても同じパッケージになっています。 例えば、以下の場合です。 {webroot}/menu.jsp {webroot}/common/menu.jsp {webroot}/menu.jsp が org.apache.jsp になるのは納得ですが、 {webroot}/common/menu.jsp が org.apache.jsp.commonではなく、org.apache.jspになるのが不思議です。 上記例の場合、org.apache.jsp.menu_jspクラスが2つ存在する事になりませんか? warファイルをTomcatに配置した所、 {webroot}/common/menu.jsp はorg.apache.jsp.commonになったので、Tomcatの動作は納得なのですが、 Eclipseでの動作が、不思議でなりません。 ご存知の方がいらっしゃれば、ご教授お願いします。 | ||||
|
投稿日時: 2008-05-19 09:00
そういう設計だからとしか言いようが無いです。
参考: http://www.atmarkit.co.jp/fjava/rensai2/eclipse03/eclipse03.html | ||||
|
投稿日時: 2008-05-19 10:03
回答ありがとうございます。
教えていただいた記事、参考になりました。 > ルート配下のサブフォルダ内のJSPファイルは、 > Javaソースの出力先はサブフォルダ化されますがパッケージ名は同じなため、 > 生成されたServletソースをEclipseで読み込むとエラーが発生してしまいます。 Javaとして、ソースファイルをパッケージとは違う階層で管理する事が可能であり、 Eclipseがそれを許していない設計だという事は、わかるのですが、 Javaとして、org.apache.jsp.menu_jspクラスが複数あるのに 別々に動作する理由がわからないです。 たとえば、 webappsの下に配置したアプリのWEB-INF/lib/にcommons-beanutils.jarを置いた場合 tomcatのserver/lib/commons-beanutils.jar とパッケージも含めた同一のクラスが存在する事になると思いますが、 この場合は、webappsの下に配置したアプリ側のjar内のクラスが優先されて 動作すると思います。 これは、パッケージも含めた同一のクラスが存在したとしても、 どちらかしか動作しないという事だと理解していましたが、 今回のケースの場合、 org.apache.jsp.menu_jspクラスは、 それぞれ独立して動作しています。 つまり、 {webroot}/menu.jspと {webroot}/common/menu.jspは 別の結果を返します。 やっぱり謎です。 | ||||
|
投稿日時: 2008-05-19 11:36
Tomcat5.5のワークディレクトリを見ていると、
org.apache.jspで始まり、 JSPディレクトリ階層と一致するパッケージになっているようです。
という感じのテンプレートを埋め込んでおくと、 どういうクラスがどういうクラスローダでロードされているか 確認できると思います。 | ||||
|
投稿日時: 2008-05-19 12:40
かつのりさん
回答ありがとうございます。 提案いただいた実験をしてみました。 /common/menu.jsp側に <% System.out.println("/common/menu.jsp:" + this.getClass() + ":" + this.getClass().getClassLoader().getClass()); %> /menu.jsp側に <% System.out.println("/menu.jsp:" + this.getClass() + ":" + this.getClass().getClassLoader().getClass()); %> としてみました。 結果は、以下の通りでした。 /common/menu.jsp側は /common/menu.jsp:class org.apache.jsp.menu_jsp:class org.apache.jasper.servlet.JasperLoader /menu.jsp側は /menu.jsp:class org.apache.jsp.menu_jsp:class org.apache.jasper.servlet.JasperLoader つまり 実際に別々の動作をするJSPにも関わらず、 同じクラスローダで、同じクラスでした。。。 [ メッセージ編集済み 編集者: 8 編集日時 2008-05-19 12:41 ] |
1