DWR调用后总是报出缺少对象的错误

来源:互联网 发布:mac office 激活教程 编辑:程序博客网 时间:2024/04/29 11:35

        在我们现有的工程中,很多时候在点击某些操作控件之后,进行DWR的ajax方式验证后会发现报出缺少对象的JS错误,并且DWR方法的返回值不能正确得到,导致了系统中很多的功能无法实现。这个问题主要是因为我们在调用DWR的过程中创建了很多的对于全局所有的页面的一个DWR推送。让我们来分析下这个问题:

        在DWR中,我们的页面和后台进行交互,当一个页面创建时,dwr就根据sessionId来和这个页面进行连接,每个调用DWR的页面都会和dwr后台创建一个连接,这种连接有两种启动方式,一种是页面主动请求调用,类似下面的方式:

        这种方式在调用后,DWR打开和页面之间的连接,让页面将数据提交给后台方法处理后再返回,处了这种方式之外,还有一种方式,该方式DWR和该页面的连接一直打开,当dwr调用传递时,页面时时接受,从而达到推送的效果,类似下面的方式:

          通过在body中配置onload方法来设定该页面和后台之间形成一种常打开的连接方式,再在后台调用DWR推送的

          但是这样会有一个问题,后一种方式在推送时若没有设置好范围就会变成全局推送,导致任何一个调用了DWR方法的页面都会接受到推送的信息,并且在向后台递交请求接受返回值时接受到,比如一个判断名字的方法,调用DWR来判断名字是否重复,然后返回true或者false来判断,在返回值的时候出了返回原来的结果外,还将原来滞留在连接中未传递给页面的 执行userOnlineNum方法的指令也传递了过来,而该页面中没有这个方法,就会出现userOnlineNum找不到,即报出缺少对象的JS错误。

        解决的方案主要是两种,一种是在传递时指定具体的接受页面,如下面的方式:

        但是笔者尝试后发现效果不佳,有可能还有别的原因阻断的结果,所以采用了另外一种方式,设置一个全局JS包,在JS包中放入几个时时推送的JS方法,不做任何逻辑处理,只是单纯的用来解决缺少对象的问题,如下:

       有人可能会觉得如果调用了全局方法会不会和原本需要调用的页面冲突。大可放心,因为如果页面和外部引用的JS包中含有同名同参数方法时,会首先调用页面中的JS方法。而每个页面和DWR的连接都是独立的,也不用担心相互干预的问题。

       对这块其实了解甚少,只是系统中出现了BUG才关注跟踪了一下,希望有兴趣的一起来讨论下~

 

 

 

 

原创粉丝点击