【最大10000ポイント】当たる!!質問投稿キャンペーン!

<html:form

<form

action
の位置に設定する値として
<%= response.encodeURL(request.getRequestURI()) %>
という記述を時々みます。

request.getRequestURL()
であれば、
http://~からはじまる
URLになるので
意味はわかるのですが、
request.getRequestURI()になっているのは
なぜでしょう。
これだと、/コンテクスト名/~
のような記述になってしまい。
webサーバのホスト名を識別するような
情報がどこにもみあたらないのですが・・
いったい、どういうことなのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (4件)

おつかれさまです


lawson の考え方で合っているとおもいますよ。
    • good
    • 0
この回答へのお礼

ありがとう、ございます。
根気よく何度も何度も返事を書いてくれて
ありがとう。
わがままな追加質問につきあってくれてありがとう。
疑問が解決されまして、
すがすがしいです。
これからは普通に request.getRequestURI()
をあたりまえのように、自身をもって使っていけます。

お礼日時:2004/01/15 11:10

<<結論>> について


ブラウザが保持しているのではなく、requestが保持しているということです。

JPSやHTMLファイルに【http://ホスト名/】と直接書き込んだ場合、ホストが変更になった場合やSSL通信(https)に変更になった場合修正個所が増大することを避けるためにrequest.getRequestURI()を使用していると考えると良いかもしれません。
    • good
    • 0
この回答へのお礼

ありがとうございます。

>JPSやHTMLファイルに【http://ホスト名/】と直接書き込>んだ場合、ホストが変更になった場合やSSL通信(https)に>変更になった場合修正個所が増大することを避けるために>request.getRequestURI()を使用していると考えると良い>かもしれません

という話であれば、

request.getRequestURI(
ではなく
request.getRequestURL(
を使用しても、
同様にして、修正量を減らすことが
できるとおもいます。
静的なドキュメントに
http://~の文字列が
定数のきってあるのであれば、
修正が大変ですが、
request.getRequestURL(
の方式を用いたとしても
ホストが変更になった場合やSSL通信(https)に変更になった場合
修正する必要がないように思えます。
でも、ほとんど、request.getRequestURI()
のほうが使われているようですね。
なぜ、でしょう。

あと、もうひとつ疑問がありますが。

>ブラウザが保持しているのではなく、requestが保持しているということです

ですが、
正確には
以下のような気がするのですが

Webブラウザがおぼえている情報を
もとにして、
その情報をrequestの中に格納するような
形でリクエストをなげている。
結果として、
requestに保持されている。

理由:
httpプロトコル自体はステートレスなので、
webサーバは覚えていない。
1回リクエスト・レスポンスすると
その情報はなくなる。
レスポンスの結果として
かえってきたHtmlに
/コンテクスト/~
の形式で、
パスが記述されていると、
なにかが、http://~の部分を
覚えていて、補うような
形をとらないと、物理的におかしいように
感じます。
クライアントのwebブラウザのほうで、
レスポンスを受け取ったときのページの位置情報を
おぼえていて、それに基づいて、
requestに保持させるようにしなければ、
物理的に説明がつかないように思われる。

もし間違っているとすればいったい
どこに記憶されている情報が
requestの中に格納されるのでしょうか?

それとも、根本的になにか
勘違いしているでしょうか?

お礼日時:2004/01/13 20:07

補足:の件から説明すると


Webアプリケーションにおいてクライアントという考えは
意味を持ちません。つまりクライアントのホスト名やIPアドレスに依存していては、Webアプリケーションは構築できないからです。

簡単に言うと、クライアントはサーバに存在するJSPファイル等を参照しているに過ぎず、/コンテクスト名/~とリンクされていても、クライアントのローカルのディレクトリを見るわけではなくあくまでサーバのローカルディレクトリを参照しているからです。

例えば
を<a href="<%= response.encodeURL(request.getRequestURI()) %>">URI</a>
のようにしてリンクを張ってみてください。
このリンクにカーソルを合わせるとhttp://www.****.../
のように表示されるはずです。

説明が不十分かもしれませんが補足ください。
    • good
    • 0
この回答へのお礼

根気よく、ありがとうがざいます。
Webブラウザのほうが
カレントディレクトリのような
URLの基準値を覚えているようです。


http://****.co.jp/appl1/index.jsp
の結果によって表示される
HTMLソースに

<a href="index.jsp"
のような記述があると

http://****.co.jp/appl1/index.jsp
にリンクしにいこうとして、

<a href="/index.jsp
http://****.co.jp/index.jsp
にリンクしにいこうとして

いるようでした。


なお、Webアプリケーションとは関係なしに、
静的なhtmlのページをwebサーバにおいた状態で
<a hrefについて試してみても
そうなりました。

あと、ローカルの
デスクトップに
hoge.html
をおいた状態で
C:\Documents and Settings\k-ookawa\デスクトップ\hoge.html

を表示したところ

<a href="jikkenDir/aaa.html">aaa</a>
の部分は

file://C:\Documents and Settings\k-ookawa\デスクトップ\jikkenDir\aaa.html

<a href="/jikkenDir/bbb.html">bbb</a>
の部分は
file://C:\jikkenDir\bbb.html
と解釈されているようです。

なので、
Webブラウザが今表示している
ページがどこにあるか?
についての状態情報のようなものを保有している
ようで、その情報を元に
URLパターンを作成しているようでした。

そこで、結論なのですが
以下の理解のしかたが正しいか間違っているのかを
教えてください。
間違いであれば、ご指摘いただけたら有難いです。

<<結論>>
サーブレットやJSP
側に
<%= response.encodeURL( request.getRequestURI()
のようなコーディングがなされるのは
Webブラウザが一般的にこのような性質を持っている
ことを踏まえた上でやっていることである。
というような理解のしかたで問題なかったでしょうか?

お礼日時:2004/01/13 19:16

おつかれさまです。



Javaサーブレット等のWebシステムを動作させるためにTomcat等のサーブレットエンジンは一般的に 「http://www.~」とかかれていない限り同一のサーバへリクエストを返します。 つまり

http://www.****.co.jp/index.jsp内に
<%= response.encodeURL(request.getRequestURI()) %>
のような記述が合った場合サーブレットエンジンは
http://www.****.co.jp/コンテクスト名/~へリクエストを返します。

この回答への補足

クライアントとサーバの
両方が
同じ、****.co.jp
の中にないとダメだ
とか、
同じlocalhost
の中でならうまくいくやり方だ。
とかそういう意味でしょうか?

おもいっきり、勘違いしているかもしれないですが。
そのへんのしくみがまだ、理解不足なので。

補足日時:2004/01/13 18:07
    • good
    • 0
この回答へのお礼

早速はやい回答をくださってありがとうございます。
すいませんが、
まだまだ、納得できません。

質問内容を補足すると
たとえば、

1)一番最初
ブラウザでアドレスバーに
http://www.****.co.jp/appl1/index.jsp
と入力してエンターキーを押したとします。

2)サーバ側で
appl1という名前のwebアプリケーションの
index.jspが実行されます。

3)index.jspに

<%= response.encodeURL(request.getRequestURI()) %>
というコードがあったので、

request.getRequestURI()
の部分が

/appl1/index.jsp

におきかえられます。

(4)
それをうけとったブラウザの
HTMLのソースには
/appl1/index.jsp
という記述がありますが。
submitボタンを押して
もう一度リクエストを
だそうにも、どのWebサーバかわからない

以上のようなことに
ならないのですか?
という質問ないようだったのですが

out.println(
で普通に
request.getRequestURI()
とすると
/appl1/index.jsp
という文字列が表示されます。
http://という記述がない文字列にも
かかわらず、
http://wwww.****.co.jp/appl1/index.jsp
には変換されませんが・・・


>http://www.****.co.jp/index.jsp内に
><%= response.encodeURL(request.getRequestURI()) %>>
>のような記述が合った場合サーブレットエンジンは
>http://www.****.co.jp/コンテクスト名/~へリクエスト>を返します。

とは
http://という文字列がない時に
request.getRequestURI()の
先頭に付加してくれるのは
どのような時なのでしょうか?

お礼日時:2004/01/13 17:55

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング