dwr3的一些介绍
DWR入门笔记 DWR : direct web remoting 它允许java server和 JavaScript尽可能简单的相互调用 从DWR2.0开始就需要使用commons-logging包 DWR2.0与DWR3.0差别很大 engine.execute(,,,,callback); 一对{}在JS中就表示一个对象,因此JSON——{username:"huangbiao",id:1}就表示一个对象 javabean:可重用的组件 关于map循环 for(var data in map){ ?alert(data + "?" + map[data]); } ? 初级入门 1、和lib文件夹在同一路径级别下添加dwr.xml和web.xml相关的配置信息 2、在JSP页面中尽量按照如下顺序引入,因为大家都是这么弄的,而且JS是顺序加载的,如果不按照这个顺序可能会引起其他问题(简单测试改换顺序是没有影响的),给编写代码中养成良好的习惯 <script type='text/javascript' src='dwr/interface/service.js'> </script> <script type='text/javascript' src='dwr/engine.js'></script> <script type='text/javascript' src='dwr/util.js'></script> 3、src='dwr/interface/service.js' 中的service就当作是服务器端需要处理的对象——前提是需要在dwr.xml文件中配置 4、dwr.xml配置信息如下 <allow> ?<create creator="new" javascript="service"> ? <param name="class" value="hb.server.Test1"></param> ?</create> </allow> 其中creator表示创建对象的方式是“new”一个新的对象,javascript="service"表示与页面对应的名称是service,因此在页面中需要与src='dwr/interface/service.js'对应,格式是固定的 里面的参数name="class"表示指明这个类的路径 value="hb.server.Test1"表示这个类的全路径 5、web.xml配置信息的描述 <servlet> ?<display-name>DWR Servlet</display-name> ?<servlet-name>dwr-invoker</servlet-name> ?<servlet-class>org.directwebremoting.servlet.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> ?上述描述方式实际上就是一个servlet,当路径为/dwr/*时就执行这个servlet,因为在JSP页面中在加载js页面的时候就会执行这个方法,例如: <script type='text/javascript' src='dwr/util.js'></script>,文件中的src='dwr/util.js'与配置的servlet匹配,这样就会触发这个servlet效果 6、这样就能够准确的定位到具体是那个类的哪个方法处理这个请求,然后是否有返回值都能够一目了然 7、如果想深入的了解DWR的解析方式或者对对象、字符串、数组的解析方式可以查看engin.js的方法实现 ? DWR深入理解 一、JAVA对象与javascript的交互过程 1、服务器端返回一个对象 dwr.xml配置信息如下: <allow> ?<create creator="new" javascript="returnHTMLData"> ? <param name="class" value="hb.server.returnHTMLData"></param> ?</create> ?<convert converter="bean" match="hb.object.Person"></convert> </allow> ? 告诉服务器hb.object.Person这个类作为javabean对象来处理 服务器端的server代码处理 public class returnHTMLData { ?public Person returnPerson(){ ? Person person = new Person(); ? person.setId(1); ? person.setPassword("huangbiao"); ? person.setUsername("1234"); ? return person; ?} } ? JSP页面的js代码 function invoke(){ ?returnHTMLData.returnPerson(function(data){ ? alert(data.id); ? alert(data.password); ? alert(data.username); ?}); } ?2、JS向服务器端发送一个对象 <allow> ?<create creator="new" javascript="getHTMLData"> ? <param name="class" value="hb.server.GetHTMLData"></param> ?</create> ?<convert converter="bean" match="hb.object.Person"></convert> </allow> ? 服务器端的server代码处理 public class GetHTMLData { ?public void printPerson(Person person){ ? System.out.println(person.getId()); ? System.out.println(person.getPassword()); ? System.out.println(person.getUsername()); ?} } ? JSP页面的js代码 ? function invoke(){ //把JSON组织的代码当作是一个对象传递给server ?var dataJson = {id:2,password:"123456",username:"huangbiao"}; ?getHTMLData.printPerson(dataJson); } ? 二、调用服务器端返回的容器——List、Set、Map 1、List和Set是一类处理方式,对应的都是数组 配置信息如下 <allow> ?<create creator="new" javascript="returnHTMLCollection"> ? <param name="class" value="hb.server.returnListData"></param> ?</create> ?<convert converter="bean" match="hb.object.Person"></convert> </allow> 服务器对应的JAVA代码 public class returnListData { ?public Collection getCollection(){ ? Collection<Person> list = new ArrayList<Person>(); ? ? ? ? ? ? ? ? ? ? ? for(int i = 0; i < 3; i++){ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Person person = new Person(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?person.setId(i); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ?person.setPassword("password" + i); ? ? ? ? ? ? ? ? ? ? ? ? ?person.setUsername("username" + i); ? ? ? ? ? ? ? ? ? ? ? ? ?list.add(person); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return list; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } JSP页面的js代码 function invoke(){ ?returnHTMLCollection.getCollection(function(data){ ? for(var i = 0; i < 3; i++){ ? ?alert(data[i].id); ? } ?}); } ? 数据内容 ? data = [ ? ? ? ? ? ? ? ? ? ?? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? username:"user1", ? ? ? ? ? ? ? password:"password2"? ? ? ? ?}, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? username:"user2", ? ? ? ? ? ? ? password:" password2" ? ? ? ?} ? ? ? ? ? ? ? ? ? ? ?? ? ?];? ? 2、使用Map对应的处理方式 配置信息 <allow> ?<create creator="new" javascript="returnMapData"> ? <param name="class" value="hb.server.returnMapData"></param> ?</create> ?<convert converter="bean" match="hb.object.Person"></convert> </allow> 服务器对应的JAVA代码 public class returnMapData { ?public Map getMapdata(){ ? Map map = new HashMap<Integer, Person>(); ? for(int i = 0; i < 3; i++){ ? ?Person person = new Person(); ? ?person.setId(i); ? ?person.setPassword("password" + i); ? ?person.setUsername("username" + i); ?? ? ?map.put(i, person); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? return map; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? JSP页面的js代码 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? function invoke(){ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?returnMapData.getMapdata(function(data){ ? ? ? ? ? ? ? ? ? ? ? for(var i = 0; i < 3; i++){ ? ? ? ? ? ? ? ? ? ? ? ?? ? ?alert(data[i].id); ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?}); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?*/ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?returnMapData.getMapdata(function(data){ ? ? ? ? ? ? ? ? ? ? ? ? for(var property in data){ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?var bean = data[property]; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?alert(bean.username); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ?alert(bean.password); ? ? } ?}); } ? data = { ? ? ? ? ? ? ? ? ? ?? ? ? "key1":{ ? ? ? ? ? ? ? ?? ? ? ? ? username:"user1", ? ? ? ? ? ?password:"password2" ? ? ? }, ? ? ? ? ? ? ? ? ? ? ?? ? ? "key2":{ ? ? ? ? ? ? ? ?? ? ? ? ?username:"user2", ? ?? ? ? ? ?password:" password2"? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? };