DWR中各种java方法的调用


Posted in Javascript onMay 04, 2016

DWR是一个框架,简单的说就是能够在javascript直接调用java方法,而不必去写一大堆的javascript代码。它的实现是基于ajax的,可以实现无刷新效果。

网上有不少DWR的例子,但大都只是某种方法的调用,本文只在使用层面上介绍DWR,并不涉更多的技术与设计,其目的是让初学者能够很快的学会各种java方法在javascript中是如何调用的。

  一、dwr配置篇之web.xml

1、最小配

<servlet>
 <servlet-name>dwr-invoker</servlet-name>
 <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet-mapping>
 <servlet-name>dwr-invoker</servlet-name>
 <url-pattern>/dwr/*</url-pattern>

</servlet-mapping>

 2、当我们想看DWR自动生成的测试页(Using debug/test mode)时,可在servlet配置中加上

<init-param>
 <param-name>debug</param-name>
 <param-value>true</param-value>
</init-param>

这个参数DWR默认是false。如果选择true,我们可以通过http://localhost:port/app/dwr看到你部署的每个DWR class。并且可以测试java代码的每个方法是否运行正常。为了安全考虑,在正式环境下你一定把这个参数设为false。

3、多个dwr.xml文件的配置

可能有几种情况,我们一一列举。一个servlet,多个dwr.xml配置文件;多个servlet,每个servlet对应一个或多个dwr.xml配置文件。

3.1、一个servlet,多个dwr.xml配置文件

<servlet>
 <servlet-name>dwr-invoker</servlet-name>
 <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
 <init-param>
  <param-name>config-1</param-name>
  <param-value>WEB-INF/dwr1.xml</param-value>
 </init-param>
 <init-param>
  <param-name>config-2</param-name>
  <param-value>WEB-INF/dwr2.xml</param-value>
 </init-param>
</servlet>

在这种配置下,param-name的值必须以config开头。param-name可以有>=0个。如果没有param-name,那么将会读取WEB-INF/dwr.xml。如果有大于零个param-name,那么WEB-INF/dwr.xml文件将不会被读取。

3.2、多个servlet,每个servlet对应一个或多个dwr.xml

<servlet>
 <servlet-name>dwr-invoker</servlet-name>
 <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet>
 <servlet-name>dwr-invoker1</servlet-name>
 <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
 <init-param>
  <param-name>config-admin</param-name>
  <param-value>WEB-INF/dwr1.xml</param-value>
 </init-param>
 <init-param>
  <param-name>debug</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>
<servlet-mapping>
 <servlet-name>dwr-invoker1</servlet-name>
 <url-pattern>/dwr1/*</url-pattern>
</servlet-mapping>

在这种情况下,我们可以根据J2EE security来控制权限,针对不同url,加不同的角色。

二、dwr使用篇

1、调用没有返回值和参数的JAVA方法

1.1、dwr.xml的配置

<dwr>

<allow>

<create creator="new" javascript="testClass" >

<param name="class" value="com.dwr.TestClass" />

<include method="testMethod1"/>

</create>

</allow>

</dwr>

标签中包括可以暴露给javascript访问的东西。

标签中指定javascript中可以访问的java类,并定义DWR应当如何获得要进行远程的类的实例。creator="new"属性指定java类实例的生成方式,new意味着DWR应当调用类的默认构造函数来获得实例,其他的还有spring方式,通过与IOC容器Spring进行集成来获得实例等等。javascript=" testClass "属性指定javascript代码访问对象时使用的名称。

标签指定要公开给javascript的java类名。

标签指定要公开给javascript的方法。不指定的话就公开所有方法。

标签指定要防止被访问的方法。

  1.2、javascript中调用

首先,引入javascript脚本

<script src='dwr/interface/ testClass.js'></script>

<script src='dwr/engine.js'></script>

<script src='dwr/util.js'></script>

其中TestClass.js是dwr根据配置文件自动生成的,engine.js和util.js是dwr自带的脚本文件。

其次,编写调用java方法的javascript函数

Function callTestMethod1(){

  testClass.testMethod1();

}

  2、调用有简单返回值的java方法

2.1、dwr.xml的配置

配置同1.1

<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value="com.dwr.TestClass" />
<include method="testMethod2"/>
</create>
</allow>
</dwr>

  2.2、javascript中调用

首先,引入javascript脚本

其次,编写调用java方法的javascript函数和接收返回值的回调函数

Function callTestMethod2(){
testClass.testMethod2(callBackFortestMethod2);
}
Function callBackFortestMethod2(data){
//其中date接收方法的返回值
//可以在这里对返回值进行处理和显示等等
alert("the return value is " + data);
}

其中callBackFortestMethod2是接收返回值的回调函数

  3、调用有简单参数的java方法

3.1、dwr.xml的配置

配置同1.1

<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value="com.dwr.TestClass" />
<include method="testMethod3"/>
</create>
</allow>
</dwr>

3.2、javascript中调用

首先,引入javascript脚本

其次,编写调用java方法的javascript函数

Function callTestMethod3(){
//定义要传到java方法中的参数
var data;
//构造参数
data = “test String”;
testClass.testMethod3(data);
}

4、调用返回JavaBean的java方法

4.1、dwr.xml的配置

<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value="com.dwr.TestClass" />
<include method="testMethod4"/>
</create>
<convert c match=""com.dwr.TestBean">
<param name="include" value="username,password" />
</convert>
</allow>
</dwr>

标签负责公开用于Web远程的类和类的方法,标签则负责这些方法的参数和返回类型。convert元素的作用是告诉DWR在服务器端Java 对象表示和序列化的JavaScript之间如何转换数据类型。DWR自动地在Java和JavaScript表示之间调整简单数据类型。这些类型包括Java原生类型和它们各自的封装类表示,还有String、Date、数组和集合类型。DWR也能把JavaBean转换成JavaScript 表示,但是出于安全性的原因,要求显式的配置,标签就是完成此功能的。c属性指定转换的方式采用JavaBean命名规范,match=""com.dwr.TestBean"属性指定要转换的javabean名称,标签指定要转换的JavaBean属性。

4.2、javascript中调用

首先,引入javascript脚本

其次,编写调用java方法的javascript函数和接收返回值的回调函数

其中callBackFortestMethod4是接收返回值的回调函数

  5、调用有JavaBean参数的java方法

5.1、dwr.xml的配置

<dwr>

<allow>

<create creator="new" javascript="testClass" >

<param name="class" value="com.dwr.TestClass" />

<include method="testMethod5"/>

</create>

<convert c match="com.dwr.TestBean">

     <param name="include" value="username,password" />

</convert>

</allow>

</dwr>

  5.2、javascript中调用

首先,引入javascript脚本

其次,编写调用java方法的javascript函数

Function callTestMethod5(){

     //定义要传到java方法中的参数

  var data;

  //构造参数,date实际上是一个object

  data = { username:"user", password:"password" }

  testClass.testMethod5(data);

}

并且在dwr.xml中增加如下的配置段

<signatures>
<![CDATA[
import java.util.List;
import com.dwr.TestClass;
import com.dwr.TestBean;
TestClass.testMethod7(Map<String,TestBean>);
]]>
</signatures>

3、由以上可以发现,对于java方法的返回值为List(Set)的情况,DWR将其转化为Object数组,传递个javascript;对于java方法的返回值为Map的情况,DWR将其转化为一个Object,其中Object的属性为原Map的key值,属性值为原Map相应的value值。

4、如果java方法的参数为List(Set)和Map的情况,javascript中也要根据3种所说,构造相应的javascript数据来传递到java中。

Javascript 相关文章推荐
如何取得中文输入的真实长度?
Jun 24 Javascript
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
Nov 28 Javascript
js/jQuery对象互转(快速操作dom元素)
Feb 04 Javascript
javascript进行四舍五入方法汇总
Dec 16 Javascript
JavaScript数组和循环详解
Apr 27 Javascript
在JavaScript中使用对数Math.log()方法的教程
Jun 15 Javascript
JavaScript中浅讲ajax图文详解
Nov 11 Javascript
利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换
Jan 13 Javascript
vue实现条件判断动态绑定样式的方法
Sep 29 Javascript
Vue使用watch监听一个对象中的属性的实现方法
May 10 Javascript
layer弹窗在键盘按回车将反复刷新的实现方法
Sep 25 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
Jul 19 Javascript
js实现div在页面拖动效果
May 04 #Javascript
JS功能代码集锦
May 04 #Javascript
Markdown与Bootstrap相结合实现图片自适应属性
May 04 #Javascript
浅析Bootstrap组件之面板组件
May 04 #Javascript
javascript截图 jQuery插件imgAreaSelect使用详解
May 04 #Javascript
js编写当天简单日历效果【实现代码】
May 03 #Javascript
javascript实现下雪效果【实例代码】
May 03 #Javascript
You might like
phpmyadmin MySQL 加密配置方法
2009/07/05 PHP
destoon调用discuz论坛中带图片帖子的实现方法
2014/08/21 PHP
Yii2隐藏frontend/web和backend/web的方法
2015/12/12 PHP
分析PHP中单双引号的误区和双引号小隐患
2016/07/19 PHP
PHP的简单跳转提示的实现详解
2019/03/14 PHP
一种JavaScript的设计模式
2006/11/22 Javascript
创建一个复制UBB软件信息的链接或按钮的js代码
2008/01/06 Javascript
判断浏览器的javascript版本的代码
2010/09/03 Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
2012/09/20 Javascript
js使用DOM操作实现简单留言板的方法
2015/04/10 Javascript
kindeditor编辑器点中图片滚动条往上顶的bug
2015/07/05 Javascript
jquery插件uploadify实现带进度条的文件批量上传
2015/12/13 Javascript
基于javascript实现最简单的选项卡切换效果
2016/05/16 Javascript
JavaScript事件学习小结(五)js中事件类型之鼠标事件
2016/06/09 Javascript
jQuery Ajax向服务端传递数组参数值的实例代码
2017/09/03 jQuery
vue-router动态设置页面title的实例讲解
2018/08/30 Javascript
Vue中key的作用示例代码详解
2020/06/10 Javascript
JavaScript Event Loop相关原理解析
2020/06/10 Javascript
[10:28]2018DOTA2国际邀请赛寻真——VGJ.S寻梦之路
2018/08/15 DOTA
仅用500行Python代码实现一个英文解析器的教程
2015/04/02 Python
解决python3 urllib 链接中有中文的问题
2018/07/16 Python
flask中的wtforms使用方法
2018/07/21 Python
python中使用you-get库批量在线下载bilibili视频的教程
2020/03/10 Python
Python flask框架如何显示图像到web页面
2020/06/03 Python
CSS3+js实现简单的时钟特效
2015/03/18 HTML / CSS
HTML5实现页面切换激活的PageVisibility API使用初探
2016/05/13 HTML / CSS
巴西最大的家电和百货零售商:Casas Bahia
2016/11/22 全球购物
adidas马来西亚官网:adidas MY
2020/09/12 全球购物
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
个人优缺点自我评价
2014/01/27 职场文书
八年级语文教学反思
2014/02/11 职场文书
工地安全生产标语
2014/06/06 职场文书
个人职业及收入证明
2014/10/13 职场文书
小学班主任经验交流材料
2014/12/16 职场文书
2015年度考核个人工作总结
2015/10/24 职场文书
2016简历自荐信优秀范文
2016/01/29 职场文书