DWR 实现AJAX学习

内容引用 http://blog.csdn.net/angel_bear/article/details/1636985

 

Ajax是时下比较流行的一种web界面设计新思路,其核心思想是从浏览器获取XMLHttp对象与服务器端进行交互. DWR(Direct Web Remoting)就是实现了这种Ajax技术的一种web框架.

 

使用方法:

一、配置DWR(http://getahead.org/dwr/getstarted)
1、将dwr.jar包放在web-info/lib目录下
2、编辑web.xml文件,添加servlet

< servlet >
  
< servlet-name > dwr-invoker </ servlet-name >
  
< display-name > DWR Servlet </ display-name >
  
< servlet-class > uk.ltd.getahead.dwr.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 >

3、创建dwr.xml配置文件注册JAVA类和脚本的对应信息。
<!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="JDate">
      <param name="class" value="java.util.Date"/>
    </create>
    <create creator="new" javascript="Demo">
      <param name="class" value="your.java.Bean"/>
    </create>-->
  </allow>
</dwr>
4、通过http://localhost:8080/[your webapp]/dwr可以获取到当前dwr中可以使用的JAVA类。

检测用户名是否已经使用例子:
1、按照前面两部配置一下DWR。
2、编写类:test.CheckUser
package test;

public class CheckUser {
public String check(String name){
 //访问数据库验证信息
 if(name.startsWith("aa")){
  return "用户已经存在";
 }
 else{
  return "可以使用该用户";
 }
}
}
3、创建配置文件并在配置文件中配置CheckUser类。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC
    "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
    "http://getahead.org/dwr/dwr20.dtd">

<dwr>
  <allow>
    <create creator="new" javascript="CheckUser">
      <param name="class" value="test.CheckUser"/>
    </create>
  </allow>
</dwr>
4、重启tomcat服务器,通过http://localhost:8080/[your webapp]/dwr可以看到CheckUser类,点击连接可以查看该类的方法和并测试。
5、编写index.jsp页面,实现效果。
在页面文件中实现效果
1)在javascript中通过使用dwr.util.getValue() 来获取页面中某个页面元素的值。
2)直接调用后台java类的方法,传递方法参数和“异不调用返回后的处理脚本函数"
3)”在处理脚本函数“中我们可以通过dwr.util.setValue(”控件ID",值)来个控件更新数据。
4)为了让javascript脚本中可以调用java类的方法我们需要在dwr.xml文件中申明java类。
注意:在页面中需要包含引入:
<script type='text/javascript' src='/test/dwr/interface/CheckUser.js'></script><!--- dwr.xml中定义的脚本名字-->
<script type='text/javascript' src='/test/dwr/engine.js'></script><!--- DWR-->
<script type='text/javascript' src='/test/dwr/util.js'></script><!---可以通过dwr.util.getValue方法获取元素值--->
否则会出现脚本错误

< html >  
< head >  
< script  type ='text/javascript'  src ='/test/dwr/interface/CheckUser.js' ></ script >
< script  type ='text/javascript'  src ='/test/dwr/engine.js' ></ script >
< script  type ='text/javascript'  src ='/test/dwr/util.js' ></ script >

< script  LANGUAGE =javascript >  
<!-- 
function check() {
  
var name = dwr.util.getValue("username");
  CheckUser.check(name, 
function(data) {
    dwr.util.setValue(
"result", data);
  }
);
}

//--> 
</ script >  
</ head >  
< body >  
< input  type ="text"  id ="username" />
< input  value ="check"  type ="button"  onclick ="check()" />
< br />
 
< span  id ="result" ></ span >
</ body >  
</ html >  
二、dwr.xml 部分属性

creator属性 是必须的 - 它用来指定使用那种创造器。

默认情况下DWR1.1有8种创造器。它们是:

  • new: 用Java的new关键字创造对象。
  • none: 它不创建对象,看下面的原因。 (v1.1+)
  • scripted: 通过BSF使用脚本语言创建对象,例如BeanShell或Groovy。
  • spring: 通过Spring框架访问Bean。
  • jsf: 使用JSF的Bean。 (v1.1+)
  • struts: 使用Struts的FormBean。 (v1.1+)
  • pageflow: 访问Beehive或Weblogic的PageFlow。 (v1.1+)

javascript属性 用于指定浏览器中这个被创造出来的对象的名字。你不能使用Javascript的关键字。

scope属性 非常类似servlet规范中的scope。 它允许你指定这个bean在什么生命范围。选项有"application", "session", "request" 和"page"。这些值对于Servlet和JSP开发者来说应该相当熟悉了。

scope属性是可选的。默认是"page"。如果要使用"session"需要cookies。当前的DWR不支持ULR重写。

param元素 被用来指定创造器的其他参数,每种构造器各有不同。例如,"new"创造器需要知道要创建的对象类型是什么。每一个创造器的参数在各自的文档中能找到。请查看上面的链接。

include和exclude元素 允许创造器来限制类中方法的访问。一个创造器必须指定include列表或exclude列表之一。如果是include列表则暗示默认的访问策略是"拒绝";如果是exclude列表则暗示默认的访问策略是"允许"。

 

三、源码浅析

 

dwr的设计很象webwork2的设计,隐藏http协议,扩展性,兼容性及强。

通过研究uk.ltd.getahead.dwr.DWRServlet这个servlet来研究下dwr到底是如何工作的。

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

这样/dwr/*下的所有的请求都是由这个servlet来处理,到底生理了什么呢,我们还是以例子来说明吧.

1 web服务器启动,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()方法中已经初始化了。 

代码
public void handle(HttpServletRequest req, HttpServletResponse resp)   
        throws IOException   
    {   
        String pathinfo = req.getPathInfo();   
        if(pathinfo == null || pathinfo.length() == 0 || pathinfo.equals("/"))   
        {   
            resp.sendRedirect(req.getContextPath() + req.getServletPath() + '/' + "index.html");   
        } else  
        if(pathinfo != null && pathinfo.equalsIgnoreCase("/index.html"))   
        {   
            doIndex(req, resp);   
        } else  
        if(pathinfo != null && pathinfo.startsWith("/test/"))   
        {   
            doTest(req, resp);   
        } else  
        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);   
        } else  
        {   
            log.warn("Page not found. In debug/test mode try viewing /[WEB-APP]/dwr/");   
            resp.sendError(404);   
        }   
    }  

dwr/*处理的请求也就这几种。

(1)dwr/index.html,dwr/test/这种只能在debug模式下使用,调试用。 
dwr/engine.js,dwr/util.js,dwr/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特定的方法。(我觉得这些转换可以放到缓存里,下次调用没必要再生成一遍,不知道作者为什么没这样做)。 
(3)dwr/exec 
javascript调用方法时发送这种请求,可能是XMLHttpRequest或IFrame发送。 
当然,javascript调用的方法签名与java代码一致,包括参数,还有javascript的回调方法也传到了服务器端,在服务器端很容易实现。回调方法的java的执行结果 返回类似 <script>callMethod(结果)<script>的javascript字符串,在浏览器执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值