Direct Web Remoting 的简称

    技术2022-05-11  122

    1. 简介DWR 是Direct Web Remoting 的简称.可以通过脚本直接调用java方法.和其他代理框架相比,DWR后台严格限制必须以java为后台.有相当完善的文档支持网址: http://getahead.ltd.uk/dwr/2. 环境搭建与配置1. 从 http://getahead.ltd.uk/dwr/ 下载dwr.jar2. web.xml 文件中 DWR Servlet的配置<servlet><servlet-name>dwr-invoker</servlet-name><servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class><init-param><param-name>debug</param-name><param-value>true</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dwr-invoker</servlet-name><url-pattern>/dwr/*</url-pattern></servlet-mapping>DWRServlet 的 debug参数的选项:1.true : 可以通过我们就可以http://server:port/webapp/dwr/ 查看,当前有哪些类可以供javascript调用2.false :部属到实际应用时记得要设置为false3. 编写后台的java类package com.rbi.stady;public class DwrTestServiceImpl {public String getMessage(String name){return "Hello "+name;}}4. DWR配置文件默认文件: WEB-INF/下的dwr.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd"><dwr><allow><create creator="new" javascript="dwrTest"><param name="class" value="com.rbi.stady.DwrTestServiceImpl" /></create></allow></dwr>5. HTML添加DWR的js和自动生成的后台代码1.<script type="text/javascript" src="<%=request.getContextPath()%>/dwr/engine.js"></script>2.<scripttype="text/javascript" src="<%=request.getContextPath()%>/dwr/interface/dwrTest.js"></script>6. js的调用dwrTest.getMessage(‘Jack’,getDataFun)function getDataFun(data){…………}3. DWR配置文件1. 类的配置:1.远程调用类的配置<create creator="new" javascript="dwrTest" scope="request"><param name="class" value="com.rbi.stady.DwrTestServiceImpl" /><include method="checkUser" /><!--<exclude method="..."/>--></create><create>标签: creator (必须项)值范围:new,spring,scripted 1.1x 版本后新增 none, jsf,struts,pageflowscope (可选项)值范围 : "application", "session"(*1), "request" 和"page"。默认page<param>标签:<create>标签为”new”时值为“class” value值为类路径“spring”时值为“beanName” value值为bean的配置名称<include>和<exclude>标签:method=”方法名”有此标签或二者选其一无: 所有方法都可访问<include>:此列表的方法可访问,不在其内的不可访问<exclude>:此列表的方法不可访问,不在其内的可访问安全上比较好的设计是使用" include "而不是" exclude"。2.Bean的配置<convert converter="bean" match="example.Fred"/><param name="include" value="property1, property2"/> <!--<param name="exclude" value="property1, property2"/> --></convert> <param>标签设定限制属性同方法只不过用逗号隔开.如果要允许转换一个包或者子包下面的所有类,可以这样写:<convert converter="bean" match="your.full.package.*"/>显而易见,这样写是允许转换所有的JavaBean:<convert converter="bean" match="*"/>2. 返回的变量:1. 基本的类型:boolean, byte, short, int, long, float, double, char, java.lang.Boolean, java.lang.Byte, java.lang.Short, java.lang.Integer, java.lang.Long, java.lang.Float, java.lang.Double, java.lang.Character, java.math.BigInteger, java.math.BigDecimal 和 java.lang.String 2. 日期类型:与javascript里的Date对应.包括: java.util.Date, java.sql.Date, java.sql.Times or java.sql.Timestamp3. 自定义的Bean<convert converter="bean" match="com.rbi.entity.User"/>4. List,Set类型.返回客户端为数组.若返回的为对象数组,该对象必须在配置文件中有定义Bean5. Map 类型.返回的类型如同对象如: 服务器 返回的Map内容如下:Map map = new HashMap();map.put(“no1”,user1);map.put(“no2”,user2);客户端js对取得的data取内容里的值:var data1 = data[‘no1’]; var data2 = data.no2;6. 返回void类型时回调函数无参数3. 传入参数:1. 基本类与日期型自定义Bean同上.2. List,Set类型Bean的属性还是,远程调用类的方法都要通过<signatures>标签,有其他的参数要有逗号隔开<signatures> <![CDATA[ import java.util.List;import com.rbi.stady.DwrTestServiceImpl;import com.rbi.entity.User;import com.rbi.entity.Address;DwrTestServiceImpl.getUsersNames(List<User>);User.setAddresses(List<Address>); ]]> </signatures>4. Servlet参数传递做web应用的时候,常常要取得用户身份,或者取得一些Servlet上下文变量和应用环境等. 我们通常获取ServletContext,request, response等来取得这些值。DWR提供了两个办法解决这些问题1、使用DWR的一个静态的API,不推荐。2. DWR会自动注入这些servlet变量,这些变量只包括以下的五个:HttpServletRequest HttpServletResponse HttpSession ServletContext ServletConfig5. 与公司框架结合的问题1. Spring 与 struts 集成的方式方法1 1.1. 通过struts 配置文件的 plug-in 初始化spring实例<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"><set-property property="contextConfigLocation" value="/../application-….xml " /></plug-in>1.2. 两种方式配置action(a). action 继承 org.springframework.web.struts.DispatchActionSupport配置文件采用struts的配置方式.通过getWebApplicationContext()方法取得 WebApplicationContext 再通过WebApplicationContext方法getBean(“beanName”);(b)action继承org.springframework.web.struts.ActionSupport配置文件采用spring的配置方式.<bean name=”/actionName.do”class=” package.className”><property name=”propertyName”><ref bean=”springBeanName”/></property></bean>方法2 2.1 通过web.xml初始化spring实例<servlet><servlet-name>context</servlet-name><servlet-class> org.springframework.web.context.ContextLoaderServlet</servlet-class><load-on-startup>1</load-on-startup></servlet>或<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>配置context-param<context-param><param-name>contextConfigLocation</param-name><param-value>/…/application-….xml,</param-value></context-param>2.2 action 继承 org.springframework.web.struts.DispatchActionSupport2. 公司项目采用的方式: 方法1à 1.1+1.2(a)问题 : 通过 plug-in 标签的方式,在其他监听器,过滤器的访问成问题dwr 配置spring Bean无法生成 解决办法:采取 方法 2.1+1.2(a)6. engine.js 1.超时的处理(设置的单位为豪秒): a.全局的设置: DWREngine.setTimeout(1000);默认为0,为0时就是超时不处理b.单个远程调用的设置: remoteClass. Method (参数,{callback:jsfun,timeout:100000})2.错误的处理:a. 全局的设置:DWREngine.setErrorHandler(jsfun);b. remoteClass.method(参数, { callback: jsfun, errorHandler:function(errorString, exception) { ... } });3.批量的处理:一次性提交到服务器DWREngine.beginBatch();remoteClass1.method (参数, jsfun); remoteClass2.method (参数, jsfun);DWREngine.endBatch();4. 异步调用:DWREngine.setOrdered(boolean)默认为false;严格按照发送的顺序返回。DWR在旧的请求安全返回以后才去发送新的请求。把这个设置为true会减慢你的应用程序,如果一个消息丢失,浏览器就会没有响应。5. 请求前处理DWREngine.setPreHook(jsfun)在DWR调用之前设置执行一个函数(但是这个函数无参数)例如让按钮不可用.6. 请求后处理DWREngine.setPostHook(jsfun) 在DWR调用之后要执行的函数.如按钮可用.  

    最新回复(0)