DWR的学习文档Hello World类型转换SpringAnnotation.docx
- 文档编号:6238330
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:23
- 大小:22.81KB
DWR的学习文档Hello World类型转换SpringAnnotation.docx
《DWR的学习文档Hello World类型转换SpringAnnotation.docx》由会员分享,可在线阅读,更多相关《DWR的学习文档Hello World类型转换SpringAnnotation.docx(23页珍藏版)》请在冰豆网上搜索。
DWR的学习文档HelloWorld类型转换SpringAnnotation
DWR的学习文档(HelloWorld,类型转换,Spring,Annotation)
DWR的学习文档(HelloWorld,类型转换,Spring,Annotation)
Email:
javafish@sunxin.org
DWR是作为远程调用的ajax框架,将服务端的java类,方法和浏览器的javascript的类,方法对应起来。
现在官方最新的版本是DWR2.0,可以在http:
//getahead.ltd.uk/dwr/download下载到。
我们真对DWR2.0做一些例子讲解一下它的特性:
HelloWorld:
新建一个web项目DWRStudy,在项目中构建路径中加入dwr.jar,
新建类Hello如下:
代码packageorg.li.dwr;
packageorg.li.dwr;
importjava.util.Date;
publicclassHello
{
publicStringgetHelloWorld()
{
return"现在的时间为:
"+newDate();
}
}在WEB-INF目录下新建dwr.xml文件:
代码<?
xmlversion="1.0"encoding="UTF-8"?
>
<!
DOCTYPEdwrPUBLIC"-//GetAheadLimited//DTDDirectWebRemoting2.0//EN""http:
//www.getahead.ltd.uk/dwr/dwr20.dtd">
<dwr>
<allow>
<!
--javascript的对象是jshello,create="new"是DWR自己创建类-->
<createjavascript="jshello"creator="new"scope="application">
<paramname="class"value="org.li.dwr.Hello"></param>
</create>
</allow>
</dwr>在WebRoot目录里新建hello.js
代码functionload()//载入的时候调用
{
varjbutton=document.getElementById("jbutton");
jbutton.onclick=function(event)//注册按钮点击事件
{
jbClick();
};
}
functionjbClick()//按钮点击事件
{
jshello.getHelloWorld(callback);//没有参数传递,只传递回调函数就行
}
functioncallback(msg)//回调函数
{
DWRUtil.setValue(‘jdiv‘,msg);
}在WebRoot目录里新建HelloWorld.html
代码<!
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<html>
<head>
<title>HelloWorld.html</title>
<metahttp-equiv="content-type"content="text/html;charset=UTF-8">
<scripttype=‘text/javascript‘src=‘dwr/interface/jshello.js‘></script>
<scripttype=‘text/javascript‘src=‘dwr/engine.js‘></script>
<scripttype=‘text/javascript‘src=‘dwr/util.js‘></script>
<scripttype="text/javascript"src="hello.js"></script>
</head>
<body>
<inputid="jbutton"type="button"value="得到HelloWorld"/>
<divid="jdiv"></div>
<script>load()</script>
</body>
</html>在web.xml中加入一个dwr的servlet:
代码<servlet>
<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>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>在运行一下服务器在浏览器里输入http:
//localhost:
8080/DWRStudy/HelloWorld.html,然后点一下按钮下面就会显示服务端的系统时间了,而浏览器页面并没有被刷新。
下面解释一下:
1.新建的Hello类中有一个getHelloWorld方法这个方法就是作为远程调用的服务端方法,这个Hello类也就是远程调用的类。
方法的返回值为服务端当前的时间
2.dwr.xml是DWR用来配置服务端类和浏览器端javascript类之间的映射。
可以下载dtd看一下,在<allow></allow>里类配置映射类如:
<createjavascript="jshello"creator="new"scope="application">
<paramname="class"value="org.li.dwr.Hello"></param>
</create>
javascript="jshello"是在浏览器端的javascript的映射的类名,(不要用javascript里的关键字)creator="new"是表示这个类是dwr自己创建的,如果creator="new"那么就必须有下面的<paramname=”class”value=”类的全路径”></param>,creator还可为spring(与spring集成的时候),script(与apache的一个框架BSF集成的时候用),后来又加入了struts,jsf,ejb3.现在是个HelloWorld让大家体验一下,具体后面会细讲。
最后的scope=”application”是说这个pojo类的范围,和jsp是一样的。
3.创建hello.js和HelloWorld.html都是看自己是怎么发挥了,注意的是在HelloWorld.html中导入js文件的时候注意顺序和路径命名规律,自己发挥的这个hello.js一定放在后面,因为要调用其它js文件中的函数。
由于在HelloWorld.html里写入了<script>load()</script>所以在html加载的时候会调用hello.js里的load方法(注意这几个js文件里的函数最好不要重名)在load里面做的事情就是注册一下id为jbutton的按钮的点击事件。
当我们点击id为jbutton的按钮的时候就开始用与服务器端的类相对应的javascript类了(jshello),直接调用jshello类的getHelloWorld方法,可以向函数传递参数,不过要在最后加一个回调函数。
而我们的服务端的类没有参数就直接传回调函数了。
在回调函数的形参msg是服务端Hello类中getHelloWorld方法返回值。
在回调函数里面调用了DWR的工具类DWRUtil类的setValue方法设置id为jdiv的值。
另外我们把doucment.getElementById(“jbutton”);换与$(“jbutton”)也可以得到同样的效果,这就有点像prototype了。
4.在web.xml里加入DWRServlet的配置一是为了远程调用,二是自动生成了<scripttype=‘text/javascript‘src=‘dwr/interface/jshello.js‘></script>
<scripttype=‘text/javascript‘src=‘dwr/engine.js‘></script>
<scripttype=‘text/javascript‘src=‘dwr/util.js‘></script>文件。
上个HelloWorld例子只是返回了一个字符串,当然我们显示字符串很容易,可是如果返回一个对象怎么办呢?
,DWR为我们将java类和javascript的DOM对象,不过这得需要我们在dwr.xml里配置。
再看一个综合的例子:
新建类User
代码packageorg.li.dwr;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.IOException;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.Properties;
publicclassUser
{
privateStringwelcome;
privateStringusername;
privateStringaddress;
privateList<Book>books;
privateintage;
publicStringgetAddress()
{
returnaddress;
}
publicvoidsetAddress(Stringaddress)
{
this.address=address;
}
publicintgetAge()
{
returnage;
}
publicvoidsetAge(intage)
{
this.age=age;
}
publicStringgetUsername()
{
returnusername;
}
publicvoidsetUsername(Stringusername)
{
this.username=username;
}
publicStringgetWelcome()
{
returnwelcome;
}
publicvoidsetWelcome(Stringwelcome)
{
this.welcome=welcome;
}
publicList<Book>getBooks()
{
returnbooks;
}
publicvoidsetBooks(List<Book>books)
{
this.books=books;
}
publicList<Book>getBook()
{
this.books=newArrayList<Book>();
BookjavaBook=newBook();
BookvcBook=newBook();
javaBook.setAuthor("孙鑫");
vcBook.setAuthor("孙鑫");
javaBook.setName("javaWeb开发详解");
vcBook.setName("vc++深入详解");
this.books.add(javaBook);
this.books.add(vcBook);
returnthis.books;
}
publicUsergetUser(Stringwelcome)
{
this.welcome=welcome;
try
{
FileInputStreamfis=newFileInputStream("D:
\\workspace\\DWRStudy\\src\\user.properties");
Propertiespp=newProperties();
pp.load(fis);
this.username=pp.getProperty("username");
this.age=Integer.valueOf(pp.getProperty("age"));
this.address=pp.getProperty("address");
fis.close();
}
catch(FileNotFoundExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
catch(IOExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnthis;
}
}新建Book类:
代码packageorg.li.dwr;
publicclassBook
{
privateStringname;
privateStringauthor;
publicStringgetAuthor()
{
returnauthor;
}
publicvoidsetAuthor(Stringauthor)
{
this.author=author;
}
publicStringgetName()
{
returnname;
}
publicvoidsetName(Stringname)
{
this.name=name;
}
}新建DWRLog类
代码packageorg.li.dwr.log;
importjava.lang.reflect.Method;
importorg.directwebremoting.AjaxFilterChain;
publicclassDWRLogimplementsorg.directwebremoting.AjaxFilter
{
publicObjectdoFilter(Objectobj,Methodmethod,Object[]params,AjaxFilterChainchain)throwsException
{
System.out.println("过滤器Log输出:
..对象:
"+obj.getClass().getName()+"方法:
"+method.getName());
returnchain.doFilter(obj,method,params);
}
}新建D:
\\workspace\\DWRStudy\\src\\user.properties
username=javafish
age=21
address=北京市海淀区
然后在dwr.xml里加入
代码<createjavascript="jsuser"creator="new">
<paramname="class"value="org.li.dwr.User"></param>
<!
--过滤允许调用的方法-->
<includemethod="getUser"/>
<includemethod="getBook"/>
<!
--配置自己的过滤器-->
<filterclass="org.li.dwr.log.DWRLog"></filter>
</create>
<!
--需要转换的类-->
<convertmatch="org.li.dwr.User"converter="bean"></convert>
<convertmatch="org.li.dwr.Book"converter="bean"></convert>新建UserInfo.html
代码<!
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<html>
<head>
<title>UserInfo.html</title>
<metahttp-equiv="content-type"content="text/html;charset=UTF-8">
<scripttype=‘text/javascript‘src=‘dwr/interface/jsuser.js‘></script>
<scripttype=‘text/javascript‘src=‘dwr/engine.js‘></script>
<scripttype=‘text/javascript‘src=‘dwr/util.js‘></script>
<scripttype="text/javascript"src="userInfo.js"></script>
</head>
<body>
请输入你的名字:
<inputid="name"type="text"/>
<inputid="jbutton"type="button"value="得到javafish的信息"/>
<inputid="sbutton"type="button"value="得到javafish的书"/>
<divid="result"></div>
<script>load()</script>
</body>
</html>新建userInfo.js
代码functionload()
{
varjbutton=$("jbutton");
jbutton.onclick=function(event)
{
bOnClick();
};
varsbutton=$("sbutton");
sbutton.onclick=function(event)
{
sOnClick();
};
}
functionbOnClick()
{
jsuser.getUser($("name").value,callback);
}
functioncallback(msg)
{
varuser=msg;
DWRUtil.setValue(‘result‘,"欢迎你!
"+user.welcome+"姓名:
"+user.username+",年龄:
"+user.age+",住址:
"+user.address+user.books[0].author);
}
functionsOnClick()
{
jsuser.getBook(callbackBooks);
}
functioncallbackBooks(msg)
{
alert(msg);
DWRUtil.setValue(‘result‘,msg);
}运行服务器输入http:
//localhost:
8080/DWRStudy/UserInfo.html,可看到运行结果
这个例子需要解释的就是dwr.xml了
在这里用到了两个java类,User、Book,方法呢就是User.getUser和User.getBook,而Book类呢由于我们没有在javascript中调用,所以就不用配置Book的create了。
大家可能会奇怪为什么会多出来两个<convertmatch="org.li.dwr.User"converter="bean"></convert>
<convertmatch="org.li.dwr.Book"converter="bean"></convert>
呢,是因为在调用getBook和getUser的时候会返回给javascript有关User和Book的对象或数据,这里的用<convertmatch=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DWR的学习文档Hello World类型转换SpringAnnotation DWR 学习 文档 Hello World 类型 转换 SpringAnnotation
![提示](https://static.bdocx.com/images/bang_tan.gif)