注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

转: 基于iframe的HTTP长连接实现  

2014-08-30 18:21:25|  分类: asp.net |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

关于什么是http长连接我不废吐沫了,有专业的解释(http://www.ibm.com/developerworks/cn/web/wa-lo-comet/)你可以去看看
我们介绍一下在struts下的实现
首先写一个test.jsp(写一些片段)

  1. <html:form action="/myAction" target="myiframe">  
  2.     <%-- 这里写你的页面代码 --%>     
  3.     <center><input type="button" value="测试提交" class="btn4" onClick="javascript:test();"></center>  
  4. </html:form>  
  5. <iframe name="myiframe" id="myiframe" style="display: none" mce_style="display: none"></iframe>  
  6. <mce:script language="JavaScript"><!--  
  7. function orderGen(){  
  8.     document.MyForm.action.value = 'test';  
  9.     document.MyForm.submit();  
  10. }  
  11. function msg(m){  
  12.     alert(m);  
  13. }  
  14. // --></mce:script>  

特别注意‘<html:form action="/myAction" target="myiframe">’中的target属性的值一定要等于form结尾那个iframe的名称(即name属性),这是该实现方式的原理所在,就是说这个MyForm提交服务器后由服务器响应回来的数据填充到这个iframe里面,而这个iframe是不可见的(display: none)。从而实现了提交后页面没有刷新的感觉。
接下来是服务器端的实现

  1. public class MyAction extends DispatchAction{  
  2.     public ActionForward test(ActionMapping mapping, ActionForm actionForm,  
  3.                                   HttpServletRequest request, HttpServletResponse response)  
  4.             throws Exception {  
  5.     String result = "hello I'm server";//要打印到前台的字符  
  6.         sendMsg(result,response,"msg");//msg是test.jsp中的那个js方法的名称  
  7.         return null;//必须返回null  
  8.     }  
  9.     //以下方法的意思是将msg打到前台页面调用前台的“function msg(m)”方法进行显示  
  10.     protected void sendMsg(String msg, HttpServletResponse response, String javascriptMethod) {  
  11.         try {  
  12.             response.setContentType("text/html;charset=GBK");  
  13.             response.getWriter().write(  
  14.                     "<mce:script type="text/javascript"><!--  
  15. parent." + javascriptMethod + "(/"" + msg + "/");  
  16. // --></mce:script>");  
  17.             response.flushBuffer();  
  18.         } catch (Exception e) {  
  19.             e.printStackTrace();  
  20.         }  
  21.     }  
  22. }  

sendMsg这个java生成了一段js代码将服务端的数据展示在了页面,页面会打出一个alert,如果你明白了这个原理那么你可以改写sendMsg和function msg(m),你可以将数据填到一个div中,这个效果就好像ajax一样页面连闪都不闪一下。
接下来实现长连接

  1. public class MyAction extends DispatchAction{  
  2.     public ActionForward test(ActionMapping mapping, ActionForm actionForm,  
  3.                                   HttpServletRequest request, HttpServletResponse response)  
  4.             throws Exception {  
  5.     int i = 0;  
  6.     boolean boo = true;  
  7.     String result = null;  
  8.     while(boo){  
  9.         try {  
  10.                 Thread.sleep(1000);  
  11.             } catch (InterruptedException e) {  
  12.                 e.printStackTrace();    
  13.             }  
  14.         result = "hello I'm server"+i;//要打印到前台的字符  
  15.         sendMsg(result,response,"msg");//msg是test.jsp中的那个js方法的名称  
  16.         i++;  
  17.         if(i==100){  
  18.             boo = false;  
  19.         }  
  20.     }  
  21.         return null;  
  22.     }  
  23.     //以下方法的意思是将msg打到前台页面调用前台的“function msg(m)”方法进行显示  
  24.     protected void sendMsg(String msg, HttpServletResponse response, String javascriptMethod) {  
  25.         try {  
  26.             response.setContentType("text/html;charset=GBK");  
  27.             response.getWriter().write(  
  28.                     "<mce:script type="text/javascript"><!--  
  29. parent." + javascriptMethod + "(/"" + msg + "/");  
  30. // --></mce:script>");  
  31.             response.flushBuffer();  
  32.         } catch (Exception e) {  
  33.             e.printStackTrace();  
  34.         }  
  35.     }  
  36. }  

不停的做循环操作以求达到长连接,前台会不停的打alert出来,这样做实现了服务器端向客户端推数据,同时服务器端的状态可以实时反映到前台,如果在你的项目中客户点击按钮后服务器将执行大量的长时间的操作的时候而客户又要实时监控操作的情况的时候不妨使用这种方式提升用户体验。随便说一句IE支持这种玩法firefox等浏览器也支持

来源:http://blog.csdn.net/fhp0917/article/details/4171818

  评论这张
 
阅读(456)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017