DWR

来源:互联网 发布:网络关系营销 编辑:程序博客网 时间:2024/04/30 17:47

1 Easy AJAX for JAVA

它可以让浏览器上的javascript方法调用运行在web服务器上java方法

 

DWR主要由两部门组成。javascript与web服务器通信并更新web页;

运行在web服务器的Servlet处理请求并把响应发回浏览器。

(本质上还是发送请求 返回数据 只是这些部分都被dwr隐藏)

 

2 配置servlet

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

 

处理 /app/dwr/* 这种请求。

<script type='text/javascript' src='dwr/engine.js'></script>

在页面中 使用dwr 会自动发送到 dwr/* 请求。

 

3 web服务器启动,

DWRServlet init()方法调用,init主要做了以下工作。   

设置日志级别、实例化DWR用到的单例类(这些类在jvm中只有一个实例对象)、读去配置文件(包括dwr.jar包中的dwr.xml,WEB-INF/dwr.xml. config*.xml)。   

 

4 请求处理 


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

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

dwr/interface/这种请求到来,(例如<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函数。   

 

5 实例

test.html

<script src="/dwr3/dwr/engine.js"></script>
<script src="/dwr3/dwr/util.js"></script>
<script src="/dwr3/dwr/interface/DWRUserAccess.js"></script>
</HEAD>
<BODY>
<B>用户注册</B><br>
------------------------------------------------
<Br>
<form name="regForm">
登陆ID:<input type="text" name="id"><br>
口    令:<input type="password" name="password"><br>
姓    名:<input type="text" name="name"><br>
电子邮件:<input type="text" name="email"><br>
<input type="button" name="submitBtn" value="提交" onclick="OnSave()"><br>
      </form>

<br>
<br><B>用户查询</B><br>
------------------------------------------------
<Br>
<form name="queryForm">
登陆ID:<input type="text" name="id"><br>
<input type="button" name="submitBtn" value="提交" onclick="OnFind()"><br>
</form>
<br>
</BODY>
</HTML>
<SCRIPT LANGUAGE="JavaScript">
<!--
function saveFun(data) {
if (data) {
    alert("注册成功!");
} else {
    alert("登陆ID已经存在!");
}
}

function OnSave() {
var userMap = {};
userMap.id = regForm.id.value;
userMap.password = regForm.password.value;
userMap.name = regForm.name.value;
userMap.email = regForm.email.value;
DWRUserAccess.save(userMap, saveFun);
}

function findFun(data) {
if (data == null) {
    alert("无法找到用户:"+queryForm.id.value);
    return;
}

alert("找到用户,nid:"+data.id+",npassword:"+data.password+",nname:"+data.name+",nemail:"+data.email);

}

function OnFind() {
DWRUserAccess.find(queryForm.id.value, findFun);
}
//-->
</SCRIPT>

 

dwr.xml

<dwr>
    <allow>
  <create creator="new" javascript="DWRUserAccess">
         <param name="class" value="test.DWRUserAccess"/>
       </create>
  <convert converter="bean" match="test.User"/>
    </allow>
</dwr>

 

public class DWRUserAccess {

    UserDAO userDAO = new UserDAO();

    public boolean save(User user) {
      return userDAO.save(user);
    }

    public User find(String id) {
      return userDAO.find(id);
    }
}

 

public class UserDAO {
    private static Map dataMap = new HashMap();

    public boolean save(User user) {
      if (dataMap.containsKey(user.getId())){
       return false;
      }
     
      System.out.println("下面开始保存用户");
      System.out.println("id:"+user.getId());
      System.out.println("password:"+user.getPassword());
      System.out.println("name:"+user.getName());
      System.out.println("email:"+user.getEmail());
      dataMap.put(user.getId(), user);
      System.out.println("用户保存结束");
      return true;
    }

    public User find(String id) {
     return (User)dataMap.get(id);
    }
}

 

6 扩展

    //返回bean 不知道属性名称时,使用如下方法

  for(var property in data){

  alert("property:"+property);

  alert(property+":"+data[property]);

  }

 

    返回 list

   for(var i=0;i<data.length;i++){}

  

   返回map

   for(var property in data){

  var bean = data[property];

  alert(bean.username);

  alert(bean.password);

  }

   调用有List、Set或者Map参数的java方法

   在定义dwr之后
   <signatures>

  <![CDATA[

  import java.util.List;

  import com.dwr.TestClass;

  import com.dwr.TestBean;

  TestClass.testMethod7(List<TestBean>);

  ]]>

  </signatures>
    <signatures>标签是用来声明java方法中List、Set或者Map参数所包含的确切类,以便java代码作出判断。

list
data = [{username:"user1",   password:"password2"},{username:"user2",password:" password2"}];

testClass.testMethod7(data);

map
data =

{"key1":{username:"user1", password:"password2"},
  "key2":{username:"user2", password:" password2"}
};
 

 与spring 结合

<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>

<creato creator="spring" .../>

 

 

 

原创粉丝点击