一. 
  在一台计算机上配置2个tomcat是可以的,关键是tomcat里的server.xml文件中三个端口必须不同。需要修改conf/server.xml使两个tomcat占用的端口不相同,在缺省配置的情况下,tomcat使用了三个端口: 
shutdown端口: <Server port="8005" shutdown="SHUTDOWN"> 
http端口:<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" /> 
AJP端口:<Connector port="8009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" /> 这样,不仅两个tomcat里的应用不会互相影响,而且两个tomcat程序也可以分别升级。 
但同时运行2个tomcat时,可能出现一个异常: 
java.net.BindException: Address already in use: JVM_Bind 
at java.net.PlainSocketImpl.socketBind(Native Method) 
这是需要在进程中kill掉javaw.exe 



二.Dwr总结 
DWR的配置说明,网上已经是N多了,所以具体的配置这里不再讲了,不过有一点还得说明一下,关于DWR1.1.3升级到DWR2.0时配置中有二个地方得修改: 
1、DWRServlet的包名有所改变,应该将uk.ltd.getahead.dwr.DWRServlet改成org.directwebremoting.servlet.DwrServlet 
2、增加一个初始化参数(不加时报这个异常★java.lang.IllegalArgumentException: DefaultContainer can't find a classes,原因DWR2.0 加入了JDK5的注释(annotations).DwrServlet初始化的时候会去检查注释的类) 

Java代码 

<init-param > 
<param-name>classes </param-name> 
<param-value>java.lang.Object</param-value> 
</init-param> 
<load-on-startup>100</load-on-startup>


另外提醒一下,在开发过程中要将debug设成true会受益不小,接下来的内容中会讲到。 

当所有的配置完成之后,我们在浏览器地址栏上输http://localhost:8080/<context>/dwr/就可以进入调式页面,上面有写到怎样在页面应用中布置,还可以看到你在DWR.xml文件中定义的对象,并允许你运行服务器上对象的方法进行测试。 

页面应用: 
将DWR应用到页面的时候,初学者经常会遇到这样的问题,明明将DWRUtil.js导进来了,使用时浏览器报对象错误,原因是引用的路径错了,举DWRUtil.js的例子,正确的路径是在<context>/dwr/DWRUtil.js,你可以在调试页面中找到正确路径,我在使用的过程中,会在页面<head>标签 

内加入下列内容 

Java代码 

<% 
String path = request.getContextPath(); 
String basePath = request.getScheme() + "://" 
+ request.getServerName() + ":" + request.getServerPort() 
+ path + "/"; 
%> 
<base href="<%=basePath%>">


这样引用的时候就跟书上写的一样从dwr/DWRUtile.js就可以了。使用自已定义的一些方法最后是在页面被加载完成之后,原因也很简单,当调用方法返回数据操作DOM时,有可能Element还没有被加载到页面,这时就会报错。主要就是初始化数据的时候会遇到这类问题,解用方法也很简单,跟onload事件帮定就可以了,如 


Java代码 

function init(){ 
var userId="402881a10eace4c0010eace4cc4a0001"; 
var typeId="402881a10ebc9a16010ebc9a1cc50001"; 
DWRUtil.useLoadingImage("images/progressbar_green.gif"); 
DWRUser.getUserById(userId,doUser); 
} 
if(window.attachEvent()){//页面加载完成后初始化 
window.attachEvent("onload",init); 
}else if(window.addEventLister){ 
window.addEventLister("load",init,false); 
}else{ 
window.οnlοad=init; 
}

如果有多个远程访问的方法被调用时可以采用批量调用,以此来减少对服务器的访问次数节省往返服务器的时间,具体的应用举列

Java代码 

DWREngine.beginBatch();//批量调用减少对服务器的访问次数 
DWRUtil.useLoadingImage("images/progressbar_green.gif"); 
DWRUser.getUserById(userId,doUser); 
DWRArticleType.getTypeByUserId(userId,doArticleTypeList); 
DWRArticleComment.getLastCommentByUserId(userId,doArticleLastComment); 
DWRArticle.getArticleList(userId,typeId,"1",doArticleList); 
DWREngine.endBatch();