在按照网上做的单独dwr测试都可以成功,可是与SSH框架整合在一起的时候却无法调用后台的方法,在我徜徉网络整个下午才摸索出了答案。
由于网上关于dwr资料也不少,所以我只说重点吧(我遇到的问题),首先说配置
1、web.xml
<pre name="code" class="html"><servlet>
<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>
<init-param>
<param-name>crossDomainSessionSecurity</param-name>
<param-value>false</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
特别注意crossDomainSessionSecurity这个参数要配置,没有这个参数页面接收不到返回结果(拒绝请求)。
2、dwr.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="spring" javascript="test">
<param name="beanName" value="dwrTest"/>
</create>
</allow>
</dwr>
由于我是用ssh框架,所以creator是“spring”,当然,value=“dwrTest”中的dwrTest也是需要spring注入的,我在测试类上用annotation注解了:@component(“dwrTest”),其他的我就不再赘述。
3.测试
然后当我在jsp页面中引入两个必备JavaScript:engine.js和util.js,在加上新建的test.js,当我访问页面时发现js调用的方法没有反应,也就是说根本没调用,而且我访问
http://localhost:8000/projectName/dwr/ 也没有反应,说找不到路径,经过我漫长的搜寻之路找到答案,原来是web.xml中struts2拦截器配置 /* 后,当输入XXX/dwr时会被struts2捕获,被当做某个action 所以就找不到路径,
解决办法:(1)在Struts2中配置常量<constant name="struts.action.excludePattern" value="/dwr.*"></constant>
此时再次访问 http://localhost:8000/projectName/dwr/成功了会看到这样的页面:
点击test进去,会看到:
稍微阅读一下,你会明白:要用test,你要引用这三个js,他使用的是绝对路径,是不是(2)和你引用的路径不同?赶紧复制粘贴吧。
把js路径改好再运行就OK了,困扰了我好久。。。如果帮到了您,就给我个赞吧,不枉我花费了一个下午。