成功尝试上传文件后,请求将转发到他的主页,即上传文件的同一页面。如果上传成功,则在转发请求之前,会设置一个属性,告知“是,文件已成功上传!”。
执行用户主页中的以下代码,目的是检查是否必须告知用户成功上传尝试。如果用户曾以警报框的形式看过成功消息,则下次成功上传其他文件时他应该看到成功消息。但是在第一次尝试重新加载/刷新页面后,我再次看到警告框告诉用户成功上传尝试,即使我已从请求列表中删除了该属性。
在成功上传文件后向用户显示成功消息的代码段
<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>
为什么即使删除了特定属性,我也会一次又一次地看到警告框?
答案 0 :(得分:3)
对于HTTP如何工作以及“服务器端”和“客户端”概念,您在某处存在概念上的误解。
只要与特定HTTP请求关联的HTTP响应完成了发送响应主体的工作(在此paritular情况下,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年代风格警报提供反馈的方式)
答案 1 :(得分:0)
在后续页面加载中,也许消息仍然不为空。也许您需要检查未定义的消息或其他内容。您是否在调试器中查看了哪些有价值的消息?萤火虫对此有好处。
答案 2 :(得分:0)
你的消息是在请求级别。因此,在jsp上的removeAttribute没有做任何事情,每次重新加载/刷新时都会重新出现消息。这是因为每次刷新/重新加载时,都会创建一个新请求。
您需要检查控制器端的确切位置,您正在设置消息并在那里处理逻辑。
答案 3 :(得分:0)
在客户端修改请求是没用的,因为当您刷新页面时,我猜您的Servlet会再次被重新启动并重新创建属性。
您应该删除服务器端的属性(使用标志或其他内容),并避免修改JSP中的请求对象。