通过DWR来调用WebWork的Action
WebWork支持在DWR2.0m3以后才有。
要可以通过DWR调用WW的Action,要做两件事。
步骤1: 配置dwr.xml
你必须在dwr的配置文件中加入这样的配置:
<create creator="none" javascript="DWRAction">
<param name="class" value="org.directwebremoting.webwork.DWRAction"/>
<include method="execute"/>
</create>
<convert converter="bean" match="org.directwebremoting.webwork.ActionDefinition">
<param name="include" value="namespace,action,method,executeResult" />
</convert>
<convert converter="bean" match="org.directwebremoting.webwork.AjaxResult"/>
这样你AjaxWebWork Action调用返回一个action实例(而不是文字)。然后你必须包括action对象的转换器定义(package级别或单独action)。
<convert converter="bean" match="<your_action_package>.*"/>
步骤2: 在JSP中导入脚本
下面这些代码开启DWR调用Action的功能。你还要导入DWRActionUtil.js脚本(在你的web脚本路径中)
使用
像这样在JS中调用Action:
DWRActionUtil.execute(id, params, callback [, displayMessage]);
id 参数可以是下面这些:
- actionUri: 要调用action的URI(没有 .action). 例如:
DWRActionUtil.execute('/ajax/TestFM', 'myform', 'doOnTextResult');
- actionDefinitionObject: 在xwork.xml中定义的action对象. 必须指定下面的内容:
- namespace: xwork.xml中action的名称空间
- action: xwork.xml中action的名字
- executeResult: true|false (是否执行action的结果, 如果false直接返回action实例)
例如:
DWRActionUtil.execute({
namespace:'/ajax',
action:'TestJS',
executeResult:'true'
}, 'data', doOnJSResult, "stream...");
params 必须是这些:
- emptyParams: 传递{}忽略任何参数。
例子:
DWRActionUtil.execute('/ajax/TestFM', {}, doOnJSResult, "stream...");
- fieldId: 被转换为action调用参数的字段的id。
例子:
<input id="mytext" name="mytext" value="some value" type="text"/>
DWRActionUtil.execute('/ajax/TestFM', 'mytext', doOnJSResult, "stream...");
- formId: 表单的id. 所有的input值被转换为action调用参数。
Note : 如果你的action使用了parameter拦截器,那么你的action会得到正确的参数值,请参考WebWork的文档。
callback 可以是:
- callbackFunction: 在DWR中,这个函数在请求完毕后调用。
- callbackObject: 在DWR中,callback对象。
最后 displayMessage 是可选参数,当请求完毕后显示的消息(参考DWR文档)
高级
你可以声明一个pre/post Action处理器,在web.xml中的一个context-wide初始化参数(dwrActionProcessor)。处理器必须实现org.directwebremoting.webwork.IDWRActionProcessor 接口。这个处理器将会在action之前和之后被调用,所以你可以做一些预处理或改变结果。
2007-4-27 17:15:59 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet dwr-invoker threw exception
java.lang.NoClassDefFoundError: com/opensymphony/xwork/config/ConfigurationException
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2395)
at java.lang.Class.privateGetPublicMethods(Class.java:2519)
at java.lang.Class.getMethods(Class.java:1406)
at org.directwebremoting.impl.DefaultDebugPageGenerator.generateTestPage(DefaultDebugPageGenerator.java:111)
at org.directwebremoting.servlet.TestHandler.handle(TestHandler.java:44)
at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:101)
at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:146)
at org.directwebremoting.servlet.DwrServlet.doGet(DwrServlet.java:132)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:414)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
at java.lang.Thread.run(Thread.java:595)
我按照本网站的例子做的配置,但在打开测试页,进入(DWRTest)我的creator时,报以上错误。请问是什么原因呢?