在dwr.xml中有,<creator>标签负责公开用于Web远程的类和类的方法,实际上最后调用的就是本包下面的script创建类。
creator类型在1.1版本的时候有如下几种,现在是3.0版本了,我查了下源码,种类好像比下面要多(查XXXCreator有多少个)。
new: 用Java的new关键字创造对象。
none: 它不创建对象,看下面的原因。 (v1.1+)
scripted: 通过BSF使用脚本语言创建对象,例如BeanShell或Groovy。
spring: 通过Spring框架访问Bean。
jsf: 使用JSF的Bean。 (v1.1+)
struts: 使用Struts的FormBean。 (v1.1+)
pageflow: 访问Beehive或Weblogic的PageFlow。 (v1.1+)
creator是在什么时候调用的呢?
实际上,在Serlvet加载的时候有个doPost方法,doPost方法调用handle,handle再调用
remotor,remotor最终调用相应的creator,比如NewCreator,creator实际上是执行创建script字符串的工作。
举例来说,我们想在html中某个地方直接显示当前时间的long值,那么我们就可以调用java.util.Date类的getTime()方法。dwr.xml中写法如下:
<dwr>
<allow>
<createcreator="new"javascript="JDate">
<paramname="class"value="java.util.Date"/>
</create>
<createcreator="new"javascript="Demo">
<paramname="class"value="your.java.Bean"/>
</create>
</allow>
</dwr>
我们知道这样所有的/dwr/*所有请求都由这个servlet来处理,那么实际上,浏览器加载
<script type='text/javascript'
src='dwr/interface/JDate.js'></script>时,实际上是在触发servlet,这次触发属于系统
触发,不做事的,只有执行javascript调用方法时如:
functiongetServerDateTime(){
JDate.getTime(handleGetTime);
}
functionhandleGetTime(dateTime){
DWRUtil.setValue("date",dateTime);
}
才会触发下面
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsIOException,ServletException
{
doPost(req,resp);
}
doGet会调用到doPost
protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,ServletException
{
try
{
webContextBuilder.set(request,response,getServletConfig(),getServletContext(),container);
UrlProcessorprocessor=container.getBean(UrlProcessor.class);
processor.handle(request,response);
}
finally
{
webContextBuilder.unset();
}
}
在proccessor中我们看到如下代码
publicvoidhandle(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException
{
try
{
StringpathInfo=request.getPathInfo();
contextPath=request.getContextPath();
if(pathInfo==null||pathInfo.length()==0||"/".equals(pathInfo))
{
response.sendRedirect(contextPath+request.getServletPath()+indexHandlerUrl);
}
else
{
//LoopthroughalltheknownURLs
for(Entry<String,Object>entry:urlMapping.entrySet())
{
Stringurl=entry.getKey();
//IfthisURLmatches,callthehandler
if(pathInfo.startsWith(url))
{
Handlerhandler=(Handler)entry.getValue();
handler.handle(request,response);
return;
}
}
notFoundHandler.handle(request,response);
}
}
catch(Exceptionex)
{
exceptionHandler.setException(ex);
exceptionHandler.handle(request,response);
}
}
这些handle有多种
1,
/**
* A Handler that supports requests for auth.js
*/
public class AuthHandler extends JavaScriptHandler
2,
/**
* A Handler that supports requests for engine.js
* @author Joe Walker [joe at getahead dot ltd dot uk]
*/
public class EngineHandler extends JavaScriptHandler
3,
/**
* A Handler that supports requests for util.js
* @author Joe Walker [joe at getahead dot ltd dot uk]
*/
public class GiHandler extends JavaScriptHandler
4,
/**
* A handler for interface generation requests
* @author Joe Walker [joe at getahead dot ltd dot uk]
*/
public class InterfaceHandler extends JavaScriptHandler
上面三种都是系统范围的handle,对于我们自己编写的类,应该是触发InterfaceHandler 。
我们再看如下关系
public abstract class CachingFileHandler implements Handler
public abstract class TemplateHandler extends CachingFileHandler
public abstract class JavaScriptHandler extends TemplateHandler
public class InterfaceHandler extends JavaScriptHandler
逐级往上继承
InterfaceHandler,我们看到如下代码,执行顺序-4,里面调用了远程remoter
protectedStringgenerateTemplate(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException
{
StringscriptName=request.getPathInfo();
scriptName=scriptName.replace(interfaceHandlerUrl,"");
StringcontextServletPath=request.getContextPath()+request.getServletPath();
if(scriptName.endsWith(PathConstants.EXTENSION_JS))
{
scriptName=scriptName.replace(PathConstants.EXTENSION_JS,"");
if(!LocalUtil.isJavaIdentifier(scriptName))
{
log.debug("Throwingatrequestforscriptwithname:'"+scriptName+"'");
thrownewSecurityException("ScriptnamesmayonlycontainJavaIdentifiers");
}
returnremoter.generateInterfaceScript(scriptName,contextServletPath);
}
elseif(scriptName.endsWith(PathConstants.EXTENSION_SDOC))
{
scriptName=scriptName.replace(PathConstants.EXTENSION_SDOC,"");
if(!LocalUtil.isJavaIdentifier(scriptName))
{
log.debug("Throwingatrequestforscriptwithname:'"+scriptName+"'");
thrownewSecurityException("ScriptnamesmayonlycontainJavaIdentifiers");
}
returnremoter.generateInterfaceSDoc(scriptName,contextServletPath);
}
else
{
log.debug("Throwingatrequestforscriptwithunknownextension:'"+scriptName+"'");
thrownewSecurityException("Unknownextension");
}
}
类JavaScriptHandler代码如下,调用了父类TemplateHandler的generateCachableContent方法执行顺序-2
protectedStringgenerateCachableContent(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException
{
Stringoutput=super.generateCachableContent(request,response);
if(debug||compressor==null)
{
returnoutput;
}
try
{
returncompressor.compressJavaScript(output);
}
catch(Exceptionex)
{
log.warn("Compressionsystem("+compressor.getClass().getSimpleName()+")failedtocompressscript",ex);
returnoutput;
}
}
TemplateHandler类代码如下执行顺序-3,里面调用了generateTemplate方法
protectedStringgenerateCachableContent(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException
{
Stringtemplate=generateTemplate(request,response);
Map<String,String>replace=getSearchReplacePairs();
if(replace!=null)
{
for(Map.Entry<String,String>entry:replace.entrySet())
{
Stringsearch=entry.getKey();
if(template.contains(search))
{
template=template.replace(search,entry.getValue());
}
}
}
returntemplate;
}
/***//**
*Generateatemplatetoundergosearchandreplaceprocessingaccordingto
*thesearchandreplacepairsfrom{@link#getSearchReplacePairs()}.
*@paramrequestTheHTTPrequestdata
*@paramresponseWherewewritetheHTTPresponsedata
*@returnAtemplatestringcontaining${}sectionstobereplaced
*/
protectedabstractStringgenerateTemplate(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException;
CachingFileHandler类代码如下,handle方法里面调用了generateCachableContent()方法
执行顺序-1
publicvoidhandle(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException
{
if(isUpToDate(request))
{
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
return;
}
Stringoutput;
synchronized(scriptCache)
{
Stringurl=request.getPathInfo();
output=scriptCache.get(url);
if(output==null)
{
output=generateCachableContent(request,response);
}
scriptCache.put(url,output);
}
response.setContentType(mimeType);
response.setDateHeader(HttpConstants.HEADER_LAST_MODIFIED,CONTAINER_START_TIME);
response.setHeader(HttpConstants.HEADER_ETAG,ETAG);
PrintWriterout=response.getWriter();
out.println(output);
}
代码有点绕
我们看到在InterfaceHandler类中
有一行代码如下:
remoter.generateInterfaceScript(scriptName, contextServletPath);
如果按例子,对于声明在dwr.xml中的JDate类,scriptName应该是JDate,contextServletPath应该是'dwr/interface/'
执行generateInterfaceScript方法生成相应的字符串,对应于JDate.js
在CachingFileHandler类中的方法handle最后一行如下,
out.println(output);
在这个地方,将返回内容输出到客户端。
分享到:
相关推荐
org.directwebremoting.servlet.DwrServlet <init-param> <param-name>debug</param-name> <param-value>true</param-value>//开启调试 </init-param> <servlet-name>dwr-invoker ...
DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站。它可以允许在浏览器里的代码使用行在WEB服务器上的JAVA函数,就像它就在浏览器...
做个extjs 与dwr结合的例子dwr2.0 jdk6.0 dwr 取不到数据 困扰了我一天 后来下载了xalan.jar 包导入工程 ok 2009-8-16 10:18:39 org.directwebremoting.util.CommonsLoggingOutput info 信息: DWR Version 2.0.5 ...
从project中提取的dwr部分实现 博文链接:https://ankor.iteye.com/blog/138778
antlr-2.7.7.jar aopalliance-1.0.jar asm-3.3.jar asm-commons-3.3.jar commons-fileupload-1.2.2.jar commons-io-2.4.jar commons-lang3-3.1.jar commons-logging-1.1.1.jar dom4j-1.6.1.jar druid-1.0.1.jar ...
dwr jar 包,外面找不到。commons-logging.jar dwr.jar DwrSpringAnnotations.jar
org.directwebremoting.servlet.DwrServlet <init-param> <param-name>debug</param-name> <param-value>true</param-value>//开启调试 </init-param> <servlet-name>dwr-invoker...
DWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样.
jsp聊天系统(及时消息),运用jsp javascript ajax 技术!
① 以maven方式组织DWR源码依赖的jar包 ② 下载了github上的DWR源代码, 对其进行了尽可能少的修改, 使其满足SpringBoot以jar包方式独立运行的需要 源码地址: https://github.com/directwebremoting/dwr 2.提供了...
DWR source code 博文链接:https://zhangljerry.iteye.com/blog/64375
火龙果软件工程技术中心 DWR DWR(DirectWebRemoting)是一个WEB远程调用框架.利用这个框架可以让AJAX开发变得很简单.利用DWR可以在客户端利用JavaScript直接调用服务端的Java方法并返回值给JavaScript就好像直接...