DWR 学习笔记

DWR 学习笔记
                               
                                  内容目录
1. 简介
2. 环境搭建与配置
3. DWR 配置文件
4. Servlet 参数传递
5. 与公司框架结合的问题
6. 配置选项
7. DWRUtil
 
 
 
 
 
 
 
 
 
1.    简介
DWR 是 Direct Web Remoting 的简称.可以通过脚本直接调用java方法.
和其他代理框架相比 ,DWR后台严格限制必须以java为后台.
有相当完善的文档支持
2.    环境搭建与配置
1.    从 http://getahead.ltd.uk/dwr/ 下载dwr.jar
2.    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 : 部属到实际应用时记得要设置为false
3.    编写后台的 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,pageflow
                scope (可选项 )值范围 : "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.Timestamp
           3. 自定义的 Bean
               <convert converter="bean" match="com.rbi.entity.User"/>
           4. List,Set类型 .
              返回客户端为数组 .若返回的为对象数组,该对象必须在配置文件中有定义Bean
           5. 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
ServletConfig
5.    与公司框架结合的问题
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.DispatchActionSupport
 
2.   公司项目采用的方式: 方法 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调用之后要执行的函数.如按钮可用.
7.    DWRUtil
 
8.    备注
1. DWR和HttpSessionBindingListeners
DWR1.x中存贮已经创造的Bean的方法需要注意,它在每次请求时都会调用相同的 setAttribute()方法。就是说,如果一个Bean在dwr.xml中的声明周期设置为session,再每次调用bean中的方法时,DWR都会执行一次 session.setAttribute(yourBean)。这看上去没有什么危害,但是如果你要使用servlet的事件机制的,就是说用了HttpSessionBindingListener接口,你就会发现valueBound和valueUnbound事件在每次调用时都会发生,而不是你想像的在bean被创建时以及session过期时。
DWR2 只在第一次创建对象时调用 setAttribute()。
 
 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值