DWR使用日记

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

 

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念