RequestDispatcher.include(...)附加servlet的包名

时间:2011-09-09 05:20:58

标签: java jsp servlets requestdispatcher

我有一个上传图片的index.jsp页面。在提交时,它将转到servlet Upload.java。在servlet中,我正在检查图像的扩展名(“jpg”,“png”等)并转发到新的jsp页面,否则它会显示错误消息并包含相同的index.jsp页面。

我的servlet是一个名为“servlets”的包。

如果我选择图像,那么它正常工作。但是如果我选择除image之外的任何文件,那么它会按预期显示index.jsp页面的错误。直到它现在工作正常,但如果我从这里上传任何文件甚至图像,服务器抱怨。

以下是我在UploadServlet.java servlet中包含index.jsp页面的方法。

out.println("This type of file is not allowed. Please select an image.");
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/index.jsp");
dispatcher.include(request, response);

当我尝试第二次上传图片时,服务器出现错误。

HTTP Status 404 - /UploadImage/servlets/servlets/UploadServlet

type Status report

message /UploadImage/servlets/servlets/UploadServlet

description The requested resource (/CropImage/servlets/servlets/UploadServlet) is not available.

Apache Tomcat/6.0.13

它将servlet的包名附加到url。

如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

显然,您在<form>中使用了相对操作网址。

<form action="servlets/UploadServlet" ...>

当您打开index.jsp时,请求网址为

  

http://localhost:8080/UploadImage/index.jsp

提交表单时,操作URL相对于当前文件夹,因此请求URL将为

  

http://localhost:8080/UploadImage/servlets/UploadServlet

当您再次提交表单时,它仍将相对于当前文件夹,因此您最终会进入

  

http://localhost:8080/UploadImage/servlets/servlets/UploadServlet

您需要将其修改为域相对URL,从前导斜杠开始。

<form action="/UploadImage/servlets/UploadServlet" ...>

这样,URL将相对于域根解析。您还可以通过${pageContext.request.contextPath}动态解析上下文路径:

<form action="${pageContext.request.contextPath}/servlets/UploadServlet" ...>

答案 1 :(得分:0)

你的网址错了。您可以打开web.xml并找到“servlet-mapping”元素,您可以在那里找到映射网址。

我猜你的网址可能是"/CropImage/servlets/UploadServlet"。你可以尝试删除网址中的一个“servlets”。