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 相关文章推荐
Javascript全局变量var与不var的区别深入解析
Dec 09 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
Jan 26 Javascript
使用jquery动态加载js文件的方法
Dec 24 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
Jun 04 Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
May 10 Javascript
Web打印解决方案之证件套打的实现思路
Aug 29 Javascript
Javascript中八种遍历方法的执行速度深度对比
Apr 25 Javascript
vue二级菜单导航点击选中事件的方法
Sep 12 Javascript
JS实现数组去重及数组内对象去重功能示例
Feb 02 Javascript
JavaScript学习教程之cookie与webstorage
Jun 23 Javascript
小程序实现层叠卡片滑动效果
Aug 26 Javascript
javascript实现倒计时效果
Feb 17 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
图象函数中的中文显示
2006/10/09 PHP
php下HTTP Response中的Chunked编码实现方法
2008/11/19 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
2014/12/24 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
2015/10/26 PHP
深入浅析PHP无限极分类的案例教程
2016/05/09 PHP
Yii数据模型中rules类验证器用法分析
2016/07/15 PHP
yii2缓存Caching基本用法示例
2016/07/18 PHP
轻松实现php文件上传功能
2017/02/17 PHP
ImageFlow可鼠标控制图片滚动
2008/01/30 Javascript
JavaScript 继承详解 第一篇
2009/08/30 Javascript
详解前后端分离之VueJS前端
2017/05/24 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
Layui数据表格之单元格编辑方式
2019/10/26 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
Vue实现渲染数据后控制滚动条位置(推荐)
2019/12/09 Javascript
JavaScript ES 模块的使用
2020/11/12 Javascript
python制作企业邮箱的爆破脚本
2016/10/05 Python
解决Python pandas plot输出图形中显示中文乱码问题
2018/12/12 Python
python利用openpyxl拆分多个工作表的工作簿的方法
2019/09/27 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
实例讲解HTML5的meta标签的一些应用
2015/12/08 HTML / CSS
Under Armour西班牙官网:美国知名的高端功能性运动品牌
2018/12/12 全球购物
Richards网上商店:当代时尚,遍布巴西
2019/11/03 全球购物
SmartBuyGlasses荷兰:购买太阳镜和眼镜
2020/03/16 全球购物
大三自我鉴定范文
2013/10/05 职场文书
搞笑创意广告语
2014/03/17 职场文书
2014年预备党员端正入党动机思想汇报
2014/09/13 职场文书
2014年学生党支部工作总结
2014/12/20 职场文书
2015年文员个人工作总结
2015/04/09 职场文书
党员违纪检讨书
2015/05/05 职场文书
2019年聘任书的写作格式及范文!
2019/07/03 职场文书
基于Go语言构建RESTful API服务
2021/07/25 Golang
Python中可变和不可变对象的深入讲解
2021/08/02 Python
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS