浅谈Struts2与Webwork的不同和相同点_Hustudent20080101的博客-程序员秘密

技术标签: 网络  web  Java笔记  

浅谈Struts2与Webwork的不同和相同点

2011-06-28 09:14 honeymoose OSS社区 字号: T | T
一键收藏,随时查看,分享好友!

本文介绍的两大开发框架,Struts 2和WebWork。希望能够给你带来帮助,一起来看。

AD:51CTO网+ 首届中国APP创新评选大赛>>


    Struts 2是Struts的下一代产品。是在 struts 和WebWork的技术基础上进行了合并,全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构的差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。

    Struts和Webwork同为服务于Web的一种MVC框架,从某种程度上看,Struts2是从WebWork2上升级得到的。甚至Apache的官方文档也讲:WebWork2到Struts2是平滑的过渡。我们甚至也可以说Struts2就是WebWork2.3而已。在很多方面Struts仅仅是改变了WebWork下的名称。Struts2对应的有自己的标签,并且功能强大。Webwork也有自己的标签。

    在很多方面,Struts 2仅仅是改变了WebWork下的名称,因此,如果开发者具有WebWork的开发经验,将可以更加迅速地进入Struts 2的开发领域。

    下面是Struts 2与WebWork命名上存在改变。

    Struts 2和WebWork成员名称的对应表:

    Struts 2和WebWork成员名称的对应表

    除此之外,Struts 2也删除了WebWork中少量特性:

    AroundInterceptor:Struts 2不再支持WebWork中的AroundInterceptor。如果应用程序中需要使用AroundInterceptor,则应该自己手动导入WebWork中的AroundInterceptor类。

    富文本编辑器标签:Struts 2不再支持WebWork的富文本编辑器,如果应用中需要使用富文本编辑器,则应该使用Dojo的富文本编辑器。

    IoC容器支持:Struts 2不再支持内建的IoC容器,而改为全面支持Spring的IoC容器,以Spring的IoC容器作为默认的Object工厂。

    希望本文对你有帮助。

    【编辑推荐】

    1. 谈java web server与io形式
    2. 分析JAVA的Random类
    3. JAVA开发 分析JNI标准原理
    4. 谈JAVA静态载入的两种方式
    5. JAVA入门 基于Java的移动游戏开发
    【责任编辑: QiHappy TEL:(010)68476606】


    struts2与webWork2的区别
    1.Struts2更加优雅一些,至少Action变成了一个纯粹的POJO,而无须再实现任何一个接口。
    2.Struts2不再提供Webwork2内置的IoC容器支持,转而将Spring作为ObjectFactory的缺省实现。所有由Struts2创建的对象都是由ObjectFactory实例化,ObjectFactory可以集成各种IoC容器,例如Spring、Pico、 Plexus等等.
    3.在拦截器方面,Struts2不再支持AroundInterceptor,如果要用到AroundInterceptor ,则必须单独引入Webwork2的相关类,或者重写自己的拦截器。
    Struts2中绝大多数预建interceptor都从AbstractInterceptor扩展而来,AbstractInterceptor不在支持before、after两个抽象方法,取而代之的是intercept方法被抽象出来,交由子类去实现。 其实大多数interceptor只会去实现before、after中的一个,这样就必须还要在ww中为另一个提供空方法,再由于线程安全问题WW中before和after两个方法之间是无法共享数据,提供两个抽象方法实在意义不大。
    AroundInterceptor抽象类在Struts2中已经去除,before和after两个方法无法共用数据,这个类真的没什么用,很多时候都是实现Interceptor接口更为实际。在Strtus2中,实现AbtractInterceptor更为有用,因为可以不用实现init 和destory方法,直接实现intercept方法就可以了。
    4.Struts2全面引入了Dojo,大概是对以前Webwork2在客户端实现的不满吧。例如不再支持Webwork2的richtexteditor,而以Dojo的编辑器取代。说实话,Webwork2了的rich text编辑器确实不太好用,有不少bug。还把Webwork2的Datepicker标签换成了Dojo实现的datetimepicker标签。
    5.Struts2在Action映射方面的改进值得关注,尤其是借鉴了Spring的方式,提供了对action名称通配符的支持。在Webwork2里,需要在xwork.xml里以如下格式定义action
    <action name="Logon" class="com.Logon">
    <result type="redirectAction">Menu</result>
    <result name="input">/Logon.jsp</result>
    </action>
    而在Struts2中,则可以引入通配符,形如:
    <action name="*Logon" class="com.Logon">
    <result type="redirectAction">Menu</result>
    <result name="input">/Logon.jsp</result>
    </action>
    这样,任何以Logon结尾用作登录验证的Action,例如NewUserLogon,都可调用com.Logon的一个实例。
    6.Struts2还引入一个消息存储拦截器MessageStoreInterceptor用于存放、检索各种提示、错误消息等等,在一个session生命期中都是可用的。
    7.对于模型层来说,struts2可以使用任何数据访问技术,像jdbc、ejb、hibernate等;对于视图层来说,struts2可以与jsp、jtl、jsf、pdf、xslt、templates、Jakarta Velocity engine等
    分享到:                    
    参考知识库Java EE知识库


    struts2 为什么要基于 webwork

    webwork
    采用更加松耦合的设计,系统的action和servlet API不在耦合,使单元测试更方便,允许系统从B/S结构向C/S结构转换
    webwork支持更多的表现层技术,如velocity,freemarker和xslt等
    webwork可以脱离web应用使用,webwork有自己的控制反转(Inversion of Control)容器,通过控制反转,能让测试更简单
    从处理流程上来看,webwork与struts1很相似,核心都是控制器组成:
    1)核心控制器ServletDispatcher,由框架提供
    2)业务逻辑控制器Action,由程序员提供 相对于struts1,webwork优点
    1)action无需与Servlet API耦合,更容易测试
    2)action无需与webwork耦合,代码重用率高
    仅仅实现webwork的action接口,包含了一个execute方法。 3)支持更多的表现层技术,有更好的适应性

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/autumn20080101/article/details/51423657

    智能推荐

    支付宝支付_JMathias的博客-程序员秘密

    一、申请移动支付权限首先登录【支付宝开放平台】http://open.alipay.com/platform/home.htm,添加应用,申请移动支付权限。申请开通支付,是需要公司文件的,个人是不允许开始支付的。具体细节就不再详聊了,下面就讲讲如何将阿里给出的demo运行起来。二、阿里支付DEMO1、概述    (1)支付调用页面及测试    支付宝在调用时,会首先

    Numpy自己实现独热编码one-hot_yeler082的博客-程序员秘密

    有关于独热编码的介绍参考:这里下面列出如何使用numpy自己实现独热编码:import numpy as npdef dense_to_onehot(labels_dense, num_classes=10): num_labels = labels_dense.shape[0] index_offset = np.arange(num_labels) * num_c...

    价值百万的 NFT 制作教程(Python版)_Python中文社区的博客-程序员秘密

    随着时间的推移,数字藏品领域越来越火。当一个加密朋克头像以15万美元的价格出售给Visa时,人们逐渐通过各种渠道去认识NFT。方法论这个生成器背后的方法很简单。通过将不同的特征结合在一起,创建一个独特的头像。获取你的数据你将使用 usetech-llc的 "Substrapunks "资源库中的数据。在下面的链接中下载他们的资源库,并将压缩文件解压到你的本地电脑上。htt...

    java 文件预览_Java实现文件的预览_蜜糖宝宝的博客-程序员秘密

    最近项目需要用到文件的预览功能,就开始在网上收集资料,学习了几种文件预览的方法。我集成到我项目内测试的有以下三种,最后使用的是第三种:直接使用别人提供的服务 例如:office web 365使用openoffice+swfTools+flexPaper实现使用openoffice+pdf.js实现1.使用office web 365第三方服务点击进入官网;特点:实现起来简单,简单的不能再简单了,...

    httpmime.jar 包是啥用的以及所依赖的包_weixin_34026276的博客-程序员秘密

    2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

    org.springframework.jdbc.UncategorizedSQLException: Error attempting to get column ‘lastModified‘ fr_小巫医初春的博客-程序员秘密

    org.springframework.jdbc.UncategorizedSQLException: Error attempting to get column 'lastModified' from result set. Cause: java.sql.SQLException: 请求的转换无效; uncategorized SQLException; SQL state [99999]; error code [17132]; 请求的转换无效; nested exception is java

    随便推点

    QTreeWidget的使用_zhy282289的博客-程序员秘密_qtreewidget用法

    看到一些人经常会问QTreeWidget的列宽怎么设啊,怎么固定列宽哦,行宽怎么设啊什么的.其实慢慢看manual就会找到了,下面就列下常用的方法:1.基本用法:初始化用基本用到的: //this->setMouseTracking(true);thi

    手把手教你做项目多线程篇——基础知识详解_肥学的博客-程序员秘密_项目多线程

    多线程导读项目中多线程的目的实战操作小知识创建一个简单的线程守护线程主进程等待子进程结束共享全局变量的特性锁互斥锁信号量送点资源导读随着暑假的推进,手把手教你做项目前边的准备也差不多了后续的项目也渐渐要开始了但是正式发出来可能要等一段时间前后端都是我一个人确实有点费力(毕竟我也是菜鸡),后面我在想想怎么提速吧嘻嘻 ???? 详情请大家关注请大家关注手把手教你做项目专栏里面有更多资源等你来探索哦。好了我们今天我们照常学习新知识为以后的项目做铺垫,老规矩喊出我们的口号:“不肥身体,肥学问”来吧开始。项目

    图片或背景实现等比自适应缩放_LaoYe - IT的博客-程序员秘密

    &lt;!DOCTYPE html&gt;&lt;html&gt;&lt;head&gt; &lt;meta charset="utf-8" /&gt; &lt;meta name="viewport" content="width=device-width, initial-scale=1" /&gt; &lt;title&gt;React App&lt;/title&gt; &lt;style&gt; body { margin: 0px; pad.

    JavaScript form提交汉字乱码_weixin_34114823的博客-程序员秘密

    &lt;script type="text/javascript"&gt;var test1="http://www.w3school.com.cn/My first/"document.write(encodeURI(test1)+ "&lt;br /&gt;")document.write(decodeURI(test1))&lt;/script&gt;输出ht...

    内联函数 inline_qq_1378466420的博客-程序员秘密

    在编译阶段 在函数的调用点直接展开。定义点不生成符号inline 和static 区别inline 无清栈开栈 static 有inline和 宏的区别分别在编译阶段,和预编译阶段 (内联是更高级的宏:有词法分析)注意事项1,内联的实现写在头文件中 .h2,只在Release版本生成3,内联是一个建议 递归,循环,swich 不能使用4,基于实现,不是基于声明优缺点...

    推荐文章

    热门文章

    相关标签