- PR -

EclipseWSTがJSPをServletにする際のpackageの謎

1
投稿者投稿内容
8
会議室デビュー日: 2006/05/23
投稿数: 3
お住まい・勤務地: 札幌
投稿日時: 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での動作が、不思議でなりません。

ご存知の方がいらっしゃれば、ご教授お願いします。
ひろ@ya
大ベテラン
会議室デビュー日: 2006/02/23
投稿数: 168
投稿日時: 2008-05-19 09:00
そういう設計だからとしか言いようが無いです。
参考: http://www.atmarkit.co.jp/fjava/rensai2/eclipse03/eclipse03.html
8
会議室デビュー日: 2006/05/23
投稿数: 3
お住まい・勤務地: 札幌
投稿日時: 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は
別の結果を返します。

やっぱり謎です。


かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-05-19 11:36
Tomcat5.5のワークディレクトリを見ていると、
org.apache.jspで始まり、
JSPディレクトリ階層と一致するパッケージになっているようです。

コード:
<%System.out.println(this.getClass() + ":" + this.getClass().getClassLoader().getClass());
%>


という感じのテンプレートを埋め込んでおくと、
どういうクラスがどういうクラスローダでロードされているか
確認できると思います。
8
会議室デビュー日: 2006/05/23
投稿数: 3
お住まい・勤務地: 札幌
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)