总结了一下Struts1和Struts2的区别,随便散分

warrior30 2011-06-07 10:47:36
大家都知道Struts1是一个老的成熟的Java Web开发框架,Struts2其实是一个老的成熟的框架(2006产生,近6年了)。

说区别之前先说一下struts1的缺点,也就是为什么要开发struts2来代替1呢?

一 Struts1的缺点
(1) 鸡肋的AactionForm;
(2) 耦合性太强,导致单元测试困难;

1:在现代企业软件开发中,分层和解耦是两个必须考虑的要素,经典的软件分层结构如图:
表现层
业务逻辑层
数据访问层
其中,数据访问层实现对数据库操作的封装,以隔离具体业务和数据库之间的联系;而业务逻辑层实现对业务逻辑的封装,隔离用户操作的界面和具体业务逻辑;表现层即用户界面层,提供用户操作接口。这种分层封装的好处是分化了复杂的系统,同时也提高了系统的可维护性,使得开发过程中的分工协作更加方便快捷,采用这种层次结构,上层应该只依赖于它的下层结构,而不应该跨层依赖;同时,下层不应该依赖于它的上层结构,也就是说,业务逻辑层和数据访问层绝对不要依赖于表现层。也业务逻辑层和数据库访问层的代码中,不要出现调用表现层的代码的情况。遵循这个原则将简化在相同的基础上替换表现层的代价,也使得表现层的修改所带来的连锁反应尽可能小。

Struts 是属于表现层的技术,在Struts中,为了接受表单的数据,我们必须编写一个从Struts 的ActionForm类继承的类,否则你就只能从HttpServletRequest中提取数据了,然而,不使用ActionForm,意味着你需要自己对表单数据做初始化,以及自己编写代码对表单数据进行验证。使用从ActionForm继承的类,如果更换了Web框架,这个类也将会被废弃。ActionForm中的数据往往需要传递给业务逻辑层和数据访问层进行处理,为了避免业务逻辑层和数据访问层依赖于Struts,通常我们会编写一个和ActionForm类具有相同属性的普通JavaBean类,考虑到程序中还会存在着PO(持久化对象)和JavaBean对象之间的数据复制,将使我们不厌其烦的来回复制大量的表单数据。

2:耦合性大、单元测试困难
Struts1 中的Action类与Servlet API耦合在一起,其核心方法 executs 依赖于Servlet API 中的HttpServletRequest 和 HttpServletResponse ,方法如下:

public ActionForward execute(ActionMapping mapping,ActionForm form,
Javax.servlet.http.HttpServletRequest request,
Javax.servlet.http.HttpServletResponse response)
因为HttpServletRequest 和 HttpServletResponse 是由Servlet容器负责实例化的,因此Action类的测试要依赖于web容器,单元测试很难实现。(当然会有第三方测试工具)

上述两点只是举例说明Struts1在设计上的不足,还有很多不一一列举。
二 Struts2 出现

全文见博客http://www.yongzhi.info/?p=207
...全文
1508 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
橙色海洋zz 2011-12-01
  • 打赏
  • 举报
回复
学习,struts2好久没有用了,都忘记了
jackingod 2011-06-09
  • 打赏
  • 举报
回复
嗯 好帖 顶一下~
xiaolineng 2011-06-09
  • 打赏
  • 举报
回复
个人意见
1.struts1中的execute方法使用起来麻烦,要转型,又要写一大句跳转,麻烦的要死
2.struts1和servlet的耦合性强,在web.xml中配置麻烦
3.struts1的struts-config.xml配置起来也比较的麻烦
我学习的时候就就明显感觉到,有的地方需要左斜杠,有的地方不需要
对于struts2
1.跳转简单,直接用result标签配置
2.耦合性大大降低了
3.struts2配置更简单了
4.struts2的OGNL增强了的显示的功能.
5.sturts2的拦截器也是一个很好的应用



总结的很到位,感谢!!!
wangzhangtv 2011-06-09
  • 打赏
  • 举报
回复
学习学习!!! 这两个的区别老是抓不到一个点上去! 讲不去所以然!
soil_zhang 2011-06-09
  • 打赏
  • 举报
回复
学习了
deyygywxf 2011-06-09
  • 打赏
  • 举报
回复
学习,不知道有木有分???
cfxinxin 2011-06-09
  • 打赏
  • 举报
回复
鸡肋的ActionForm;

这句不赞同。。

LZ没做过其他技术实现的前台展现吧。

1中的ActionForm 其实是VO,是一种数据的转换。对于三层架构,DAO层使用了hibnate的冗余的话,前台的VO转换会出现问题,特别是JSON格式,会出现异常。

现在富客户端开发的时候,前台VO是很必要的。对数据的前台校验和过滤都要做的嘛。。。
jeenhuang 2011-06-09
  • 打赏
  • 举报
回复
学习学习
一邺飘零 2011-06-08
  • 打赏
  • 举报
回复
觉得1.X的缺点还得加一个很明显的,就是1.X是单线程的,无法应对多线程的问题。
司机 2011-06-08
  • 打赏
  • 举报
回复
这分真得接~!
luokuo 2011-06-08
  • 打赏
  • 举报
回复
javastudy0820 2011-06-08
  • 打赏
  • 举报
回复
个人意见
1.struts1中的execute方法使用起来麻烦,要转型,又要写一大句跳转,麻烦的要死
2.struts1和servlet的耦合性强,在web.xml中配置麻烦
3.struts1的struts-config.xml配置起来也比较的麻烦
我学习的时候就就明显感觉到,有的地方需要左斜杠,有的地方不需要
对于struts2
1.跳转简单,直接用result标签配置
2.耦合性大大降低了
3.struts2配置更简单了
4.struts2的OGNL增强了的显示的功能.
5.sturts2的拦截器也是一个很好的应用
lenj520 2011-06-08
  • 打赏
  • 举报
回复
学习加接分
  • 打赏
  • 举报
回复
不是很详细啊,呵呵,谢谢楼主
凯瑞甘 2011-06-08
  • 打赏
  • 举报
回复
接分了,其他的不说
曹西 2011-06-08
  • 打赏
  • 举报
回复
struts1是非线程安全,单利模式的感觉,而struts2是线程安全,每次都new一个对象,之后被系统回收,不会让费资源
az12xc34 2011-06-08
  • 打赏
  • 举报
回复
感谢楼主。其实我是来接分的.....
哈哈哈3234 2011-06-08
  • 打赏
  • 举报
回复
大家都知道Struts1是一个老的成熟的Java Web开发框架,Struts2其实是一个老的成熟的框架(2006产生,近6年了)。

说区别之前先说一下struts1的缺点,也就是为什么要开发struts2来代替1呢?

一 Struts1的缺点
(1) 鸡肋的AactionForm;
(2) 耦合性太强,导致单元测试困难;

1:在现代企业软件开发中,分层和解耦是两个必须考虑的要素,经典的软件分层结构如图:
表现层
业务逻辑层
数据访问层
其中,数据访问层实现对数据库操作的封装,以隔离具体业务和数据库之间的联系;而业务逻辑层实现对业务逻辑的封装,隔离用户操作的界面和具体业务逻辑;表现层即用户界面层,提供用户操作接口。这种分层封装的好处是分化了复杂的系统,同时也提高了系统的可维护性,使得开发过程中的分工协作更加方便快捷,采用这种层次结构,上层应该只依赖于它的下层结构,而不应该跨层依赖;同时,下层不应该依赖于它的上层结构,也就是说,业务逻辑层和数据访问层绝对不要依赖于表现层。也业务逻辑层和数据库访问层的代码中,不要出现调用表现层的代码的情况。遵循这个原则将简化在相同的基础上替换表现层的代价,也使得表现层的修改所带来的连锁反应尽可能小。

Struts 是属于表现层的技术,在Struts中,为了接受表单的数据,我们必须编写一个从Struts 的ActionForm类继承的类,否则你就只能从HttpServletRequest中提取数据了,然而,不使用ActionForm,意味着你需要自己对表单数据做初始化,以及自己编写代码对表单数据进行验证。使用从ActionForm继承的类,如果更换了Web框架,这个类也将会被废弃。ActionForm中的数据往往需要传递给业务逻辑层和数据访问层进行处理,为了避免业务逻辑层和数据访问层依赖于Struts,通常我们会编写一个和ActionForm类具有相同属性的普通JavaBean类,考虑到程序中还会存在着PO(持久化对象)和JavaBean对象之间的数据复制,将使我们不厌其烦的来回复制大量的表单数据。

2:耦合性大、单元测试困难
Struts1 中的Action类与Servlet API耦合在一起,其核心方法 executs 依赖于Servlet API 中的HttpServletRequest 和 HttpServletResponse ,方法如下:

public ActionForward execute(ActionMapping mapping,ActionForm form,
Javax.servlet.http.HttpServletRequest request,
Javax.servlet.http.HttpServletResponse response)
因为HttpServletRequest 和 HttpServletResponse 是由Servlet容器负责实例化的,因此Action类的测试要依赖于web容器,单元测试很难实现。(当然会有第三方测试工具)

上述两点只是举例说明Struts1在设计上的不足,还有很多不一一列举。
二 Struts2 出现
androidmvc 2011-06-08
  • 打赏
  • 举报
回复
很久不用这些东西,当初只学了struts1。。至今一直未用 其他框架!
lorry1113 2011-06-08
  • 打赏
  • 举报
回复
没怎么用2啊,学习了
加载更多回复(19)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧