DWR和Ajax的简介和精通

来源:互联网 发布:网络各层协议解析 编辑:程序博客网 时间:2024/06/04 18:32

                DWRAjax的简介

. DWR                    

1.     概念

Ø        DWR(Direct Web Remoting)

·是一个WEB远程调用框架,利用这个框架可以让AJAX开发变得很简单。

·改进了DHTML(DWRUtil)表格和形式,集成了StrutsJSFBeehive,且改进了与SpringHibernate及其他脚本语言的支持

 

>   DWR 是最专业也是支援最广的 AJAX 非同步传输 Framework

> 通俗的理解:

Dwr可以让客户端直接来调用服务器远程对象的方法

Dwrjava对象转换发送到客户端浏览器,也可以将JavaScript中间的内容发送到服务器

 

2.作用

> 它具有一套Javascript功能集,它们把从HTML页面调用应用服务器上的Java对象的方法简化了。

> 它操控不同类型的参数,并同时保持了HTML代码的可读性

 

3. dwr的设计构思很是巧妙:

> java类转化为javascript类由dwr自动完成,只需简单的配置。

> 应用起来极其简单。开发者不要该服务器代码就可以集成。

> 容易测试。和webwork一样,隐藏的http协议。

> 强扩展性。例如与spring集成,只需修改一点代码.

  自动把java对象转化为javascript对象,并且及易扩展

 

4. 解决问题:

> 让远端Java对象存放在 session application scope ?

@ 对象的 scope 可以透过 dwr.xml 內的 create 属性设定 application, session, request, page

< create creator="newjavascript="HelloWorld" scope="page" >

> 方法的参数可以是自定义的类型 ?

Conver: 定义在 dwr.xml 中描述远程对象,var r = Remote.method(param)

<!-- convertMessage的对象进行转换-->

<convert converter="bean match="com.yd.colbean.Message" />

> 任何远程服务器上的Java足见上的方法都可以调用?

可在 dwr.xml 中设定Java组件方法存取的权限

exclude   排除某个属性或方法

Include   包含某个属性和方法

<create creator="new" javascript="userAction" scope="session">

      <param name="class" value="com.yd.colbean.UserCol"></param>

      <include method="getUserMessage" /><exclude method=removeMessage/></create>

<convert converter="bean" match="com.yd.colbean.UserBean">

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

        <param name=exclude" value=password"></param>

</convert>

> dwr对应的远程对象中间,访问web容器中间的对象?例如获取request,response,session

import org.directwebremoting.WebContext;

import org.directwebremoting.WebContextFactory;

//得到WebContext对象

WebContext webcontext = WebContextFactory.get();

//得到对应的session对象

HttpSession session = webcontext.getSession();

//webcontext.getHttpServletRequest();

//webcontext.getHttpServletResponse();

> java对象的方法中间返回对象的集合?

可以返回集合对象.例如ListMap对象

List一般保存相同的对象.返回到客户端一个对象数组,

map返回一个集合,里面包含各个对象.

> 連續呼叫三個遠端函式, 這樣使用者會等比較久嗎?

會的.

解决方案: 

若需要將數個 dwr 功能一次送出, 請將需要在同一個交易內的功能放到 Batch

DWREngine.beginBatch()

webBean.getCount(deal);

webBean.addSession(100);

webBean.getCount(deal);

DWREngine.endBatch();

> 能否使用过滤器?

写一个类实现AjaxFilter接口,在配置文件中间配置即可

Dwr.Xml中加上<filter class="类的绝对位置"></filter>

 

> 客户端操作数据

·导入util.js.就可以使用下列方法

DWRUtil.getValue(username);         //这个方法得到页面中间idusername的值

DWRUtil.setValue(rst,”你好”);  //这个方法设置页面中间idusername的值

 

·对下拉框的操作

DWRUtil.removeAllOptions('rst');//删除列表中的所有option

//添加option对象,goods是对象数组,其属性id作为optionvalue值。其属性msg作为optiontext的值

DWRUtil.addOptions('rst', goods,"id","msg");

 

·对表格操作的方法

DWRUtil.removeAllRows("rst");//删除tbody中间所有的行

DWRUtil.addRows("rst", goods,[getid, getmsg]);//添加表的行,goods数组

 

 

 

 

 

 

5. 工作原理:

1web服务器启动,DWRServlet init()方法调用,init主要做了以下工作。设置日志级别、实例化DWR用到的单例类(这些类在jvm中只有一个实例对象)、读去配置文件(包括dwr.jar包中的dwr.xml,WEB-INF/dwr.xml. config*.xml)。

2请求处理

DWRServlet.doGet, doPost方法都调用processor.handle(req, resp)方法处理。

Processor对象在init()方法中已经初始化了。

>  engine.jsutil.js dwr 的公用 script, TestDWR.js 是自己註冊的遠端物件script

---Init()方法的代码:

String pathinfo = req.getPathInfo();   

 if(pathinfo != null && pathinfo.equalsIgnoreCase("/engine.js")){ doFile(resp, "engine.js", "text/javascript";} 

else  if(pathinfo != null && pathinfo.equalsIgnoreCase("/util.js")){doFile(resp, "util.js", "text/javascript");}

else  if(pathinfo != null && pathinfo.equalsIgnoreCase("/deprecated.js")){doFile(resp, "deprecated.js", "text/javascript");}

else  if(pathinfo != null && pathinfo.startsWith("/interface/")){ doInterface(req, resp); } 

else  if(pathinfo != null && pathinfo.startsWith("/exec")){doExec(req, resp); }

 

注意:

1dwr/index.htmldwr/test/这种只能在debug模式下使用,调试用。

dwr/engine.jsdwr/util.jsdwr/deprecated.js当这个请求到达,从dwr.jar包中读取文件流,响应回去。(重复请求有缓存)

2)当dwr/interface/这种请求到来,(例如我们在index.html中的 <script type='text/javascript' src='dwr/interface/JDate.js'></script>DWR做一件伟大的事。把我们在WEB-INF/dwr.xml中的

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

<param name="class" value="java.util.Date"/>

</create>

java.util.Date转化为javascript函数。

http://localhost:port/simpledwr/dwr/interface/JDate.js看看吧。

细节也比较简单,通过java反射,把方法都写成javascript特定的方法。(我觉得这些转换可以放到缓存里,下次调用没必要再生成一遍,不知道作者为什么没这样做)。

3dwr/exec

javascript调用方法时发送这种请求,可能是XMLHttpRequestIFrame发送。

当然,javascript调用的方法签名与java代码一致,包括参数,还有javascript的回调方法也传到了服务器端,在服务器端很容易实现。回调方法的java的执行结果 返回类似 <script>callMethod(结果)<script>javascript字符串,在浏览

 

 

 

 

 

 

. Ajax

1·出现的必要性:

> 传统web编程中,客户端和服务器进行数据交换的方式,使页面重复加载,

而页面重载循环是最大的一个使用障碍

>  Ajax(即asynchronous JavaScript And XML)是一种 Web 应用程序开发的手段,

它采用 客户端脚本 与 Web服务器交换数据。

所以,不必采用会中断交互的完整页面刷新,就可以动态地更新Web 页面,即无刷新更新页面技术

 

2·.涉及到的技术:

·基于标准的表示技术,使用 XHTML CSS标准化呈现

·动态显示和交互技术,使用Document Object Model(文档对象模型DOM)实现动态显示和交互

·数据互换和操作技术,使用 XML XSTL进行数据交换与处理,
·异步数据获取技术,   使用XMLHttpRequest对象进行异步数据读取Javascript 绑定和处理所有数据

 

3·优势:

> 减轻服务器负担,要什么数据取什么数据
>
无刷新更新页面,减少用户心理和实际的等待时间
>
带来更好的用户体验
>
不需要下载插件或者小程序,浏览器一般都支持
>
进一步促进页面呈现和数据的分离
>
可以调用外部数据,可以对一些开发的数据比如 XML 文档 RSS 文档进行二次加工。

> 形象的说,就是采用了Ajax技术以后,解决了用户烦于等待的现象,

它可以在用户毫无察觉的情况下完成与服务器的交互过程.

俗话:欢乐不间断,享受不打折

 

4·Ajax的缺陷:

> AJAX 大量使用了 Javascript AJAX 引擎,

  而这个取决于浏览器的支持 IE5.0 及以上、Mozilla1.0 NetScape7 及以上版本才支持,

  Mozilla 虽然也支持 AJAX,但是提供XMLHttpRequest 的方式不一样。

> AJAX 更新页面内容的时候并没有刷新整个页面,因此,网页的后退功能是失效的。

> 对流媒体的支持没有 FLASH, Java Applet 好。

> 一些手持设备(如手机, 掌上电脑(PDA) 等)现在还不能很好的支持 Ajax

 

5·典型应用

数据校验
级联菜单
读取外部数据

 

7*  XMLHttpRequest对象的应用

>  XMLHttpRequest XMLHTTP 组件的对象,通过这个对象,AJAX 可以像桌面应用程序一

样只同服务器进行数据层面的交换,而不用每次都刷新界面,工作都交给服务器来做,

从而减轻了服务器的负担

 

 

> 工程流程:

·对象初始化->发送请求-> 服务器接收-> 服务器返回-> 客户端接收 ->修改客户端页面内容

·XMLHttpRequest 对象初始化--->指定服务器返回数据后客户端浏览器的处理方式

---->发出HTTP请求---->处理服务器返回的信息(responseTextresponseXML)

 

 

 

6*  Ajax的工作原理

                                       原理介绍                          

                                  相当于在用户和服务器之间加了—个中间层, 使用户操作与服务器响应异步化。并                                不是所有的用户请求都提交给服务器,像—些数据验证和数据处理等都交给Ajax                                 擎自己来做,只有确定需要从服务器读取新数   据时再由Ajax引擎代为向服务器提交                               请求(主要是读取XML格式的数据)

 

 

 

 

 

 

 

 

 

 

 

 

 

 
原创粉丝点击