jsp中のbasePathとpath(絶対パス相対パス)

6905 ワード

転載は原文の出所を明記してください.http://blog.csdn.net/baidu_37107022/articale/detail/7523392
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/)したがって、私たちは相対的なリンクを使用することができます.心配する必要はありません.転送操作や要求アドレスが違って、ページで見つけられないエラーがあります.