1

我的 Java Web 应用程序使用两个 servlet 来控制表单处理和导航,/AppControl并且/ViewControl.

AppControl 处理表单提交,然后将请求转发到 ViewControl,ViewControl 确定处理了哪个页面并将请求重新转发到“下一个”页面。

第一个转发(在 servlet 之间)工作正常;但第二个(从 ViewControl 到 JSP 页面)的 URL 格式错误,我得到 404。

servlet 都映射到上下文的根目录,JSP 文件位于名为 /view/ 的子文件夹中

Forward #1 从/AppControlto /ViewControl, forward #2 从 /ViewControl to /view/xxx.jsp,但是出现在浏览器中的是localhost:8080/view//view/xxx.jsp,这显然不是它应该去的地方。请注意,发送到浏览器的 URL 中缺少上下文,并且正在嵌入字符串“/view/”的额外实例。

我试过了:

  • ServerContext在 using和ServerRequestfor之间切换RequestDispatcher
  • 使用绝对路径和相对路径(“./”——这是一个有效的相对路径吗?)
  • 将 contextPath 附加(预先挂起)到 URL

以及其他各种黑客和回转,但似乎没有任何东西可以使它起作用;它不断将发送到浏览器的 URL 更改为除调试中出现的 URL(与 RD 相关联)之外的其他内容。

顺便说一句,请求来自 (referrer?) localhost:8080/(context)/view/zzz.jsp,发布到/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
  • Eclipse 朱诺 (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