DWREngine是dwr在客户端的存根,它其中的方法基本上不需要用户来直接调用;通常你会在服务器的dwr.xml定义需要暴露的java类及其可调用方法,dwr会根据这个配置文件自动生成一个dwr/interface/**.js文件,对应你暴露的java类及其方法,你会在本地调用**.js文件定义的方法,和调用java的方法一样,除了多了一个回调参数,然后这个方法会委托DWREngine._execute发出请求;
Engine.js与util.js不同之处在于,util.js是静态js文件,可以直接从jar文件中拿出来,页面可以直接引用;而engine.js则有部分动态内容,这决定了它必须经过servelt资源请求,在servelt为动态内容赋值之后,才可以返回给客户端;
/** The original page id sent from the server */
dwr.engine._origScriptSessionId = "${scriptSessionId}";
/** The session cookie name */
dwr.engine._sessionCookieName = "${sessionCookieName}"; // JSESSIONID
/** Is GET enabled for the benefit of Safari? */
dwr.engine._allowGetForSafariButMakeForgeryEasier = "${allowGetForSafariButMakeForgeryEasier}";
/** The script prefix to strip in the case of scriptTagProtection. */
dwr.engine._scriptTagProtection = "${scriptTagProtection}";
/** The default path to the DWR servlet */
dwr.engine._defaultPath = "${defaultPath}";
/** Do we use XHR for reverse ajax because we are not streaming? */
dwr.engine._pollWithXhr = "${pollWithXhr}";
这些变量值,会在页面每次刷新时,服务器会重新赋值;
一、下面是engine.js中一些变量和方法的解释:
1、origScriptSessionId:
原始脚本sessionid,随每次刷新而改变;它与我们所说的httpsessionid是有区别的,httpsessionid是保存在服务器端,origScriptSessionId是保存在客户端的;
2、dwr.engine._getJSessionId
得到我们所说的httpsessionid,这个id在整个会话生命周期内不变;
3、dwr.engine._sessionCookieName
由_getJSessionId方法引用,用来获取httpsessionid的;
4、scriptSessionId
页面sessionid,由origScriptSessionId加上一个随机数生成;它是客户端发给server的;每次发送值都不相同;
5、preHooks
前钩方法在dwr进行远程方法调用的之前调用
6、postHooks
后钩方法在dwr进行远程方法调用的之后调用;
7、DWREngine.beginBatch()
开始批处理; 包装请求头
8、DWREngine.endBatch()
提交批处理;
9、rpcType
dwr的请求类型;
DWREngine.defaultMessageHandler(abc);默认的消息句柄;
DWREngine.setTextHtmlHandler;当接收到html时发生的事件;
DWREngine.setErrorHandler(abc); 默认错误句柄;
DWREngine.setWarningHandler(abc);默认警告句柄;
DWREngine.setTimeout(0); 超时时间设置,默认是0;
//三种调用方法;
DWREngine.XMLHttpRequest = 1;
DWREngine.IFrame = 2;
DWREngine.ScriptTag = 3;
DWREngine.setMethod(<1 or 2 or 3>);设置调用远程的方法;
DWREngine.setVerb = function(<‘GET‘ or ‘POST‘>);设置发送数据的方法;
DWREngine.setOrdered(<true or false>);设置xhr的请求按顺序执行.<官方强烈建议不要用这个,会变的很慢而且无法预测.>
DWREngine.setAsync (<true or false>);设置xhr的请求方法是否异步?默认是true(异步);
二、url对应的处理handler
1、createUrlMapping(container, "/engine.js", "engineHandlerUrl", EngineHandler.class);
2、org.directwebremoting.servlet.EngineHandler.java
继承了FileHandler,并且setDynamic(true);
首先根据/engine.js 从scriptCache 里取,如果没有的话根据/org/directwebremoting/engine.js,从classpath路径加载;从输入流每行过滤${}的字符,由LocalUtil类替换成真正的内容;
scriptCompressed :是否保留javascrpt文件中的空行和注释;
更多详情