- PR -

コンテキストパスと相対パス

投稿者投稿内容
Function
会議室デビュー日: 2001/09/03
投稿数: 16
投稿日時: 2003-01-02 06:47
Webアプリケーション開発においての、JSP(またはHTML)中の
画像やスクリプトファイルを示すパスについて質問です。
(ちょっと長いですが・・・)

例えばあるWebアプリケーションを /abc というコンテキストパスに
割り当てたとします。(URL: www.example.com/abc)
このWebアプリの index.jsp (URL: www.example.com/abc/index.jsp)の
中に <img src="images/photo.jpg"> で示される画像タグがあると、
これはURLでいうと www.example.com/abc/images/photo.jpg
参照します。

このWebアプリに、全てのJSPページで読み込まれる header.jsp
があるとします。その中に <img src="images/logo.gif"> という
画像タグがあります。もし前述の index.jsp にこの header.jsp が
読み込まれれば、www.example.com/abc/images/logo.gif に
位置する画像ファイルを参照できます。

しかしながら、/abc/next-level/index.jsp という異なるディレクトリに
属するJSPファイルに header.jsp が読み込まれると、画像のURLは
www.example.com/abc/next-level/images/logo.gif となり
正しいパスを表しておらず、画像は表示されません。

この問題は、<img src="/abc/images/logo.gif"> というように
絶対パスを用いて画像ファイルのパスを示せば解決できます。
がしかし、この方法ではコンテキストパスの変更に対応できず、
もしこのWebアプリが /def というコンテキストパスに設定
されてしまうと画像は表示されません。つまりWebアプリに
ポータビリティがなくなってしまいます。

実際は画像パスだけでなく、JavaScript 内での画像を含めた
ファイルパスやCSSファイルの指定などがあると思いますが、
何かよい解決方法はないものでしょうか?
Paul
ベテラン
会議室デビュー日: 2002/04/30
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2003-01-03 08:34
中込です。
コード:
<img src='<%=request.getContextPath()+"/images/photo.jpg"%>'>

Function
会議室デビュー日: 2001/09/03
投稿数: 16
投稿日時: 2003-01-03 19:11
引用:

img src='<%=request.getContextPath()+"/images/photo.jpg"%>'>


実は上記と同様の処理をTablibにまとめたものを使って、これまで
対処してきました。
全てのページの全てのパスに適用するのは大変で、時々忘れることも
ありましたので、スマートなやり方ではない気がしていました。

でも中込さんが挙げてくれたこともあり、こういう方法しかないのかな
とも思えてきました。

この方法が一般的な解となるのでしょうか?
yuu
大ベテラン
会議室デビュー日: 2002/06/12
投稿数: 152
お住まい・勤務地: 美味しいケーキ店のそば
投稿日時: 2003-01-04 18:31
<base href= ..> を定義して、画像は固定パスにするのはどうでしょうか

コード:
<html><head>
<base href="<%=request.getContextPath()%>">
...
</head><body>
....
<img src="/images/photo.jpg">

Function
会議室デビュー日: 2001/09/03
投稿数: 16
投稿日時: 2003-01-10 09:25
引用:

yuuさんの書き込み (2003-01-04 18:31) より:
<base href= ..> を定義して、画像は固定パスにするのはどうでしょうか



レスが遅くなりましたが、<base href=..>での定義は相対パスに適用されるので、
残念ながら意味をなさないですね。

他のJSPをincludeしないJSPであれば、<base href=コンテキストパス>を
定義して全て相対パスで画像ファイル等を指定するのが最適解となり得そうですが。
Strutsも <html:base /> というTaglibで、これを実現しています。
yuu
大ベテラン
会議室デビュー日: 2002/06/12
投稿数: 152
お住まい・勤務地: 美味しいケーキ店のそば
投稿日時: 2003-01-10 11:23
><base href=..>での定義は相対パスに適用されるので、
え! 絶対パスにも適応されませんか?
今まで仕事で作ったほとんどの CGI/JSPなどでは適応されてますが。。。 なぜだろう
Function
会議室デビュー日: 2001/09/03
投稿数: 16
投稿日時: 2003-01-13 03:03
引用:

yuuさんの書き込み (2003-01-10 11:23) より:
え! 絶対パスにも適応されませんか?
今まで仕事で作ったほとんどの CGI/JSPなどでは適応されてますが。。。 なぜだろう


簡単にしかテストしていないので断言はできませんが、
HTMLの仕様的には相対パスに適用されるもののようです。
http://www.w3.org/TR/html4/struct/links.html#edef-BASE
yuu
大ベテラン
会議室デビュー日: 2002/06/12
投稿数: 152
お住まい・勤務地: 美味しいケーキ店のそば
投稿日時: 2003-01-13 10:54
Function さん、こんにちは。
>HTMLの仕様的には相対パスに適用されるもののようです。
そうなんですか、ということは絶対パスに対して base href が適応されるのは、IE, Netscape の独自仕様んんですね

ところで、
<!-- BBCode Start --><TABLE BORDER="0" ALIGN="CENTER" WIDTH="90%" CELLSPACING="0" CELLPADDING="0"><TR><TD WIDTH="5%" NOWRAP><FONT SIZE="-1">コード:</font></td><TD WIDTH="95%"><HR SIZE="1" WIDTH="100%"></td></tr><TR><TD COLSPAN="2"><PRE>
<html><head>
<base href="<%=request.getContextPath()%>">
...
</head><body>
....
<img src="./images/photo.jpg">
</pre><HR SIZE="1" WIDTH="100%"></td></tr></table><!-- BBCode End -->
では ダメなんでしょうか? 相対パスの images/photo.jpg は JSP(HTML)がどのデイレクトリーにあっても
request.getContextPath() + '/images/photo.jpg' になると思うのですが ?


[ メッセージ編集済み 編集者: yuu 編集日時 2003-01-13 14:01 ]

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