深入dwr2之三 Dwr2页面请求处理机制分析之engine.js

来源:互联网 发布:大襟绸缎面花棉袄淘宝 编辑:程序博客网 时间:2024/05/01 12:39

DWREnginedwr在客户端的存根,它其中的方法基本上不需要用户来直接调用;通常你会在服务器的dwr.xml定义需要暴露的java类及其可调用方法,dwr会根据这个配置文件自动生成一个dwr/interface/**.js文件,对应你暴露的java类及其方法,你会在本地调用**.js文件定义的方法,和调用java的方法一样,除了多了一个回调参数,然后这个方法会委托DWREngine._execute发出请求;

Engine.jsutil.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文件中的空行和注释;
更多详情

0 0