我的MVC是Struts 2
我的要求是在浏览器中单击后退按钮后清除首页中的一些错误消息。
顺序是: 第A页 - >第B页 - >第C页
页面B可以从页面A或从页面C导航(通过单击后退按钮)。如果页面B有错误消息,并且单击了页面C的后退按钮,则必须删除此错误消息。但我无法确定用户如何导航到Page B(考虑到上述两种方式)。
到处搜索解决方案。发现window.history不是解析上一页的可靠方法。
此外,由于带有tile的Struts 2怪癖,window.location没有改变。
令人沮丧的是浏览器后退按钮没有命中服务器。它也不处理JSP或struts标记。幸运的是,它运行了javascript。
所以我想出了一个使用服务器和客户端时间戳的自定义解决方案。它似乎适用于所有浏览器。
我想知道是否有更简单的方法。
<%
if (session.getAttribute("myTime") != null) {
//server sends the time in millis on the first invocation
Long tmStamp = Long.parseLong((String) session.getAttribute("myTime"));
// out.println(tmStamp);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date javaDt = new Date();
javaDt.setTime(tmStamp);
// out.println(" " + sdf.format(javaDt));
Date clientDt = new Date();
Long clientMillis = clientDt.getTime();
Long timeDiff = clientMillis -tmStamp;
%>
<script>
var currDt = new Date().getTime();
var dt = new Date(<%= tmStamp%>);
dt.setTime(<%=tmStamp%>);
var jsDt = new Date();
jsDt.setTime(currDt);
//alert( "<%= tmStamp %>" + " javascript time=" + (currDt - dt.getTime()) + ' timeDiff=' + (1 * <%= timeDiff%>) + " " + jsDt + " " + dt);
//we expect the server to repond within 5 seconds
if (currDt > (<%= tmStamp %> + (1*<%= timeDiff %>) + 5*1000)) {
//alert("referer is summary" )
clearError();
} else {
//alert("referer is not summary");
<s:if test="flag == 'none'">
$('<tr><td align="center"> <font color="red" style="font-size:14px;font-family:"sans-serif, Arial, Helvetica";height:20px;width:180px; font-weight:bold;" ><blink>No Result found for the given Search Criteria</blink></font></td></tr>')
.insertAfter("#lastRow");
$('<tr><td align="center"> <font style="font-size:14px;font-family:"sans-serif, Arial, Helvetica";height:20px;width:180px; font-weight:bold;" ><blink>No Result found for the given Search Criteria</blink></font></td></tr>')
.insertBefore("#firstRow");
</s:if>
}
</script>
<% } else {
out.println("No session attribute for myTime");
}
%>