1.web.xml的配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> <!-- 指定处于开发阶段的参数 --> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>activeReverseAjaxEnabled</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>org.directwebremoting.extend.ServerLoadMonitor</param-name> <param-value>org.directwebremoting.impl.PollingServerLoadMonitor</param-value> </init-param> <init-param> <param-name>crossDomainSessionSecurity</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>allowScriptTagRemoting</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping> </web-app>
2.dwr.xml的配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd"> <dwr> <allow> <create creator="new" javascript="testjs">//这里的javascript标签里的内容相当于给test类取了个别名,在js里使用时就是用这个名字取调用函数,注意不用实例化对象,可以直接调用 <param name="class" value="mail.javafile.test">//指明你要调用的类的路径 </param> </create> </allow> </dwr>
注意事项:要引用的函数必须声明为public,否则会报对象找不到这个属性或者方法的错误,这是一个很隐秘的坑,因为只有public才能允许不同包非子类的范围去访问这个函数
3.关于js引用:
使用dwr需要引入几个js文件,这几个js文件可以通过在启动路径后,加web.xml中配置的<url-pattern>/dwr/*</url-pattern>指定的dwr路径查询
如下图:
点击testjs链接后会有这样的界面提示你去引入相应的js文件:
复制一下然后在需要使用dwr的网页引入这几个js文件即可
4.关于调用:
1.在js里以一种类似于调用静态函数的方式调用后台的函数,例如后台的test类中有一testfunc函数,我们就可以在js里以testjs.testfunc(callback)的方式调用,这里的testjs是在dwr.xml文件中配置的test类的别名,callback是在js里指定的一个回调函数,用来进行结果的返回,注意不能用var result = testjs.testfunc()的方式获得返回值,必须指定回调函数来接收返回值
2.如果程序要求同步的话,可以使用 DWREngine.setAsync(false)命令在调用后台函数前将程序设置为同步,之后再设为true设置为异步
3.注意调用的类如果使用new构造器的话,不要自己去定义有参数的构造函数,因为new构造器会调用没有参数的构造函数来实现实例化,而且dwr调用函数不支持重载,如果自己定义了有参数的构造函数,而new构造器却没有传入参数去构造,会引发java.lang.InstantiationException错误,也就是初始化实例错误,具体解析见https://blog.csdn.net/chow__zh/article/details/7733694
4.注意不指定scope的话,scope默认为page,每次调用一次函数都会重新new一个对象进行调用,所以对于变量的范围问题要注意,虽然看起来我们是执行的同一个对象,但实际上是不同的对象,所以如果我们要操作的是一个对象,那么将create的scope属性改为application即可,也就是当前对象在整个应用程序存活,或者通过指定script属性,用脚本语言去构造一个实例,实现单例模式,如
通过类的getinstance()函数去获取静态的实例,这样所有构造的实例都是一个实例,为单例模式
5.关于前后端数据交互类型,像map,list等数据相关的使用和配置:
我觉得这篇博客讲的挺好:https://www.cnblogs.com/xuzai/p/4286315.html