dwr调用的方法不按照先后顺序dwr回调执行异常怎么办?

&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
DWR调用远程方法的错误和异常处理
摘要:记得以前通常我们在调用DWR的远程方法是这样写Remote.method(params,function(data){//服务端执行后客户端的逻辑,如alert(&服务端执行后返回的数据:&+data);});Remote.method(params,function(data){//服务端执行后客户端的逻辑,如alert(&服务端执行后返回的数据:&+data);});第一个至倒数第二个参数为客户端传向服务端的数据,最后一个参数直接就
记得以前通常我们在调用 DWR 的远程方法是这样写Remote.method(params,function(data){ //服务端执行后客户端的逻辑,如 alert(&服务端执行后返回的数据:&+data); }); Remote.method(params,function(data){ //服务端执行后客户端的逻辑,如 alert(&服务端执行后返回的数据:&+data);});
第一个至倒数第二个参数为客户端传向服务端的数据,最后一个参数直接就是一个回调函数。因为服务端根据 Java 对象生成的 js 代码就是:Remote.method = function(p0, callback) { dwr.engine._execute(Remote._path, 'Remote', 'method', p0, callback);}
所以很直观的把第二个参数理解为就是一个回调函数。当然要注意了,上面说的远程方法都是一个参数,如果为多个参数的话,callback 总是最后一个参数,如:Remote.method= function(p0, p1, callback) { dwr.engine._execute(Remote._path, 'Remote', 'method', p0, p1, callback);}
你的 DWR 程序要是一切顺利,那都好说,算你幸运;而要是碰到了远程方法在处理你的请求时抛出了异常,你将会看到 DWR 只会给你一个 alert(&Error&) 简单显示错了,而这是不够的。所以你需要去琢磨如何主动捕获种这一错误,更友好的展示给用户。所以若碰到远程调用的异常,你同样是幸运的,因为又可以思考来学到一着。
那个 alert(&Error&) 其实是 DWR 的全局错误处理,可通过 dwr.engine.setErrorHandler(errorHandler) 来改变它的默认行为的,如function errh(errorString, exception) { alert(&提示你自定义的全局出错信息。&);}dwr.engine.setErrorHandler(errh);
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
邮箱低至5折
推荐购买再奖现金,最高25%
&200元/3月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
DWR调用远程方法的错误和异常处理相关信息,包括
的信息,所有DWR调用远程方法的错误和异常处理相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International我在做公司某个框架时有这么一个需求。每次调用dwr的方法前要检查用户是否已经登录,否则就不能执行并且退到首页。
当然了,做拦截器有很多方式,但经过研究发现DWR自带很多插件,其中就有一个调用处理的插件。具体做法如下。
在web.xml里的DWR配置中加入一个参数:
&init-param&
&&&&&&&&&&&&&param-name&
&&&&&&&&&&&&&&&&org.directwebremoting.extend.Remoter
&&&&&&&&&&&&&/param-name&
&&&&&&&&&&&&&param-value&com.xxx.base.framework.web.MyDWRRemoter&/param-value&
&&&&&&&&&/init-param&
然后自己创建这个实现类。
public&class&MyDWRRemoter&extends&DefaultRemoter
&&&&public&Replies&execute(&Calls&calls&)
&&&&&&&&HttpSession&session&=&WebContextFactory.get().getSession();
&&&&&&&&ISessionContainer&sc&=&(&ISessionContainer&)&session.getAttribute(&ISessionContainer.SESSION_CONTAINER_KEY&);
&&&&&&&&//session检查
&&&&&&&&if&(&sc&==&null&||&sc.getUserInfo()&==&null&)
&&&&&&&&&&&&logOut();
&&&&&&&&&&&&return&super.execute(&new&Calls()&);
&&&&&&&&else
&&&&&&&&&&&&IUserInfo&userInfo&=&sc.getUserInfo();
&&&&&&&&&&&&if(!SecurityFactory.getInstance().isOnline(&userInfo.getUserID(),&session.getId()&))
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&logOut();
&&&&&&&&&&&&&&&&return&super.execute(&new&Calls()&);
&&&&&&&&&&&&}
&&&&&&&&return&super.execute(&calls&);
&&&&private&void&logOut()
&&&&&&&&WebContext&wct&=&WebContextFactory.get();
&&&&&&&&Util&utilThis&=&new&Util(wct.getScriptSession());
&&&&&&&&utilThis.addScript(&new&ScriptBuffer("logOut()"));
其中,检查用户是否登录,如果没有登录就返回一个空的super.execute( new Calls());, 不能返回null否则会报错。
检查通过就调用super.execute( calls );& 其实calls里还能获得很多信息。
最后大家注意logOut方法,这里用到了DWR2.0新功能:DWR反向调用,就是DWR调用javascript,具体用法大家网上可以查到,需要配置的,我这里就不多说了。补充一下,addScript调用的是html里的function logOut().
这样的话,如果用户session超时,或被管理员踢掉,一旦他做任何dwr操作就会被强迫登出到首页了。
ISessionContainer
SecurityFactory
如何导入&&&&
&re: [原创]DWR2.0的调用前拦截
@bln13fb
这是我们公司自己的类,这里只是个范例,你自己有自己的类&&&&
&re: [原创]DWR2.0的调用前拦截
在你这个应用里面怎么可以获得请求的URL呀,我想判断一下用户是否对某一个资源是否有访问权限的时候怎么样才能知道他是访问的那个资源呢&&&&博客分类:
项目使用Ext作为表现层,由dwr异步调用义务逻辑方法,通过filter过滤请求来实现权限管理,通过检查session中是否有User对象来判断是否为登陆用户。 这样做出现一个问题,当session过期时,异步调用方法无法得到相应的提示。
于是要通过对dwr.engine 进行修改来实现session 过期时有适当的提示信息。要点如下:
1. 在web.xml配置filter,对dwr方法调用路径进行拦截,url-partern(*.dwr);
在filter中编写代码,当session中有User对象时放行,session没有User对象时,执行response.setStatus(1000); 1000使我们自己指定的状态码。
2. 在jsp页面中引入dwr的js文件后执行如下js代码:
dwr.engine._stateChange = function(batch) {
if (batch.completed) {
dwr.engine._debug("Error: _stateChange() with batch.completed");
var req = batch.
if (req.readyState != 4)
catch (ex) {
dwr.engine._handleWarning(batch, ex);
// It's broken - clear up and forget this call
dwr.engine._clearUp(batch);
var reply = req.responseT
reply = dwr.engine._replyRewriteHandler(reply);
var status = req. // causes Mozilla to except on page moves
if (reply == null || reply == "") {
dwr.engine._handleWarning(batch, { name:"dwr.engine.missingData", message:"No data
received from server" });
else if (status != 200) {
if ( status == 1000) {
alert("未登录或登录超时,请重新登录");
dwr.engine._handleError(batch, { name:"dwr.engine.http." + status,
message:req.statusText });
var contentType = req.getResponseHeader("Content-Type");
if (!contentType.match(/^text\/plain/) && !contentType.match(/^text\/javascript/)) {
if (contentType.match(/^text\/html/) && typeof batch.textHtmlHandler == "function") {
batch.textHtmlHandler();
dwr.engine._handleWarning(batch, { name:"dwr.engine.invalidMimeType", message:"Invalid content type: '" + contentType + "'" });
// Comet replies might have already partially executed
if (batch.isPoll && batch.map.partialResponse == dwr.engine._partialResponseYes) {
dwr.engine._processCometResponse(reply, batch);
if (reply.search("//#DWR") == -1) {
dwr.engine._handleWarning(batch, { name:"dwr.engine.invalidReply", message:"Invalid reply from server" });
catch (ex) {
dwr.engine._handleWarning(batch, ex);
dwr.engine._callPostHooks(batch);
// Outside of the try/catch so errors propogate normally:
dwr.engine._receivedBatch =
if (toEval != null) toEval = toEval.replace(dwr.engine._scriptTagProtection, "");
dwr.engine._eval(toEval);
dwr.engine._receivedBatch =
dwr.engine._clearUp(batch);
其中红色的代码是我们添加的,其余为engine.js的源代码,我们状态为我们制定的1000时,弹出提示信息,并且中止执行其他其他操作,不再执行回调函数。
浏览: 11997 次
来自: 苏州
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'描述性分类
Discuz! X1.5后台
X-Space系列
来自站长百科
&create creator=&new& javascript=&testClass& &
&param name=&class& value=&com.dwr.TestClass& /&
&include method=&testMethod2&/&
首先,引入javascript脚本
其次,编写调用java方法的javascript函数和接收返回值的回调函数
Function callTestMethod2(){
testClass.testMethod2(callBackFortestMethod2);
Function callBackFortestMethod2(data){
//其中date接收方法的返回值
//可以在这里对返回值进行处理和显示等等
alert(&the return value is & + data);
其中callBackFortestMethod2是接收返回值的回调函数
&create creator=&new& javascript=&testClass& &
&param name=&class& value=&com.dwr.TestClass& /&
&include method=&testMethod3&/&
首先,引入javascript脚本
其次,编写调用java方法的javascript函数
Function callTestMethod3(){
//定义要传到java方法中的参数
//构造参数
data = “test String”;
testClass.testMethod3(data);
&create creator=&new& javascript=&testClass& &
&param name=&class& value=&com.dwr.TestClass& /&
&include method=&testMethod4&/&
&convert converter=&bean& match=&&com.dwr.TestBean&&
&param name=&include& value=&username,password& /&
&/convert&
&creator&标签负责公开用于Web远程的类和类的方法,&convertor&标签则负责这些方法的参数和返回类型。convert元素的作用是告诉DWR在服务器端Java 对象表示和序列化的JavaScript之间如何转换数据类型。DWR自动地在Java和JavaScript表示之间调整简单数据类型。这些类型包括Java原生类型和它们各自的封装类表示,还有String、Date、数组和集合类型。
DWR也能把JavaBean转换成JavaScript 表示,但是出于安全性的原因,要求显式的配置,&convertor&标签就是完成此功能的。converter="bean"属性指定转换的方式采用JavaBean命名规范,match=""com.dwr.TestBean"属性指定要转换的javabean名称,&param&标签指定要转换的JavaBean属性。
首先,引入javascript脚本
其次,编写调用java方法的javascript函数和接收返回值的回调函数
Function callTestMethod4(){
testClass.testMethod4(callBackFortestMethod4);
Function callBackFortestMethod4(data){
//其中date接收方法的返回值
//对于JavaBean返回值,有两种方式处理
//不知道属性名称时,使用如下方法
for(var property in data){
alert(&property:&+property);
alert(property+&:&+data[property]);
//知道属性名称时,使用如下方法
alert(data.username);
alert(data.password);
其中callBackFortestMethod4是接收返回值的回调函数
&create creator=&new& javascript=&testClass& &
&param name=&class& value=&com.dwr.TestClass& /&
&include method=&testMethod5&/&
&convert converter=&bean& match=&com.dwr.TestBean&&
&param name=&include& value=&username,password& /&
&/convert&
首先,引入javascript脚本
其次,编写调用java方法的javascript函数
Function callTestMethod5(){
//定义要传到java方法中的参数
//构造参数,date实际上是一个object
data = { username:&user&, password:&password& }
testClass.testMethod5(data);
&create creator=&new& javascript=&testClass& &
&param name=&class& value=&com.dwr.TestClass& /&
&include method=&testMethod6&/&
&convert converter=&bean& match=&com.dwr.TestBean&&
&param name=&include& value=&username,password& /&
&/convert&
注意:如果List、Set或者Map中的元素均为简单类型(包括其封装类)或String、Date、数组和集合类型,则不需要&convert&标签。
首先,引入javascript脚本
其次,编写调用java方法的javascript函数和接收返回值的回调函数
Function callTestMethod6(){
testClass.testMethod6(callBackFortestMethod6);
Function callBackFortestMethod6(data){
//其中date接收方法的返回值
//对于JavaBean返回值,有两种方式处理
//不知道属性名称时,使用如下方法
for(var i=0;i&data.i++){
for(var property in data){
alert(&property:&+property);
alert(property+&:&+data[property]);
//知道属性名称时,使用如下方法
for(var i=0;i&data.i++){
alert(data[i].username);
alert(data[i].password);
&create creator=&new& javascript=&testClass& &
&param name=&class& value=&com.dwr.TestClass& /&
&include method=&testMethod7&/&
&convert converter=&bean& match=&com.dwr.TestBean&&
&param name=&include& value=&username,password& /&
&/convert&
&signatures&
import java.util.L
import com.dwr.TestC
import com.dwr.TestB
TestClass.testMethod7(List&TestBean&);
&/signatures&
&/dwr&&pre&
&signatures&标签是用来声明java方法中List、Set或者Map参数所包含的确切类,以便java代码作出判断。
===javascript中调用(以返回List为例,List的元素为TestBean)===
首先,引入javascript脚本
其次,编写调用java方法的javascript函数
&pre&Function callTestMethod7(){
//定义要传到java方法中的参数
//构造参数,date实际上是一个object数组,即数组的每个元素均为object
username:&user1&,
password:&password2&
username:&user2&,
password:& password2&
testClass.testMethod7(data);
1、对于调用返回List、Set或者Map的java方法的情况,如果java方法的返回值为Map,则在接收该返回值的javascript回调函数中如下处理:
function callBackFortestMethod(data){
//其中date接收方法的返回值
for(var property in data){
var bean = data[property];
alert(bean.username);
alert(bean.password);
2、对于调用有List、Set或者Map参数的java方法的情况,如果java的方法的参数为Map(假设其key为String,value为TestBean),则在调用该方法的javascript函数中用如下方法构造要传递的参数:
function callTestMethod (){
//定义要传到java方法中的参数
//构造参数,date实际上是一个object,其属性名为Map的key,属性值为Map的value
username:&user1&,
password:&password2&
username:&user2&,
password:& password2&
testClass.testMethod(data);
并且在dwr.xml中增加如下的配置段
&signatures&
import java.util.L
import com.dwr.TestC
import com.dwr.TestB
TestClass.testMethod7(Map&String,TestBean&);
&/signatures&
由以上可以发现,对于方法的返回值为List(Set)的情况,DWR将其转化为Object数组,传递个javascript;对于java方法的返回值为Map的情况,DWR将其转化为一个Object,其中Object的属性为原Map的key值,属性值为原Map相应的value值。
如果java方法的参数为List(Set)和Map的情况,javascript中也要根据3种所说,构造相应的数据来传递到java中。关于dwr回调函数不执行的一个很小的问题,新人可能会犯
原文主要内容来自https://blog.csdn.net/ntt126796/article/details/在页面中使用&%@ page language="java" pageEncoding="GBK"%&&html&
&title&JSP for LoginForm form&/title&
&script type='text/javascript' src='dwr/interface/JUserChecker.js'&&/script&
&script type='text/javascript' src='dwr/engine.js'&&/script&
&script type='text/javascript' src='dwr/util.js'&&/script&
function checkU(oCtl){
var uname=oCtl.
JUserChecker.check(uname,haolejiaowo);
function haolejiaowo(isExist){
if(isExist==1){
alert("hao");
else if(isExist==0){
alert("error");
}&/script&
&form action="" name="form1"&
&input name="uname" onblur="checkU(this)"&
&/body&&/html&
黄色标识处,本人按原文编写,运行时dwr测试配置正常,但毫无提示,既不执行后台java方法更不执行回调方法,而调转了顺序,先引入engine.js再引用JUserChecker.js,问题就解决了。
本人新手菜鸟,刚接触不久,如果是因为别的错误歪打正着,望大神指点。
此处发文,是不想同我一样的新手碰上这样的问题没有办法。如转载有影响到原作者,望与我联系,必立刻删除。
没有更多推荐了,

我要回帖

更多关于 jq按先后顺序执行 的文章

 

随机推荐