DWR笔记

一、相关信息

1.概述:开源框架,允许前端JS用Ajax方式调用后台Java代码。很常用很重要。

2.原理DWR定义了一套JS,通过JS向后台发请求,请求路径为/dwr/*,在web.xml文件中配置的DWR可以将请求发给相应的servlet,该servlet通过参数用反射机制动态调用java代码,参数配置在dwr.xml文件中。

3.优点:开发效率高,使用框架的开发效率都非常高;

缺点:反射机制是动态加载相应的类的,所以执行效率低,但也低不到哪里去。

权衡:小项目不用DWR,直接用JSP/servlet;大项目用DWR,能简化开发。

4.注意

<1>. DWR版本为3.X和2.X,一般用2.X,比较成熟。下载地址和API在官网。

<2>. DWR需要依赖Apache的commentslogging jar包,需要一起使用。

二、使用简介:导包> 配xml> 改DTD> 定义处理类> 前端引入三个JS> 使用

1.导入DWR 2.x和 Apache commens logging的jar包。

2.配置web.xml文件:可以从官网copy,如下:

<servlet>

<display-name>DWRServlet</display-name>

<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>

</servlet>

<servlet-mapping>

<servlet-name>dwr-invoker</servlet-name>

<url-pattern>/dwr/*</url-pattern>

</servlet-mapping>

 注意:如果是tomcat v7以上的版本,需啊哟在<servlet>标签里加上一组<init-param>参数,不然会报A request has been denied as a potential CSRF attack配置如下:

<init-param>

<param-name>crossDomainSessionSecurity</param-name>

<param-value>false</param-value>

</init-param>

3.创建一个新的dwr的配置文件:

在web.xml相同目录下,创建名为dwr.xml的配置文件,文件内容可以从官网copy到。dwr.xml文件的作用是指定dwr可以操作的java类,不配置的类不能操作以增加安全性。

4.前端使用时要引入三个js文件,这三个文件都包含于dwr.jar,所以只需要在页面加入三句<script>就好:

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

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

<script src=” dwr/interface/XX.js ”></script>

// 注意:这里的XX.js是dwr.xml里配置的javascript=”XX”.

三、常用点深入研究DWR要点)

1. 参数:前后台参数自动转型

(注意:仅限常用类型如String,boolean,int,Date等,自定义类的类型和jdk罕见类型需要配dwr.xml)

2. 返回值:前台用最后一个匿名函数获得返回值。

(注意:不能var一个变量接收dwr前端JS函数的返回值)

3. 对象的操作:

<1>. 在dwr.xml中注册要操作的自定义的类,让dwr知道有该类的存在,最常用的是JavaBean规范,在参数中converter设为"bean";

<2>. 然后可以操作了,后台JavaBean对象,前台Json对象,一一对应。

4. 集合的操作(数组的操作):

<1>. 同上,在dwr.xml文件中注册自定义类,让dwr知道有一个类存在,最好用javaBean规范;

<2>. 然后操作即可,后台集合容器,前台Json数组,一一对应。

5. 不是所有的类的方法都可以调,不想让客户端调用的方法需要在dwr.xml中做如下配置:

<include method="test1" /> : 表示只能调用类中的test1(),test2()方法。

<exclude method="test3" /> : 表示不能调用test3()这个方法,其他都可以掉。

6. 需要获得作用域,则可以通过WebContext获取,代码如下 :

WebContext wc = WebContextFactory.get();

wc.getSession();

wc.getHttpServletRequest();

wc.getServletContext();

7. 注意点

1. dwr是Ajax框架,所以返回的参数data是出不来匿名函数的。即:

var name;

dwrTest.test1(function(data){

name = data;

});

以上是不可能的。

所以,用前端验证通用方法是submit标签里的onclick函数永远返回false,如果验证成功,做一下两件事:(1).后台的的java代码直接用dwr提供的WebContext获取作用域session、request等等,并设置其值;(2).在前端的dwr参数匿名函数内部直接使用window.location.href跳转。

e.g:

java代码:

public class Login(){

//登陆验证的方法

public StringloginCheck(String uName,String pwd){

if(uName=="Alvin"){

if(pwd=="mmdog"){ //登陆成功

//用WebContext对象获取dwr提供的servlet的作用域

WebContext wc =WebContextFactory.get();

wc.getSession().setAttribute("user",new User(uName,pwd));

return "Success";

} else{ //密码错误

return "pwd error !";

}

} else { //用户名错误

return "uName error !";

}

}

}

前端JS代码:

<input type="submit" name="Sub" value="提交"onclick="return checkIt()">

<script>

/*

此函数是始终返回false,验证成功则直接在dwr参数匿名函数内部跳转,此处讲忽略,后台也用WebContext对象设置了session。

*/

function checkIt(){

var uName =document.getElementsByName("Username")[0].value;

var pwd =document.getElementsByName("Password")[0].value;

dwrLogin.loginCheck(uName,pwd,function(data){

alert(data);

if(data == "Success"){

//此处直接跳转,因为data出不了该dwr的匿名函数

window.location.href ="XXXservlet?param=xx&param=xx";

}

});

returnfalse; //此处始终返回false

}

</script>

四、注意点:

<1>.其中的参数debug值为true,意思是:打印调试信息,一般开发时为true,上线时改为false,不该页无所谓。

<2>.配完后无需再写一个servletdwr.jar包里有一套反射机制的类,能读取dwr.xml中配置的参数来匹配请求的参数,自动反射实例化dwr.xml中配置的类。

<3>.测试配置是否成功的方法:浏览器输入:

http//localhost:8080/HelloProject/dwr/engine.js

engine.js可以调用内置一个配置,查看是否成功配置。

<4>.配置dwr.xml时,注意将首页的dwr配置信息的DTD3.0改为2.0,不然不能用。

<5>.如果是tomcat v7以上的,注意web.xml文件里的配置要多加一组<init-param>,见上文2.2

<6>.常用技巧:前台发送请求的JS名称一般命名为:后台处理的类名后加”JS”,这样前台调用时可以直接在JS里写:类目 + ”JS” + ”.” + 类中方法名,完成前台对后台的调用。

DWR可以简单完成如下功能:

用户登陆信息验证注册信息验证前台天气预报自动实时刷新股票信息实时刷新 等等… …

DWR笔记的更多相关文章

  1. html5 拖拽及用 js 实现拖拽功能的示例代码

    这篇文章主要介绍了html5 拖拽及用 js 实现拖拽,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. amaze ui 的使用详细教程

    这篇文章主要介绍了amaze ui 的使用详细教程,本文通过多种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. HTML5适合的情人节礼物有纪念日期功能

    这篇文章主要介绍了HTML5适合的情人节礼物有纪念日期功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. HTML5 WebSocket实现点对点聊天的示例代码

    这篇文章主要介绍了HTML5 WebSocket实现点对点聊天的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. swift皮筋弹动发射飞机ios源码

    这是一个款采用swift实现的皮筋弹动发射飞机游戏源码,游戏源码比较详细,大家可以研究学习一下吧。

  6. Swift与Js通过WebView交互

    开发环境:Swfit2.3XCode8.2基础概念jscontext,jscontext是代表JS的执行环境,通过-evaluateScript:方法就可以执行一JS代码JSValue,JSValue封装了JS与ObjC中的对应的类型,以及调用JS的API等JSExport,JSExport是一个协议,遵守此协议,就可以定义我们自己的协议,在协议中声明的API都会在JS中暴露出来,才能调用Swif

  7. JSCore swift

    如果双方相互引用,会造成循环引用,而导致内存泄露。以上是Jscore的基本使用,比较简单

  8. Swift WKWebView的js调用swift

    最近项目需求,需要用到JavaScriptCore和WebKit,但是网上的资源有限,而且比较杂,都是一个博客复制另外一个博客,都没有去实际敲代码验证,下面给大家分享一下我的学习过程。

  9. Swift WKWebView的swift调用js

    不多说,直接上代码:在html里面要添加的的代码,显示swift传过去的参数:这样就实现了swift给js传参数和调用!

  10. 在 Swift 專案中使用 Javascript:編寫一個將 Markdown 轉為 HTML 的編輯器

    你有強烈的好奇心,希望在你的iOS專案中使用JavaScript。jscontext中的所有值都是JSValue對象,JSValue類用於表示任意類型的JavaScript值。因此,我們既需要寫Swift代碼也要寫JavaScript代碼。此外,我們還會在JavaScript中按照這個類的定義來創建一個對象并對其屬性進行賦值。從Swift中呼叫JavaScript就如介紹中所言,JavaScriptCore中最主要的角色就是jscontext類。一個jscontext對象是位於JavaScript環境和本

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部