dwr框架主要就是可以使用js在前端直接调用后台的java方法,这个框架是基于ajax实现的,也可以理解为是对ajax的封装,不过dwr框架很直接,只要后台有写好的执行方法,就可以直接调用,action层之类等等完全不用写,这是我对dwr一点个人理解,如果不妥,还请指正。
dwr框架的配置这里就不说了,网上有很多,说的也很详细,我这里就不介绍了,唯一要说明的一点就是dwr框架要用两个jar包,dwr.jar和commons-logging.jar这两个包,当初配置的时候,看了好几个配置介绍,都没有提及后面的jar包。
好,废话说完了,下面进入正题,配置完成后,就可以在前端用js直接调用java的后台方法,但是当初第一次调用就出问题了,如果调用一个带参数而且有返回值的方法,改怎么调用那?作为一个菜鸟,百度是我的解决办法,不过查了很长时间,最后居然在外网找到了解决办法,我很郁闷!
我的前端dwr的js引用是这样的:
<!-- 引入dwr框架js文件 -->
<script type="text/javascript" src="/BaiduMap/dwr/util.js"></script>
<script type="text/javascript" src="/BaiduMap/dwr/engine.js"></script>
<script type="text/javascript" src="/BaiduMap/dwr/interface/sql.js"></script>
sql.js是配置文件里面自己配置的,不懂的看看dwr配置流程就OK了
那么带参有返回值的方法调用改怎么写那,我最终查到几种方法,但是只记住和用到其中一种
调用格式基本是这样:
sql.MethodName(参数1,参数2,function(value){
var str = value;
})
var str1 = str;
基本格式就是这样,如果没有参数,直接不写参数就可以,MethodName就是方法名,value是用来接收返回值,大多数应该都是json字符串,特殊的返回值,例如Map,list等等就不介绍了。
但是到了这里就会出现一个很蛋疼的不算bug的bug,因为dwr默认是异步执行的,所以,在这个sql.MethodName()里面,无法给外部变量赋值,所以,如果输出str1,就会出现未定义错误。
本人菜鸟,解决方法有两种,第一:把dwr的异步更改为同步,在方法调用前面或者随便合适的地方,加上这句话:
dwr.engine.setAsync(false);//为false 则是同步执行
很显然,第一种方法只能饮鸩止渴,所以我找到了第二种,把要执行的js代码段,放到调用方法里面,如下:
sql.selectTwo(select_type,select_date,function(value){
var json = JSON.parse(value); //后台获取的json数据串
function getNum(arr,n,v) {
for (var i = 0; i < arr.length; i++)
if (arr[i][n]==v)
return arr[i];
}
document.getElementById("uptd01").innerHTML= getNum(json,"sid",1).sum;
})
菜鸟写的代码不好,但是意思大家应该能看懂,直接把执行的代码段在接收返回值的方法里面执行,这样就不用给外部变量进行赋值操作了,不用担心同步和异步的问题。
好了,敲了这么半天键盘,这几天用dwr框架遇到的问题差不多都记下来了,给自己留个备份,同时希望能给需要帮助的人提供参考!
最后再说一句,优快云的草稿箱真是个好东西,我写到一多半断网,页面没了,伤心欲绝,通网之后,居然保存在草稿箱里面,瞬间乐的我无法形容!