WebWork 支持在 DWR2.0m3 以后才有。

要可以通过 DWR 调用 WW 的 Action,要做两件事。

配置 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.*"/>​

在 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 参数

displayMessage 是可选参数,当请求完毕后显示的消息(参考 DWR 文档)

高级

你可以声明一个 pre/post Action 处理器,在 web.xml 中的一个 context-wide 初始化参数(dwrActionProcessor)。处理器必须实现 org.directwebremoting.webwork.IDWRActionProcessor 接口。这个处理器将会在 action 之前和之后被调用,所以你可以做一些预处理或改变结果