0

在成功尝试上传文件后,请求被转发到他的主页,即他上传文件的同一页面。如果上传成功,在转发请求之前,会设置一个属性,告知“是的,文件已成功上传!”。

执行用户主页中的以下代码,旨在检查是否必须告知用户上传尝试成功。如果用户曾经看到过提示框形式的成功信息,下次上传另一个文件成功时应该会看到成功信息。但是在我重新加载/刷新页面的第一次尝试之后,我再次看到警告框告诉用户成功上传尝试,即使我已经从请求列表中删除了该属性。

文件上传尝试成功后向用户显示成功消息的片段

<script>
        window.onload = function() {
        <% message = (String)request.getAttribute("SuccessMessage");
           AttemptToUploadFile = (Boolean)request.getAttribute("UploadAttempt");
           request.removeAttribute("SuccessMessage"); // Remove the attribute so that alert box doesn't pop every time the page is refreshed
              if(message != null) {%>
                      alert("File successfully uploaded !");
                          <% } %>

        }
    </script>

为什么即使我删除了特定属性,我还是会一次又一次地看到警告框?

4

4 回答 4

3

您对 HTTP 的工作原理以及“服务器端”和“客户端”概念存在概念性误解。

每当与特定 HTTP 请求关联的 HTTP 响应完成将响应主体(在这种特殊情况下为 JSP 生成的 HTML 源代码)发送到客户端的工作时,请求属性就已经被丢弃/垃圾。

在浏览器中刷新/重新加载页面(并忽略浏览器关于数据将被重新发送的警告!)将导致原始 HTTP 请求数据重新发送到服务器,因此服务器将再次处理整个 HTTP 请求并设置再次请求属性。显式删除该属性不会解决它,并且它本身没有完全的意义。

我不确定功能要求是什么。您要允许最终用户再次重新发送上传的文件吗?为什么不再显示该消息?不应该警告最终用户他/她正试图再次重新发送文件,这首先是错误的吗?在这种情况下,在方法中添加一个额外的检查,在该doPost()方法中,您根据磁盘上已存储的文件或会话范围内的某些映射来验证文件名,并让它忽略请求并引发一些异常或显示不同的消息.

String filenameOfUploadedFile = getItSomehow();

if (isAlreadyUploaded(filenameOfUploadedFile)) {
    request.setAttribute("message", "Error, the file is already uploaded!");
}
else {
    // Process.
    // ...

    request.setAttribute("message", "File upload is successfully processed!");
}

然后您的 JSP 代码可以简化为:

<script>
    <c:if test="${not empty message}">
        window.onload = function() {
            alert('${message}');
        }
    </c:if>
</script>

(虽然我个人不同意通过 90 年代风格警报提供反馈的方式)

于 2012-04-25T15:15:10.447 回答
0

在随后的页面加载中,消息可能仍然不为空。也许您需要检查未定义的消息或其他内容。您是否在调试器中查看过消息的值?Firebug 对此有好处。

于 2012-04-25T09:37:17.307 回答
0

你的消息是在请求级别。所以jsp的removeAttribute没有做任何事情,每次你重新加载/刷新时都会重新出现消息。这是因为每次刷新/重新加载时,都会创建一个新请求。

您将需要检查您在控制器端设置消息和处理逻辑的确切位置。

于 2012-04-25T09:57:13.540 回答
0

在客户端修改请求是没有用的,因为当您刷新页面时,我猜您的 Servlet 会再次被调用并重新创建属性。

您应该在服务器端删除属性(使用标志或其他东西)并避免修改 JSP 中的请求对象。

于 2012-04-25T10:20:30.257 回答