jsp中のbasePathとpath(絶対パス相対パス)
6905 ワード
転載は原文の出所を明記してください.http://blog.csdn.net/baidu_37107022/articale/detail/7523392
JSPで「相対パス」を使うと問題が発生する可能性があります.
ホームページの「相対パス」は、「URL要求のアドレス」に対してリソースを探しているからです.
例を挙げます
もしプロジェクトがあるなら、MyApp
login.jspページに登録リンクがあります.
なぜなら、ウェブページの「相対リンク」は、あなたが要求するURLパスに対して決定されるからです.
ここでパスを要求するのは:http://localhost:8080/MyApp/jsp/login.jsp ブラウザはこのパスの下にあります.http://localhost:8080/MyApp/jsp/)jsp/register.jspを探しています.
したがって、以下のようなエラーが発生します.http://localhost:8080/MyApp/jsp/jsp/register.jsp
上記の問題は、呼び出しページと呼び出しページのURLが異なることです.
このようなエラーは、2つのページの間で「転送」(forward)操作が行われる場合もしばしばあります.forwardはバックグラウンドで行われるので、クライアントにとっては透明です.URLは変わらないが、データの内容は別のページから戻ってきます.
この問題はどう解決しますか?
方法1:直接絶対パスを採用する(推奨しない)
JSPページで、本プロジェクトの絶対アドレスを取得しました.http://localhost:8080/MyApp/)
コードは以下の通りです
しかし、このようにすると、私たちは各リンクの前に
このようにすれば、恐ろしいことになります.
方法2:htmlの
ここでは、htmlの
上で言ったのはどういう意味ですか?コードを見れば分かりますよ.
これはJSPのコードです.下のコード(上記の「方法一」のJSPコードと非常に似ています.)ですが、ここでは私達は$
コードは以下の通りです
上記のJSPコードを実行したら、ブラウザで確認できます.彼がクライアントに返されたhtmlコード:上記JSPを実行した後、戻りました.
つまり、本htmlファイルで出会ったすべての相対リンク(例えば、
JSPで「相対パス」を使うと問題が発生する可能性があります.
ホームページの「相対パス」は、「URL要求のアドレス」に対してリソースを探しているからです.
例を挙げます
もしプロジェクトがあるなら、MyApp
, jsp
:
login.jsp //
register.jps //
私たちはブラウザに住所を入力します.http://localhost:8080/MyApp/jsp/login.jsp
この場合、ブラウザは「ログインページ」(login.jsp)にリンクされます.login.jspページに登録リンクがあります.
ユーザー
このリンクをクリックすると、ブラウザのアドレスバーに次のようなエラーリンクが表示されます.http://localhost:8080/MyApp/jsp/jsp/register.jsp
なぜ「jsp/jsp/register.jsp」が現れますか?なぜなら、ウェブページの「相対リンク」は、あなたが要求するURLパスに対して決定されるからです.
ここでパスを要求するのは:http://localhost:8080/MyApp/jsp/login.jsp ブラウザはこのパスの下にあります.http://localhost:8080/MyApp/jsp/)jsp/register.jspを探しています.
したがって、以下のようなエラーが発生します.http://localhost:8080/MyApp/jsp/jsp/register.jsp
上記の問題は、呼び出しページと呼び出しページのURLが異なることです.
このようなエラーは、2つのページの間で「転送」(forward)操作が行われる場合もしばしばあります.forwardはバックグラウンドで行われるので、クライアントにとっては透明です.URLは変わらないが、データの内容は別のページから戻ってきます.
この問題はどう解決しますか?
方法1:直接絶対パスを採用する(推奨しない)
JSPページで、本プロジェクトの絶対アドレスを取得しました.http://localhost:8080/MyApp/)
コードは以下の通りです
"java" pageEncoding="GBK"
contentType="text/html;charset=gbk" isELIgnored="false"%>
String path = request.getContextPath();
// ( : http://localhost:8080/MyApp/) basePath
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ path + "/";
// " basePath" pageContext , EL 。
pageContext.setAttribute("basePath", basePath);
%>
<html>
<head>
head>
<body>
<a href="${pageScope.basePath}jsp/register.jsp">
body>
html>
ラベル
のhref属性内に直接“ ${pageScope.basePath}” "jsp/register.jsp"
を採用して、絶対パスを構成することができます.http://localhost:8080/MyApp/jsp/register.jsp)しかし、このようにすると、私たちは各リンクの前に
“${pageScope.basePath}”
を追加する必要があります.このようにすれば、恐ろしいことになります.
方法2:htmlの
タグを利用する(推奨)ここでは、htmlの
について説明します.base URL
, ( 、 )
( : URL)。
タグのhref属性を使用して設定できます.すべての「相対基準URL」です.上で言ったのはどういう意味ですか?コードを見れば分かりますよ.
これはJSPのコードです.下のコード(上記の「方法一」のJSPコードと非常に似ています.)ですが、ここでは私達は$
コードは以下の通りです
"java" pageEncoding="GBK"
contentType="text/html;charset=gbk" isELIgnored="false"%>
String path = request.getContextPath();
// ( MyApp, http://localhost:8080/MyApp/):
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<html>
<head>
<base href=" ">
head>
<a href="jsp/login.jsp">Login a>
html>
上のコードを大体読みましたが、まだ迷っているかもしれません.でも、下のコードを見たら、ぱっと明るくなります.上記のJSPコードを実行したら、ブラウザで確認できます.彼がクライアントに返されたhtmlコード:上記JSPを実行した後、戻りました.
<html>
<head>
<base href="http://localhost:8080/MyApp/">
head>
<a href="jsp/login.jsp">Login a>
html>
JSPが戻ってきたhtmlコードには、
の内容が含まれています.つまり、本htmlファイルで出会ったすべての相対リンク(例えば、
)は、ベースパスに対してです.http://localhost:8080/MyApp/)したがって、私たちは相対的なリンクを使用することができます.心配する必要はありません.転送操作や要求アドレスが違って、ページで見つけられないエラーがあります.