转自:http://lxy19791111.javaeye.com/blog/130206
http://swimren.javaeye.com/blog/98186
怎么把附件加上来呢??!!!。。。。。。唉。。。。
最近在学struts2 想用dwr2,在网上搜到这位大侠写的方法,我照着改了,但是不会编译,唉,有找啊找,看到lxy19791111大侠说他编译好了,就去下载没想到要在javaEye注册才行,遂去注册,注册好了之后javaEye又说要3天以后才能下载,晕倒。。。向同事借了他的号来下载才了事。现在把它放到自己的blog里,不用注册大家一样下载。
下面是修改源码的方法:
最近发现dwr出了2.0版本,里面提供了与目前一些主流框架的整合,如Spring,JSF,Hibernate,Struts1,Webwork等,但Struts2.0还没有提供,由于现在的项目我们采用的是Struts2.0,所以参考dwr与webwork的整合代码,修改完成了
dwr与Struts2的整和代码
1、首先下载Dwr2的源代码,将 org/directwebremoting/webwork下的类拷出来,放到 新建的一个包
比如 org.dwr.struts2 里,接下去就可以去修改里面的代码,
将类的引用都修改为从struts2的包中引用。
2、接下去关键是修改 DWRAction.java这个类
在该类中 比较特殊的是
com.opensymphony.webwork.dispatcher.DispatcherUtils 对应的struts2中的 org.apache.struts2.dispatcher.Dispatcher这个类
ServletActionContext.WEBWORK_VALUESTACK_KEY 对应 ServletActionContext.STRUTS_VALUESTACK_KEY
3、修改里面的 private DWRAction(ServletContext servletContext) 构造函数为
- private DWRAction(ServletContext servletContext) throws ServletException
- {
- // Dispatcher.initialize(servletContext);
- m_wwDispatcher = Dispatcher.getInstance();
- if(m_wwDispatcher==null)
- {
- m_wwDispatcher = new Dispatcher(servletContext, new HashMap());
- m_wwDispatcher.init();
- Dispatcher.setInstance(m_wwDispatcher);
- }
- m_actionProcessor = loadActionProcessor(servletContext.getInitParameter (DWRACTIONPROCESSOR_INIT_PARAM));
- }
然后修改protected ActionInvocation invokeAction 方法 将第126行的代码
- ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(actionDefinition.getNamespace(), actionDefinition.getAction(), extraContext, actionDefinition.isExecuteResult(), false);
替换为以下代码
- Configuration config = du.getConfigurationManager().getConfiguration();
- ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(
- mapping.getNamespace(), mapping.getName(), extraContext, actionDefinition.isExecuteResult(), false);
最后将 protected void prepareContinuationAction(HttpServletRequest request, Map extraContext)
里的代码都注释掉 就可以了
4,修改 DWRActionUtil.js文件将里面的webwork字样都替换为 struts2,也可以不用修改,不过觉得不爽就是了
然后就可以按照与webwork整和的方式配置dwr.xml就可以了
最后有一点很重要,就是在 web.xml文件中配置DwrServlet 的时候一定要加上
exposeInternals
true
这个参数,否则生成的 DWRAction.js 这个文件将不存在 DWRAction.execute(actionObj, params, callbackObj) 这个函数,这个问题折磨了我近半天的时间啊.
如果需要可以提供代码上来,不过最好还是建议大家亲自去修改一下比较好.
下面是修改配置文件的方法:
DWR2.0默认支持webwork,在网上找了些资料有兄弟已经走在了我前面了,呵呵。不过我已经将其打包成了dwr4struts2.jar,见附件。
dwr.xml文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd">
- <dwr>
- <allow>
- <create creator="none" javascript="DWRAction">
- <param name="class" value="org.directwebremoting.struts2.DWRAction"/>
- <include method="execute"/>
- </create>
- <convert converter="bean" match="org.directwebremoting.struts2.ActionDefinition">
- <param name="include" value="namespace,action,method,executeResult" />
- </convert>
- <convert converter="bean" match="org.directwebremoting.struts2.AjaxResult"/>
- <!-- 相应的Struts2的Action -->
- <convert match="com.*.*Action" converter="bean"/>
- <!-- 如果有复杂类型要转换,如List中有多个JavaBean对象 -->
- <convert match="com.*.model.*Bean" converter="bean"/>
- </allow>
- </dwr>
testDwr.htm文件:
- <html>
- <head>
- <script type='text/javascript' src='/js/dwr/DWRActionUtil.js'></script>
- <script type='text/javascript' src='/dwr/interface/DWRAction.js'></script>
- <script type='text/javascript' src='/dwr/engine.js'></script>
- <script type='text/javascript' src='/dwr/util.js'></script>
- <script language="javascript">
- function testDwr(){
- DWRActionUtil.execute({namespace:'/',action:'special',executeResult:'false'}, 'frmDwr', writePage);
- }
- function writePage(data){ alert("departure = "+data.departure);
- }
- </script>
- </head>
- <body>
- <form name="frmDwr" method="post" action="" id="frmDwr">
- <input name="departure" value="PEK"/>
- <input type="button" value="测试" onclick="testDwr();">
- </form>
- </body>
- </html>