让一个Servlet重新加载它被调用的页面

3
我编写了一个 Servlet,用于完成一个任务,并希望它重新加载最初调用该 Servlet 的 JSP。该 Servlet 运行于使用 enctype='multipart/form-data' 的 JSP 上,这个 JSP 被称为 Uploadtest。每次我尝试运行以下代码之一时,都会收到 The requested resource (/project_name/WebContent/jsps/new.jsp) is not available 的错误提示。
我尝试过:
response.sendRedirect("/WebContent/jsp/Uploadtest.jsp");

and

getServletContext().getRequestDispatcher("/WebContent/jsps/Uploadtest.jsp").forward   (request, response); 

但是这两个选项都出现了错误,显示无法找到我所寻找的页面。

请问有什么想法可以解决这个问题吗?

谢谢。


1
WebContent不是你的IDE中的一个文件夹吗?那就不应该出现在你的URL中。 - rickz
2个回答

3

您需要了解项目中源代码的布局、部署的Web应用程序的布局以及服务器上应用程序的布局之间的区别。

部署的Web应用程序具有以下结构:

jsps
    Uploadtest.jsp
WEB-INF
    classes
        the compiled classes of your application
    lib
        the jars of your application

部署的应用程序中不存在WebContent目录。这只是Eclipse存储与Web应用相关的源文件(JSP文件、图像等)的位置。
每个Web应用都有一个上下文路径。如果您的Web应用的上下文路径为/foo,则在浏览器地址栏中输入JSP所需的路径将是:
http://localhost:8080/foo/jsps/Uploadtest.jsp

当您转发到另一个资源时,它总是指向同一Web应用程序的资源。因此,您无需指定上下文路径:
getServletContext().getRequestDispatcher("/jsps/Uploadtest.jsp").forward (request, response); 

当你进行重定向(与转发完全不同)时,你可以重定向到任何URL(同一webapp、同一主机上的另一个webapp或者www.google.com等)。如果你重定向到同一webapp的某个资源,则无需发送http://localhost:8080部分,但需要发送上下文路径,然后是webapp中的资源路径,并且你还应该始终使用encodeRedirectURL方法(除非你不关心用户是否依赖于URL重写而不是cookie来进行会话管理):
String redirect = 
    response.encodeRedirectURL(request.getContextPath() + "/jsps/Uploadtest.jsp");
response.sendRedirect(redirect);

request.getContextPath() 用于获取 /foo 而不需要硬编码它。


0

我认为你的问题与应用程序的结构和请求URL路径的规范有关。

首先,我想指出的是,“WebContent”是Eclipse中的虚拟文件夹。因此,在您的请求或重定向路径中不应使用它。

其次,我猜测您在使用绝对路径时编码有误:

  1. 有一个小错误:

http:// localhost:8080/foo/jsp/Uploadtest.jsp

根据您的描述,您应该输入:

http://localhost:8080/foo/jsps/Uploadtest.jsp

2.

getServletContext().getRequestDispatcher("/WebContent/jsps/Uploadtest.jsp").forward   (request, response); 

你应该在转发的URL中添加上下文路径,像这样:

request.getContextPath() + "jsps/Uploadtest.jsp"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接