这几天听同事说DWR很好,比ajax好用多了,也很简单方便,就试试。我的开发环境是MyEclipse4.1+JDK1.4.2+TOMCAT5.0.2x。仿照DWR官方网站上的例子做了几个,感觉很好。不过我试着通过客户端传个参数到服务器就出现问题了(以前的都没有带参数),老报错Invalid reply from server。
web.xml
< 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 >
</ servlet >
< servlet-mapping >
< servlet-name > dwr-invoker </ servlet-name >
< url-pattern > /dwr/* </ url-pattern >
</ servlet-mapping >
dwr.xml
<! 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 ="com.huaying.caochen.TestDate" />
</ create >
</ allow >
</ dwr >
java类
public class TestDate {
public String getHello(String str)
{
return str;
}
}
index.jsp
< head >
< title > DWR - Test Home </ title >
< script type ='text/javascript' src ='dwr/interface/JDate.js' ></ script >
< script type ='text/javascript' src ='dwr/engine.js' ></ script >
< script type ='text/javascript' src ='dwr/util.js' ></ script >
< script type ='text/javascript' language ="javascript" >
function checkStr(){
JDate.getHello(loadStr,DWRUtil.getValue("str"));
}
function loadStr(data)
{
DWRUtil.setValue("reply",data);
}
</ script >
</ head >
< body >
< form action ="index.jsp" method ="post" >
str: < input type ="text" name ="str" />< br >
< input type ="button" onclick ="checkStr()" value ="submit" />
</ form >
< span id ="reply" ></ span >< br >
</ body >
</ html >
每次都报Invalid reply from server这个错误,不带参数的是好的,但是看官网上的例子是可以带参数的,估计就是开发环境的问题了。
我先把TOMCAT5.5装上,运行之后在控制台有错误消息提示,而这在以前那个版本是没有的,把这个错误消息baidu一下,根据http://www.pocketshark.com/blog/page/tempo?entry=javatwo_2006_ajax_client_server最后那个高人的指点有必要升级jdk的版本。
jdk1.5安装并且配置好之后重新启动tomcat,没有问题,不过执行http://localhost:8080/myapp/dwr/总是报下面的错误:
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java: 118 )
org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java: 160 )
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java: 799 )
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java: 705 )
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java: 577 )
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java: 683 )
java.lang.Thread.run(Thread.java: 595 )
再baidu一下,找到http://jivesoftware.com/jive/thread.jspa?threadID=15861&tstart=15,说是Tomcat和JDK1.5中的 xml-parser 冲突,于是就把TOMCAT/common/endorsed/xml-apis.jar删掉,重启tomcat。
在DWR启动的时候还有错误:
at org.directwebremoting.impl.DefaultContainer.getBean(DefaultContainer.java: 216 )
at org.directwebremoting.annotations.AnnotationsConfigurator.configure(AnnotationsConfigurator.java: 50 )
at org.directwebremoting.servlet.DwrServlet.init(DwrServlet.java: 121 )
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java: 1105 )
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java: 757 )
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java: 130 )
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java: 178 )
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java: 126 )
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java: 105 )
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java: 107 )
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java: 148 )
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java: 869 )
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java: 664 )
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java: 527 )
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java: 80 )
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java: 684 )
at java.lang.Thread.run(Thread.java: 595 )
再baidu查到http://www.javafan.cn/archives/2006/09/125.html,原因是因为启动时会检查JDK5的annotations,还没用到annotations注释,解决办法,就是初始化时加上java.lang.Object,如下:
< servlet - name > dwr - invoker </ servlet - name >
< display - name > DWR Servlet </ display - name >
< servlet - class > org.directwebremoting.servlet.DwrServlet </ servlet - class >
< init - param >
< param - name > debug </ param - name >
< param - value > false </ param - value >
</ init - param >
< init - param >
< param - name > classes </ param - name >
< param - value > java.lang.Object </ 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>
好了,大功告成,主要原因是我的开发工具版本过低,不过总结一下自己的教训,给初学者一个参考吧!