`
swimren
  • 浏览: 21332 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

Struts2.0与 DWR2.0 的整和

    博客分类:
  • AJAX
阅读更多

最近发现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) 构造函数为

java 代码
  1. private DWRAction(ServletContext servletContext) throws ServletException   
  2.     {   
  3.        // Dispatcher.initialize(servletContext);   
  4.         m_wwDispatcher = Dispatcher.getInstance();   
  5.         if(m_wwDispatcher==null)   
  6.         {   
  7.            m_wwDispatcher = new Dispatcher(servletContext, new HashMap());   
  8.            m_wwDispatcher.init();   
  9.            Dispatcher.setInstance(m_wwDispatcher);   
  10.         }   
  11.            
  12.         m_actionProcessor = loadActionProcessor(servletContext.getInitParameter         (DWRACTIONPROCESSOR_INIT_PARAM));   
  13.     }   

然后修改protected ActionInvocation invokeAction 方法 将第126行的代码

java 代码
  1. ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(actionDefinition.getNamespace(), actionDefinition.getAction(), extraContext, actionDefinition.isExecuteResult(), false);   

替换为以下代码

java 代码

 

  1. Configuration config = du.getConfigurationManager().getConfiguration();   
  2.             ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(   
  3.                     mapping.getNamespace(), mapping.getName(), extraContext, actionDefinition.isExecuteResult(), false);   

最后将 protected void prepareContinuationAction(HttpServletRequest request, Map extraContext)
 里的代码都注释掉 就可以了

4,修改 DWRActionUtil.js文件将里面的webwork字样都替换为 struts2,也可以不用修改,不过觉得不爽就是了
  然后就可以按照与webwork整和的方式配置dwr.xml就可以了

 

<init-param></init-param>最后有一点很重要,就是在 web.xml文件中配置DwrServlet 的时候一定要加上 
     <param-name></param-name> exposeInternals
     <param-value></param-value> true
      

这个参数,否则生成的 DWRAction.js 这个文件将不存在 DWRAction.execute(actionObj, params, callbackObj) 这个函数,这个问题折磨了我近半天的时间啊.

如果需要可以提供代码上来,不过最好还是建议大家亲自去修改一下比较好.


分享到:
评论
13 楼 turnerguo 2008-06-18  
totodo 写道
其实 ,Servlet那层,可以扔掉了。

不要在再Web层还用  XX+XX。


一语道破!都不用往下看了~~
12 楼 77tt77 2007-12-30  
楼上,不要太武断了吧!
11 楼 zxg_javaeye 2007-12-21  
为了框架而框架,脱了裤子放屁!
10 楼 bailongvip 2007-12-17  
totodo 写道
其实 ,Servlet那层,可以扔掉了。

不要在再Web层还用  XX+XX。

支持支持,直接用业务逻辑OK了,不要在弄servlet
9 楼 andrewdu 2007-12-04  
我还是不赞成hack源码。

现在,我们都是用maven来管理jar包,hack源码的风险太大。
8 楼 kkbear 2007-09-21  
http://kkbear.iteye.com/admin/show/125130
7 楼 fangzhouxing 2007-08-25  
客户端如果需要直接使用JSON格式的数据,DWR还能用吗?我现在改用控制器输出JSON数据。
6 楼 seff007 2007-08-17  
按照你的方式还是不行啊,DWRAction类还是有错,可以提供代码么?
5 楼 movingboy 2007-07-07  
to swimren:

谢谢你的热心指点,你提到的这种方式确实能与Struts 2更自然地结合,值得深入学习!
4 楼 swimren 2007-07-07  
to movingboy :

我没有具体的去研究 AppFuse 2.0-M5的源码,不过从你的描述中可以看出来,你的这种配置方式也是可以正常工作的。
    首先你是 把InquiryMasterAction 看作一个独立的类来处理的,也就是说针对 InquiryMasterAction 单独生成了一个inquiryMasterAction.js文件,而方法getDetailsByMasterId 返回的是你实际需要的数据。然后再通过
inquiryMasterAction.getDetailsByMasterId(1, result);   去调用的,这种方式是DWR最初的最简单方式。你的例子里实际上是没有用到 DWRAction.js这个文件和DWRAction.java这个类了。
     但是在Struts2中,Action 中的方法是需要具体的返回一个String类型的 result,也就是定位到具体的页面或路径上。而需要的数据都被放到 ValueStack中了。所以数据的取法就不一样了。
上面说的dwr2与strut2的整和,主要是为了不需要调整原来的Action的写法。所有的Action 的调用都可以通过
DWRActionUtil.execute({
  namespace:'/yournamespace',
  action:'yourAction',
  method:'yourMethod',
  executeResult:'true'
}, 'data', callBack);  

这种方式去调用就可以了,这个方法最终会去调用 DWRAction.js里的execute()方法。这种方式是保留了Action的原汁原味,按照Struts2的机制去处理的。
具体的你可以参考一下 dwr2的文档中 与webwork整和的部分或着参考下面的
http://wiki.javascud.org/display/dwrcn/WebWork+Integration?focusedCommentId=917506
也可以
3 楼 movingboy 2007-07-07  
请教楼主:

1.我现在在试用AppFuse 2.0-M5,我尝试了它自带的DWR 2.0.1和Struts 2.0.6,在客户端能够正确地调用Struts action的方法并返回数据。我看了DWRAction.java的代码,确实是象你提到的改动前的样子,但我没做任何改动。我想问一下你改动这个类的目的是什么呢?不改动会有什么问题呢?

2.你在文中提到:

引用
最后有一点很重要,就是在 web.xml文件中配置DwrServlet 的时候一定要加上
     exposeInternals
     true


我的web.xml没有设置这一项。如果没有生成DWRAction.execute(actionObj, params, callbackObj) ,会有什么问题呢?

附上我的例子作为分析参考:
dwr.xml的配置:
<!DOCTYPE dwr PUBLIC
    "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
    "http://getahead.ltd.uk/dwr/dwr20.dtd">
<dwr>
    <allow>
        <create creator="spring" javascript="inquiryMasterAction">
            <param name="class" value="cn.net.cogent.summer.webapp.action.InquiryMasterAction"/>
            <param name="beanName" value="inquiryMasterAction"/>
            <include method="getDetailsByMasterId"/>
        </create>
        <convert converter="bean" match="cn.net.cogent.summer.model.InquiryDetail"/>
    </allow>
</dwr>


其中InquiryMasterAction的getDetailsByMasterId方法的Java代码为:
public List<InquiryDetail> getDetailsByMasterId(Long masterId);


生成的inquiryMasterAction.js的内容:
// Provide a default path to dwr.engine
if (dwr == null) var dwr = {};
if (dwr.engine == null) dwr.engine = {};
if (DWREngine == null) var DWREngine = dwr.engine;

if (inquiryMasterAction == null) var inquiryMasterAction = {};
inquiryMasterAction._path = '/dwr';
inquiryMasterAction.getDetailsByMasterId = function(p0, callback) {
  dwr.engine._execute(inquiryMasterAction._path, 'inquiryMasterAction', 'getDetailsByMasterId', p0, callback);
}


在JSP页面中只需要调用:
<script type='text/javascript'>
  var masterId = 1;
  var result;
  inquiryMasterAction.getDetailsByMasterId(1, result);
</script>
2 楼 swimren 2007-07-06  
对,采用dwr,可以直接去访问业务层,不用采用Struts 之类的,但有些时候还需要控制层,在个别的地方的使用dwr去调用,两种结合着就比较好了.
1 楼 totodo 2007-07-05  
其实 ,Servlet那层,可以扔掉了。

不要在再Web层还用  XX+XX。

相关推荐

    struts2.0与dwr开发实例

    Struts2.0和DWR(Direct Web Remoting)是两...通过这些源码,你可以了解到如何在实际项目中整合Struts2.0和DWR,实现高效的AJAX表单验证。这种技术在现代Web应用中非常常见,能够提供流畅的用户体验,提高用户满意度。

    Struts2.0+dwr的分页

    Struts2.0和DWR(Direct Web Remoting)是两个在Web开发中广泛使用的开源框架,它们分别在MVC(Model-View-...通过研究这些文件,你可以深入理解如何在实际项目中整合Struts2.0和DWR来实现高效、友好的分页功能。

    Struts2.0与DWR2.0 的整合(带完整示例)

    DWR2.0 for Struts2.0的包 博文链接:https://lxy19791111.iteye.com/blog/130206

    Spring2.5+Struts2.0+DWR完成拥护登陆

    本项目利用Spring 2.5、Struts 2.0和Direct Web Remoting (DWR)的集成,实现了用户登录功能,下面将详细解析这三个框架以及它们在用户登录模块中的应用。 **Spring框架** Spring是一款轻量级的Java企业级应用框架,...

    struts2.0 hibernate 3.2 spring 2.0(dwr jquery)所需文件包

    标题中的“struts2.0 hibernate 3.2 spring 2.0(dwr jquery)所需文件包”提到了四个关键的技术栈组件,它们在Java Web开发中扮演着重要的角色。下面将分别介绍这些技术及其相关知识点: 1. **Struts 2.0**: ...

    struts2.0+spring2.0+hiberante3+dwr+freemarker整合所需jar包

    Struts2.0、Spring2.0、Hibernate3和DWR以及Freemarker是Java Web开发中的关键组件,它们各自负责不同的职责,并且通过合理的整合,可以构建出强大的企业级应用系统。 Struts2.0是Apache软件基金会下的一个开源MVC...

    spring json dwr struts2.0 hibernate整合

    在您提供的信息中,我们看到一个基于Java的项目,它整合了Spring、JSON、DWR(Direct Web Remoting)、Struts2.0以及Hibernate3.0。下面将详细介绍这些技术及其整合方式。 1. **Spring框架**: Spring是一个开源的...

    OA系统源码,采用Struts2.0+Hibernate+Spring架构外加DWR

    该源码成功整合了Struts2.0+Hibernate+Spring(SSH架构)+DWR+MySql+Tomcat,直接拷贝部署就可以运行,前提建立相应的数据库。模块包括(组织机构管理,人员管理,角色管理,权限管理等等),每个模块均有增删查改等...

    DWR2.0 中文手册

    9. **实战与整合**:DWR可以与各种框架如Struts、Spring、Hibernate等无缝集成,用于构建复杂的Web应用。`ajax框架:dwr》实战(包括整合).pdf`这本书籍应该包含了实际项目中的应用案例和整合技巧,是学习DWR 2.0实战...

    Struts2.1.6+Struts2.0+Hibernate3.1整合示例

    开发环境:Windows XP sp3、SQL Server 2005、JDK 1.6、Struts2.1.6、Spring 2.0、Hibernate...至于声明式事务部分,你可以参见另外一个资源“Spring 2.0 + Struts 1.2 + Hibernate 3.2 + DWR 2.0 的JavaEE应用示例”

    dwr2.0整合Struts1.3+hibernate3.1+spring2.5的项目

    标题 "dwr2.0整合Struts1.3+hibernate3.1+spring2.5的项目" 涉及的是一个经典的Java Web开发技术集成,这其中包括Direct Web Remoting (DWR) 2.0、Struts 1.3、Hibernate 3.1和Spring 2.5。这个项目可能是为了展示...

    Strut2.0 与AJAX(第一部分)

    Struts2.0通过整合现有的AJAX框架来实现其AJAX功能,主要包括Dojo和DWR两个流行的库。 - **Dojo**:一个开放源码的JavaScript库,提供了一套丰富的客户端组件和工具,可以用来创建高度动态的Web应用。Struts2.0利用...

    Struts2 + spring + hibernate + dwr 完美整合代码

    Spring与Struts2整合,可以实现动作类的依赖注入,提高代码的可测试性和可维护性。此外,Spring还提供了数据访问抽象,如JdbcTemplate或HibernateTemplate,使得数据库操作更为简单。 **Hibernate** 是一款强大的...

    Spring 2.0 + Struts 1.2 + Hibernate 3.2 + DWR 2.0 的JavaEE应用示例

    该示例使用MyEclipse 5.5 IDE用来整合四个技术(Struts 1.2, Spring 2.0, Hibernate 3.2和Ajax技术)的轻量级的JavaEE。 操作步骤如下: 1. 下载并解压之后,使用MyEclipse导入工程 2. 找到demo目录中的.sql数据库...

    DWR2.0中文文档

    ### DWR2.0中文文档知识点解析 #### DWR概览 DWR(Direct Web Remoting)是一种开源框架,用于简化Ajax应用的开发过程。它允许JavaScript直接调用服务器端的Java方法,从而实现了客户端与服务器端之间的无缝交互。...

    struts1.2+ibatis+DWR2.0+MySql5.0增删改查的小例子

    Struts1.2、iBatis、DWR2.0和MySql5.0是Java Web开发中的四个重要组件,它们分别在MVC(模型-视图-控制器)架构的不同层面上发挥着关键作用。这个小例子展示了如何将这些技术整合在一起,实现一个基本的增删改查功能...

    SSH+DWR2.0框架整合并实现Ajax.

    在SSH框架中整合DWR2.0,主要是为了让Spring管理DWR的生命周期,从而简化配置和提高可维护性。首先,我们需要将DWR的相关库引入到项目中,然后进行以下步骤: 1. **删除dwr.xml配置文件**:在整合Spring和DWR后,...

Global site tag (gtag.js) - Google Analytics