[英]why does alert-box show up again and again?
成功尝试上载文件后,请求将转发到他的主页,即他上载文件的同一页面。 如果上传成功,则在转发请求之前,将设置一个属性,指示“是,文件已成功上传!”。
执行用户主页中的以下代码,该代码旨在检查是否必须告知用户成功的上载尝试。 如果用户曾经看到过警报框形式的成功消息,则下次他成功上传另一个文件时,应该会看到成功消息。 但是,当我第一次尝试重新加载/刷新页面后,即使我从请求列表中删除了该属性,我仍然再次看到警告框,告诉用户成功上传尝试。
尝试成功上传文件后向用户显示成功消息的代码段
<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>
为什么即使删除了特定属性,我仍会一次又一次看到警报框?
您对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年代风格的警报提供反馈的方式)
消息在后续页面加载中可能仍不为null。 也许您需要检查消息是否未定义或其他。 您是否在调试器中查看过,看到了什么价值信息? Firebug对此很有好处。
您的消息处于请求级别。 因此,jsp处的removeAttribute不会执行任何操作,每次重新加载/刷新时,消息都会重新出现。 这是因为每次刷新/重新加载时,都会创建一个新请求。
您将需要检查您在控制器端的确切位置设置了消息并在那里处理逻辑。
在客户端修改请求是没有用的,因为刷新页面时,我猜您的Servlet被再次调用并重新创建属性。
您应该在服务器端删除属性(使用标志或其他方式),并避免在JSP中修改请求对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.