`

DWR使用入门

阅读更多

  这篇文章为转载,原文作者写的已经很好了,我复制的时候尽量不丢失原文风格,我只在最后补充一点,我遇到的错误:
  原文连接:http://www.cnblogs.com/a7345678/archive/2008/10/23/1317982.html 作者:暗夜精灵-鬼才阁
这两天学了下DWR,现在总结一下。
DWR是方便使用AJAX连接JS和JAVA的的一个框架,把服务器端 Java 对象的方法公开给 JavaScript 代码。
如果是用dwr2.0的jar包,还需要同时导入,log4j.jar和commons-loggin.jar , 勿忘!!
web.xml和dwr.xml放在WEB-INF下!
-----------------------------
配置web.xml:WEB 工程启动的时候会在这个里面找到具体所用到的类的路径,由此进行加载

<servlet>
    <servlet-name> dwr-invoke </servlet-name>
    <servlet-class> uk.ltd.getahead.dwr.DWRServlet </servlet>
    <init-param> //这个是调试用,如果正式发布请该为false,不过听说2.0就默认为true了
       <param-name> debug </param-value>
       <param-value> true </param-value>
    </init-param>
    <init-param> //这个是DWR2.0必须的,不然会报java.lang.IllegalArgumentException
       <param-name> classes </param-value>
       <param-value> java.lang.Object </param-value>
</servlet>

<servlet-mapping>
    <servlet-name> dwr-invoke </servlet-name>
    <url-pattern> /dwr/* </url-pattern>
</servlet-mapping>

 


-----------------------------
配置dwr.xml: dwr.xml的作用是让你告诉DWR哪些class中的哪些方法你需要暴露给前台使用,当DWR启动时候根据dwr.xml这个文件把java类中的方法转成js中可用的类中方法,使前台可以使用

注:以下是不全按dwr2.0写的,如果用的是DWR2.0,那java里暴露类(蓝字显示)不能写在<create>属性里,应删除后写在<include method="" />前,<param name="class" value="***java里暴露的class,必须写完整路径***" />。

<dwr>
    <allow>
       <create creator="new" javascript="***js调用的class***" class="***java里暴露的class,必须写完整路径***">
           <include method="***java暴露类里要公开的方法,如果不写默认全部公开***" />
       </create>
    </allow>
</dwr>


-----------------------------
在html或js页面中加入

<script src="<%=basePath %>dwr/interface/java里暴露的class"></script>  //切记不能<script *** />这样写
<script src="<%=basePath %>dwr/engine.js"></script>   //Dwr的脚本驱动Js,以上两个必写
<script src="<%=basePath %>dwr/util.js"></script>   //这是个工具包,可以不调用
<script type="text/javascript">
    function doMethod()
    {
        //调用方法:若公开的类是AAA,公开的AAA里的方法是bbb([参数]);
        AAA.bbb([参数],callBack);//回调函数callBack()
    }

    function callBack(data)//data是后台返回的值,名字自取,也可省略,因为JS允许
    {
       处理方法……;//如果callBack()没有写明返回值,可以通过argments[0]拿到
    }
</script>

 




其实我们调用AAA.bbb([参数],callBack);就是做了以下这一步:
(下面红字是包装好的,不在前台,所以即使你没有创建html或者jsp来调用,也可以通过localhost:8080/工程名/dwr 来看到你暴露的java类进行测试)

function AAA() { };
    AAA.bbb = function([参数], callback)
    {
        DWREngine._execute('/dwr/dwr', 'AAA', 'bbb', [参数], callback);
    }

 


通过在dwr.xml暴露的方法得到js里的方法,当我们调用AAA.bbb时候再通过/dwr/dwr转到DWRServlet中去用JAVA里的AAA.bbb方法,然后返回值到callback中(中间经过dwr.xml的convert)


----------------------------
上面对dwr的工作大致分析了下,现在对于参数类型的不同,对dwr.xml也要进行修正。

DWR自动地在Java和JavaScript表示之间调整简单数据类型,这些类型包括Java原生类型和它们各自的封装类表示,还有String、Date、数组和集合类型。但如果参数类型非简单数据类型,则要通过转换。

调用返回JavaBean的java方法


在dwr.xml的<allow>标签中加入

<convert converter="bean" match="***一般来说是javabean***">  //int,String,list等不需要显式的转换就可以被js拿到
     <param name="include" value="***javabean中的属性,用','隔开***" />  //这句可以不写
</convert>

 



<creator>标签负责公开用于Web远程的类和类的方法,<convertor>标签则负责这些方法的参数和返回类型。convert元素的作用是告诉DWR在服务器端Java 对象表示和序列化的JavaScript之间如何转换数据类型。

这样在js端回调函数直接拿到的data就是一个javabean,可以直接通过data.xxx拿到bean的属性xxx。


调用有JavaBean参数的java方法


dwr.xml配置同上。

在JS端,把要传入的参数写成javabean方式,例:要传入一个名为student的javabean,参数有name,password,则
var stu = {name:"zhangsan",password:"zspassword"}; //这是json的表示方法
AAA.bbb(stu,callBack);


调用返回List、Set或者Map的java方法


dwr.xml配置同上。如果Collection里的数据是简单数据类型,则可不需要写<convert>

在JS端,以List,里面数据是bean为例,data是一个List型,只要用for循环就可以依次拿到数据。
遍历方法1:

for(var i=0;i<data.length;i++) 
    /*对于java方法的返回值为List(Set)的情况,DWR将其转                                 化为Object数组,传递个javascript*/
{
    alert(data[i].name+":"+data[i].password);
}

 



遍历方法2:

for(var property in data) //property为序号,从0开始
{
    var bean = data[property];
    alert(bean.name+":"+bean.password);
}

 


相比返回为javabean多了一个遍历而已。

如果java方法的返回值为Map,则如下

for(var property in data) //property为key值
    /*对于 java方法的返回值为Map的情况,DWR将其转化为一个Object,
     其中Object的属性为原Map的key值,属性值为原Map相应的 value值*/
{
  var bean = data[property];
  alert(bean.username);
  alert(bean.password);
}

 



如果知道key值,则可直接用:data.key拿到value



调用有List、Set或者Map参数的java方法


在dwr.xml的<dwr>标签内加入:<signatures>标签。

<signatures>标签是用来声明java方法中List、Set或者Map参数所包含的确切类,以便java代码作出判断,是js-->java的。


例参数是javabean的List,则只要在参数为javabean的例子里构造时候加上[]即可,如下:

var stu = [{name:"zhangsan",password:"zspassword"},{name:"lisi",password:"lspassword"}];
//把List当作数组来处理
AAA.bbb(stu,callBack);

 



并且在dwr.xml中增加如下的配置段(刚才试验了下,不加也可以)

<signatures>
<![CDATA[
  import java.util.List;
  import com.dwr.AAA;     //AAA的包路径要写完整
  import com.dwr.TestBean;  //javabean
  AAA.bbb(List<TestBean>);
]]>
</signatures>

 



例参数是javabean的Map,key是String,value是javabean,如下:

var stu =

{
    "key1":{name:"zhangsan",password:"zspassword"},
    "key2":{name:"lisi",password:"lspassword"}
};

AAA.bbb(stu,callBack);

 


并且在dwr.xml中增加如下的配置段(刚才试验了下,不加也可以)

<signatures>
<![CDATA[
  import java.util.List;
  import com.dwr.AAA;     //AAA的包路径要写完整
  import com.dwr.TestBean;  //javabean
  AAA.bbb(Map<String,TestBean>);
]]>
</signatures>

 

好了以下是我的东西:

我是用的是dwr-2.06(官网下的):

我的web.xml:

<listener>
		<listener-class>
			org.directwebremoting.servlet.EfficientShutdownServletContextAttributeListener
		</listener-class>
	</listener>
	<listener>
		<listener-class>
			org.directwebremoting.servlet.EfficientShutdownServletContextListener
		</listener-class>
	</listener>
	<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>
				initApplicationScopeCreatorsAtStartup
			</param-name>
			<param-value>true</param-value>
		</init-param>
		<init-param>
			<param-name>maxWaitAfterWrite</param-name>
			<param-value>-1</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>dwr-invoker</servlet-name>
		<url-pattern>/dwr/*</url-pattern>
	</servlet-mapping>

 其余,没什么区别了。我遇到了问题就是 关于字符串的问题:

 例如,我要个Div的innerHTML加如下内容,result是个字符串:

 

Div.innerHTML+="<a class='fontliststyle' onclick='showrse('"+result+"')'>"+result+"</a><br>";

这样的话就会出错,onclick调方法的时候,将方法前后的单引号(')去掉就好了 。如下:

Div.innerHTML+="<a class='fontliststyle' onclick=showrse('"+result+"')>"+result+"</a><br>";

Dwr 设置同步异步(全局的):

DWREngine.setAsync(false); 同步  DWREngine.setAsync(true); 异步

分享到:
评论

相关推荐

    dwr使用入门总结

    dwr使用入门总结,适合想入门的dwr学者。

    AJAX技术之DWR框架入门

    **AJAX技术之DWR框架入门** AJAX(Asynchronous JavaScript and XML)是一种在无需刷新整个页面的情况下,能够更新部分网页的技术。它通过在后台与服务器进行少量数据交换,使得网页实现异步更新。这种技术可以提升...

    Dwr入门操作手册Dwr

    Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr...

    dwr简单入门例子

    最近发现了一个java框架,这个框架已经...这个框架叫dwr,它可以在jsp页面编写js直接调用java的类的方法。原理其实就是它把你的java类发布成了接口服务,js的调用也是ajax的一些封装,有些地方使用这个框架真的很方便。

    dwr 包的 使用入门

    以下是对DWR包的使用入门的详细说明: 1. **DWR的安装与配置**: - 在Java项目中引入DWR库,通常通过Maven或Gradle添加依赖。 - 配置DWR的`dwr.xml`文件,定义允许的远程方法和类,这是DWR的核心配置文件,用于...

    dwr框架入门学习文档

    DWR 框架入门学习文档 DWR(Direct Web Remoting)是一个开放源码的使用 Apache 许可协议的解决方案,它包含服务器端 Java 库、一个 DWR Servlet 以及 JavaScript 库。DWR 框架是最成熟的 Ajax-RPC 工具包之一,...

    DWR快速配置入门 DWR快速配置入门.

    DWR(Direct Web Remoting)是一种Java库,用于在Web应用程序中实现实时的双向通信。它允许JavaScript和服务器端的Java代码之间直接交互,从而创建动态...阅读`DWR中文文档.pdf`将进一步深入理解DWR的使用和配置细节。

    ajax的DWR框架入门例子

    接下来,我们将探讨如何使用DWR进行基本操作: 1. **创建Java类**:首先,我们需要在服务器端创建一个或多个Java类,这些类将被暴露给前端。类中的方法应具有公共访问权限,并且不涉及敏感操作。 2. **配置DWR**:在...

    最完整的DWR入门文档及DWR使用案例

    这个“最完整的DWR入门文档及DWR使用案例”包含的资源无疑将帮助你深入理解和高效使用DWR。 首先,DWR的核心功能是提供了一种跨域的通信机制,使得前端JavaScript可以直接调用后端Java方法,就像操作本地函数一样,...

    DWR+dwr入门手册

    通过深入学习"DWR+dwr入门手册",你将掌握如何使用DWR构建高效的Ajax应用,提升Web应用的用户体验。记得实践中不断探索,理解DWR的原理并熟练运用到实际项目中,这将对你的IT职业生涯大有裨益。

    dwr框架入门程序

    在"Dwr框架入门程序"中,我们将探讨DWR的基本概念、安装、配置以及如何创建一个简单的"Hello World"应用。 1. **DWR框架的基本概念**: DWR的核心功能是提供一种安全、高效的方式,让JavaScript能够调用服务器上的...

    dwr API dwr入门教程

    在DWR入门教程中,首先会介绍DWR的基本概念和工作原理。DWR的核心是将Java方法暴露给JavaScript,通过在服务器端创建一个称为"逆向Ajax"的通道,使得JavaScript能够调用远程服务器上的Java方法。这个过程涉及到几个...

    dwr学习入门资料

    ### DWR入门配置步骤 #### 步骤一:配置Web.xml文件 在`web.xml`文件中配置DWR相关的servlet。这里通过注册一个名为`dwr_servlet`的servlet,该servlet继承自`org.directwebremoting.servlet.DwrServlet`类。此外...

    dwr入门 dwr学习资料

    DWR(Direct Web Remoting)是一...通过学习这套DWR入门资料,你将能够熟练地使用DWR创建动态、交互性强的Web应用,提高开发效率,同时提升用户体验。实践中不断探索,理论与实战相结合,将助你在Web开发领域更进一步。

    dwr 快速入门手册

    在DWR的快速入门中,首先需要进行的是配置。在Web应用的`web.xml`文件中,你需要定义一个名为`dwr-invoker`的Servlet。这是DWR的核心,负责处理来自客户端的请求并调用相应的Java方法。最基本的配置包括以下两部分:...

    dwr的入门实例

    在“dwr的入门实例”中,我们将探索如何设置和使用DWR来创建一个简单的Ajax应用。这个实例可以帮助初学者理解DWR的工作原理和基本配置步骤,以便在实际项目中应用。 1. **安装与配置DWR** - 首先,你需要将DWR的...

    dwr初学入门小例子

    通过这个"dwr初学入门小例子",你将学习如何设置DWR环境,配置服务器和客户端,以及如何使用DWR进行基本的交互。实践中,你可以先创建一个简单的Java类,然后逐步增加功能和复杂性,逐渐掌握DWR的精髓。记得多尝试,...

    dwr3_helloword入门

    在本教程中,我们将学习如何使用DWR 3.0进行快速入门,通过一个简单的“Hello, World”实例来理解其工作流程。 首先,我们需要创建一个Web工程,并导入DWR 3.0的相关库。这通常包括DWR的核心JAR包和可能需要的日志...

Global site tag (gtag.js) - Google Analytics