1

私の Java Web アプリは、2 つのサーブレットを使用して、フォームの処理とナビゲーションを制御し/AppControlます/ViewControl

AppControl はフォーム送信を処理し、リクエストを ViewControl に転送します。ViewControl は、どのページが処理されたかを判断し、リクエストを「次の」ページに再転送します。

最初の転送 (サーブレット間) は問題なく動作します。しかし、2 つ目 (ViewControl から JSP ページへ) は URL の形式が正しくなく、404 が返されます。

サーブレットは両方ともコンテキストのルートにマップされ、JSP ファイルは /view/ という名前のサブフォルダーにあります。

フォワード #1 は から/AppControl/ViewControl、フォワード #2 は /ViewControl から へ移動し/view/xxx.jspますが、ブラウザに表示されるのはlocalhost:8080/view//view/xxx.jspであり、明らかに本来あるべき場所ではありません。ブラウザに送信された URL からコンテキストが欠落しており、文字列「/view/」の余分なインスタンスが埋め込まれていることに注意してください。

私はもう試した:

  • との使用ServerContextを切り替えるServerRequestRequestDispatcher
  • 絶対パスと相対パスの使用 (「./」 -- 有効な相対パスですか?)
  • contextPath を URL にアタッチ (事前保留)

および他のさまざまなハックと回転ですが、何も機能していないようです。ブラウザーに送信される URL を、デバッグに表示される (RD に関連付けられた) URL 以外に変更し続けます。

ところで、リクエストは ( localhost:8080/(context)/view/zzz.jspreferrer?) から発信され、に POST され/AppControlます。

getServletContext ().getRequestDispatcher(java.lang.String)を使用して転送しているため、ターゲット リソースがコンテキストのルートに対して相対的であるという印象を受けました。

これが私が試したことと、私が得た結果です:

URL String Param     | Resulting URL
---------------------|---------------
 /view/xxx.jsp       | localhost:8080/view//view/xxx.jsp
 ./xxx.jsp           | localhost:8080/myApp/xxx.jsp
 ./view/xxx.jsp      | localhost:8080/view/view/xxx.jsp
 /myApp/view/xxx.jsp | localhost:8080/myApp/myApp/view/xxx.jsp

この投稿を実際のコードでフォローアップし、おそらくスクリーンショット(それができる場合)...私の環境:

  • Java 6.0_34
  • 日食ジュノ (4.2.0)
  • トムキャット 7.0.21。

コード:

            //get page navigation info
            setNavigation();
            session.setAttribute("viewControl", this.pageNext);

            //navigate to this.pageNext
            //response.sendRedirect(this.pageNext);
            pageForward(request, response, this.pageNext);
        }
    }else {
        pageForward(request, response, this.appStartPage);
    }
}

private void pageForward(HttpServletRequest request, HttpServletResponse response, String url) 
throws ServletException, IOException {
    RequestDispatcher rd = getServletContext().getRequestDispatcher(url);
    //RequestDispatcher rd = request.getRequestDispatcher(url);

    rd.forward(request, response);
}

private void setNavigation() {
    //this.urlViewBase = this.urlAppBase + "/view/";
    this.urlViewBase = "/view/";
    //this.urlViewBase = "./";
    //this.urlViewBase = "./view/";

    if (this.pageCurrent.equals("StartView.jsp")) {
        this.pageNext = this.urlViewBase + "ApplicantInfo.jsp";
        this.pagePrevious = this.urlViewBase + "StartView.jsp";
    }
    else if (this.pageCurrent.equals("ApplicantInfo.jsp")) {
        this.pageNext = this.urlViewBase + "ApplicantAddress.jsp";
        this.pagePrevious = this.urlViewBase + "StartView.jsp";
    }
    else if (this.pageCurrent.equals("ApplicantAddress.jsp")) {
        this.pageNext = this.urlViewBase + "Menu.jsp";
        this.pagePrevious = this.urlViewBase + "ApplicantInfo.jsp";
    }
    else if (this.pageCurrent.equals("Menu.jsp")) {
        this.pageNext = this.urlViewBase + "Menu.jsp";
        this.pagePrevious = this.urlViewBase + "ApplicantAddress.jsp";
    }
    else {
        this.pageNext = this.urlViewBase + "StartView.jsp";
        this.pagePrevious = this.urlViewBase + "StartView.jsp";
    }
}
4

0 に答える 0