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

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

44c1d3947e62f4ea801ce2d8000e38a9.gif

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

在公共模块中新建函数

PHP:

function requestParameter(){

$fromstr="

";

$requestKeys=array_keys($_REQUEST);

$requestValues=array_values($_REQUEST);

for($i=0;$i

$fromstr.="";

}

$fromstr.="

";

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="

";

Enumeration requestKeys = request.getParameterNames();

Map requestValues=UtilTool.getParameterMap(request);

String rkey = null;

for(;requestKeys.hasMoreElements();){

rkey = (String) requestKeys.nextElement();

fromstr+="";

}

fromstr+="

";

return fromstr;

}

}

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

PHP:

=requestParameter();?>

JAVA:

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

针对当前页的刷新

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、付费专栏及课程。

余额充值