dwr框架帶引數,而且有返回值的方法呼叫

楊帆9527發表於2017-06-13

        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框架遇到的問題差不多都記下來了,給自己留個備份,同時希望能給需要幫助的人提供參考!

最後再說一句,CSDN的草稿箱真是個好東西,我寫到一多半斷網,頁面沒了,傷心欲絕,通網之後,居然儲存在草稿箱裡面,瞬間樂的我無法形容!




相關文章