针对"不重新发送信息,则无法刷新网页。"的终极解决方法。(php&java范例)

弹出窗口刷新它的父页面时。出现不重新发送信息,则无法刷新网页



以下范例为演示解决办法使用PHP实现全当交流,没有什么技术难度一点小技巧,权当与朋友交流。

在公共模块中新建函数

PHP:

<?
function requestParameter(){
$fromstr="<form name='request' method='POST'>";
$requestKeys=array_keys($_REQUEST);
$requestValues=array_values($_REQUEST);
for($i=0;$i<sizeof($_REQUEST);$i++){
$fromstr.="<input name='$requestKeys[$i]' value='$requestValues[$i]' type='hidden'>";
}
$fromstr.="</form><script>function reload(){request.submit()}</script>";
return $fromstr;
}
?>

JAVA:

public class UtilTool {

public static Map getParameterMap(HttpServletRequest request) {
Map paramMap = new LinkedMap();
String pathInfoStr = request.getPathInfo();

if (pathInfoStr != null && pathInfoStr.length() > 0) {
if (!pathInfoStr.endsWith("/")) pathInfoStr += "/";

int current = pathInfoStr.indexOf('/');
int last = current;
while ((current = pathInfoStr.indexOf('/', last + 1)) != -1) {
String element = pathInfoStr.substring(last + 1, current);
last = current;
if (element.charAt(0) == '~' && element.indexOf('=') > -1) {
String name = element.substring(1, element.indexOf('='));
String value = element.substring(element.indexOf('=') + 1);
paramMap.put(name, value);
}
}
}

java.util.Enumeration e = request.getParameterNames();
while (e.hasMoreElements()) {
String name = (String) e.nextElement();
paramMap.put(name, request.getParameter(name));
}

if (paramMap.size() == 0) {
Map multiPartMap = (Map) request.getAttribute("multiPartMap");
if (multiPartMap != null && multiPartMap.size() > 0) {
paramMap.putAll(multiPartMap);
}
}
return paramMap;
}


public static String requestParameter(HttpServletRequest request){
String fromstr="<form name='request' method='POST'>";
Enumeration requestKeys = request.getParameterNames();
Map requestValues=UtilTool.getParameterMap(request);
String rkey = null;
for(;requestKeys.hasMoreElements();){
rkey = (String) requestKeys.nextElement();
fromstr+="<input name='"+rkey+"' value='"+requestValues.get(rkey)+"' type='hidden'>";
}
fromstr+="</form><script>function reload(){request.submit()}</script>";
return fromstr;
}
}

在模版页面中调用此函数并输出返回的字符串。

PHP:

<?=requestParameter();?>

JAVA:

<%=UtilTool.requestParameter(request)%>

这样当需要调用弹出窗口并刷新当前页时如:
针对当前页的刷新

window.location.reload();
改为
reload();

原理:

很多WEB程序员比如我,比较喜欢让地址栏保持清爽的状态,切换页面地址或进行列表翻页处理的时候,尽量都用POST方式提交数据,但这样就引发了一个怪异的问题,就是当弹出窗口关闭后需要同时刷新父页面时IE就会出现"不重新发送信息,则无法刷新网页。"的警告,使得本来不错的想法不能得到完美实现,迫不得已,只能改用GET提交方式,比较郁闷得去做字符串连接操作。

IE认为POST提交的信息应该是一次性的,当提POST交后刷新页面的时候(如按F5或调用window.location.reload();时)IE将会认为这是重复提交(所谓重复提交:IE对其的理解就是把提交过的表单用刷新的办法在提交一次。),所以需要用户进行确认才能允许刷新页面,虽然是好心,解决办法却比较笨,招得怨声四起。

其实,在测试中可以发现,如果不用window.location.reload();提交刷新,而直接提交一个表单,那怕这个表单已经重复提交了上万次,IE也不会拒绝(还真是好骗)。

那么解决办法就来了,既然提交表单不会拒绝,那么我们就做个表单刷新用,首先我们要找到刷新页面时到底有什么东西要被重复提交,这就涉及到一个服务器对象REQUEST,暂且这样称呼,做WEB开发的人对它都非常熟悉,不管是POST方式还是GET方式甚至是混合提交的方式提交的数据,都存储在这个对象中,那么把它的数据项拿出来做成一个个隐藏域放在表单中,ACTION设为_SELF并执行提交,那么效果将与按F5然后点那个倒霉的“重试”效果是一样的。

以上的例子中我首先声明了一个方法requestParameter(),将其放在一个公共页面中,然后把调用
<?=requestParameter();?>
也放在公共页面中,将返回一个包含REQUEST对象中的所有项目的隐藏表单,并附带一个提交的JAVASCRIPT方法reload();,这样,只要在应用页面中用到弹出窗口刷新父窗口的调用时,调用reload();即可。

其他的语言如ASP、JSP等处理办法也是相同的,用PHP做例子的好处是代码量最少呵呵,至于这种方法会有什么副作用,我还没有发现,欢迎有朋友给与指正。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值