您的位置:首页 > 编程语言 > PHP开发

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

2013-06-14 11:01 666 查看
弹出窗口刷新它的父页面时。出现不重新发送信息,则无法刷新网页



以下范例为演示解决办法使用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做例子的好处是代码量最少呵呵,至于这种方法会有什么副作用,我还没有发现,欢迎有朋友给与指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐