`
zjit
  • 浏览: 13018 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MVC框架 大PK

阅读更多
1,Struts1.x
所有客户端Http请求发送至Struts的核心控制器ActionServlet, 它会根据Struts-config.xml配置文件,找到相应的Action类。同时将请求参数封装到ActionForm。Action调用Model层的业务方法,根据结果,Action返回ActionForm对象。
--------------------------------------------------------------------

2,JSF
客户端通过事件触发,将请求通知给JSF的核心控制器FacesServlet, FacesServlet会创建一个FacesContext对象,它里面包含了处理请求所必须的信息,接着FacesServlet会将控制权交给LifeCycle处理器。
(LifeCycle生命周期):
恢复视图 ----》 应用请求值 ----》处理验证 ----》更新模型值 ----》调用应用程序
----》 呈现响应
-------------------------------------------------------------------
3,SpringMVC
客户端发送请求到Spring的核心控制器DispacherServlet,它会根据配置文件
(xxx-servlet.xml)找到对应的处理器Handler
Handler处理完业务逻辑后将返回ModelAndView给DispatherServlet. ModelAndView包含了视图逻辑和渲染视图所需用到的模型数据对象,由于ModelAndView包含的是视图逻辑名,所以需通过ViewResolver来完成解析,最后DispatherServlet将请求分派给View对象。
------------------------------------------------------------------

4,WebWork
浏览器发送的请求都被ServletDispacher截获,ServletDispather根据服务名,解析对应的Action名。AppalicationContext,遍历HttpServletRequest,HttpSession,ServletContext中的数据,将其复制到WebWork的Map实现中,至此之后,数据操作在Map结构中进行,完成内部结构与ServletAPI的分离
ActionProxyFactory根据xwork配置文件(xwork.xml)创建ActionProxy实例,ActionProxy中包含Action的配置信息。
ActionProxy创建相应对应的Action实例,并根据配置进行一系列的处理程序,包含执行相应的预处理程序以及对Action运行结果进行处理。
-----------------------------------------------------------------

5,Struts2
a,浏览器发送请求,
b,核心控制器FilterDispather根据请求决定调用合适的Action
c,WebWork的拦截器链自动对请求应用通用功能,例如WorkFlow,Validation或文件上传等功能
d,回调Action的execute方法处理结果信息将被输出到浏览器中,可以是HTML页面,图像,也可以是PDF文档或者其他文档。此时支持的视图技术非常多,既支持JSP,也支持Velocity,FreeMarker等模板技术。
----------------------------------------------------------------


Struts1.x存在的问题?
1,支持的表示层技术单一
2,与ServletAPI严重耦合,难于测试。
3,代码严重依赖于Struts1API,属于侵入式设计
----------------------------------------------------------------

Struts2与Struts1的对比
1,在Action实现类方面:Struts1要求Action类继承一个抽象基类;Struts1的一个具体问题是使用抽象类编程而不是接口。Struts2 Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制服务成为可能。 Struts2 提供一个ActionSupport基类 去实现常用的接口。即使Action接口不是必须实现的,只有一个包含execute方法的POJO类都可以用作Struts2的Action。
2,线程模式方面:Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能做的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的;Struts2 Action对象为每一个请求
产生一个实例,因此没有线程安全问题。

3,Servlet依赖方面:Struts1 Action依赖于Servlet API,因为Struts1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。Struts2 Action 不再依赖于ServletAPI,从而允许Action脱离Web容器运行,从而降低了测试Action的难度。当然,如果Action 需要直接访问HttpServletRequest和HttpServletResponse参数,Struts2 Action仍然可以访问它们。但是,大部分时候,Action都无需直接访问HttpServletRequest和HttpServletResponse,从而给开发者更多灵活的选择。

4,可测试方面:测试Struts1 Action的一个主要问题是execute方法依赖于Servlet于ServletAPI, 这使得Action 仍然的测试要依赖于Web容器。为了脱离Web容器测试Struts1 的Action, 必须借助于第三方扩展:Struts TestCase,该扩展下包含了系列的Mock对象,从而脱离Web容器测试Struts1的Action类。Struts2 Action可以通过初始化,设置属性,调用方法来测试。

5,封装请求参数方面:Struts1 使用ActionForm对象封装用户的请求参数,所有的ActionForm 必须继承一个基类:ActionForm。 普通的JavaBean不能用作ActionForm
因此,开发者必须创建大量的ActionForm类封装用户请求参数。虽然Struts1 提供了动态ActionForm 来简化 ActionForm 的开发,但依然需要在配置文件中定义ActionForm; Struts2 直接使用Action 属性来封装用户请求属性,避免了开发者需要大量开发ActionForm类的繁琐,实际上,这些属性还可以是包含子属性的Rich对象类型。如果开发者依然怀念Struts1 ActionForm 的模式,Struts 2 提供了ModelDriven 模式, 可以让开发者使用单独的Model 对象来封装用户请求参数,但该Model对象无须继承任何Struts2基类,是一个POJO,从而降低了代码污染。

6,表达式语言方面:Struts1 整合了JSTL,因此可以使用JSTL表达式语言。这种表达式语言有基本对象图遍历,但在对集合和索引属性的支持上则功能不强;Struts2 可以是用JSTL,但它整合了一种更强大和灵活的表达式语言:OGNL(Object Graph Notation Language),因此,Struts2下的表达式语言功能更加强大。

7,绑定值到视图方面:Struts1 使用标准JSP机制把对象绑定到视图页面;Struts2 使用“ValueStack”技术,使标签能够访问值,而不需要把对象和视图页面绑定在一起。

8,类型转换的方面:Struts 1 ActionForm 属性通常都是String 类型。 Struts1 使用
Commons-Beanutils 进行类型转换,支持基本数据类型和常用对象之间的转换。

9,数据校验的方面:Struts1 支持在ActionForm 重写 validate方法手动校验,或者通过整合Commons alidator框架来完成数据校验。Struts2 支持通过重写validator方法进行校验,也支持整合XWork校验框架进行校验

10,Action执行控制的方面:Struts1 支持每一个模块对应一个请求处理(既生命周期的概念),但是模块中的所有Action必须共享相同的生命周期。Struts2支持通过拦截器堆栈为每一个Action 创建不通的生命周期。开发者可以根据需要创建相应堆找,从而和不同的Action一起使用。

-----------------------------------------------------------------------------------
WebWork 和 Struts2对比
从某种程度上来看,Struts2是WebWork的升级,而不是Struts1的升级,甚至在Apache的Struts2的官方文档都提到:WebWork到Struts2是一次平滑的过渡。实际上,Struts2 其实是WebWork2.3而已,从WebWork2.3 迁移到Struts2.0 不会比WebWork2.1到2.2更麻烦。
在很多方面,Struts2 仅仅是改变了WebWork 下的名称,因此,如果开发者具有WebWork 的开发经验,将可以更加迅速地进行Struts2的开发领域。
另外,Struts2 删除了WebWork中少量的特性。



分享到:
评论
9 楼 fujohnwang 2009-03-18  
timerri 写道
从架构上来说,继承于servlet的框架大部分走的还是servlet架构的老路,最多就是多进行了几次重定向和数据映射。架构上没有任何的超越。而繁多的框架又吸引了太多人的目光,这真可谓是java界的悲哀。事实上,能掌握servlet,就基本能掌握所有这些框架了。

为什么很少人能从架构上做文章呢?简单举个例子,request进来后不再进入线程池,而是进入request队列并分解到对应的controler队列,每个controler独立且仅维护自己的线程(或用背对背的方式多controler共用一个线程),并仅从自己的队列读取request处理后将返回结果添加到response队列(response队列也可级联),最后由server读取response队列并返回。这种就是纯粹的异步操作,在高并发下会有远远超越现有架构的能力。一些应用服务器已经有了这样的苗头,可惜,为了servlet架构,还是继续在使用线程池。java这么多技术里,就spring还有些新意,可惜还是经常被滥用。

不好意思,借你的地方抱怨了一下,现在越来越觉得上javaeye是在浪费时间。除了个别人外。很少有人能够直指本质的讨论问题。就算讨论了,也没几个人能听懂。

我还是继续研究我的嵌入式去吧....


refer to EDA - SEDA

just an alternative to threading model.
8 楼 kimmking 2009-02-27  
lz虽然分析的不深,但是也不错~~


k可惜了,此贴进了新手区~~

java区那么多该进的都没进~~

哎~
7 楼 zjit 2009-02-26  
timerri 写道
从架构上来说,继承于servlet的框架大部分走的还是servlet架构的老路,最多就是多进行了几次重定向和数据映射。架构上没有任何的超越。而繁多的框架又吸引了太多人的目光,这真可谓是java界的悲哀。事实上,能掌握servlet,就基本能掌握所有这些框架了。

为什么很少人能从架构上做文章呢?简单举个例子,request进来后不再进入线程池,而是进入request队列并分解到对应的controler队列,每个controler独立且仅维护自己的线程(或用背对背的方式多controler共用一个线程),并仅从自己的队列读取request处理后将返回结果添加到response队列(response队列也可级联),最后由server读取response队列并返回。这种就是纯粹的异步操作,在高并发下会有远远超越现有架构的能力。一些应用服务器已经有了这样的苗头,可惜,为了servlet架构,还是继续在使用线程池。java这么多技术里,就spring还有些新意,可惜还是经常被滥用。

不好意思,借你的地方抱怨了一下,现在越来越觉得上javaeye是在浪费时间。除了个别人外。很少有人能够直指本质的讨论问题。就算讨论了,也没几个人能听懂。

我还是继续研究我的嵌入式去吧....


哥们,没事,你的“抱怨” 我 觉得是有那么点道理的
MVC框架整了这么多年,还是一个模式
核心控制器,资源配置文件,参数封装,线程池...
我觉得如果没有新意没有创新,那么请别胡乱弄个什么新名词什么新框架忽悠我们程序员





6 楼 wolfbrood 2009-02-26  
<div class="quote_title">timerri 写道</div>
<div class="quote_div">从架构上来说,继承于servlet的框架大部分走的还是servlet架构的老路,最多就是多进行了几次重定向和数据映射。架构上没有任何的超越。而繁多的框架又吸引了太多人的目光,这真可谓是java界的悲哀。事实上,能掌握servlet,就基本能掌握所有这些框架了。<br /><br />为什么很少人能从架构上做文章呢?简单举个例子,request进来后不再进入线程池,而是进入request队列并分解到对应的controler队列,每个controler独立且仅维护自己的线程(或用背对背的方式多controler共用一个线程),并仅从自己的队列读取request处理后将返回结果添加到response队列(response队列也可级联),最后由server读取response队列并返回。这种就是纯粹的异步操作,在高并发下会有远远超越现有架构的能力。一些应用服务器已经有了这样的苗头,可惜,为了servlet架构,还是继续在使用线程池。java这么多技术里,就spring还有些新意,可惜还是经常被滥用。<br /><br />不好意思,借你的地方抱怨了一下,现在越来越觉得上javaeye是在浪费时间。除了个别人外。很少有人能够直指本质的讨论问题。就算讨论了,也没几个人能听懂。<br /><br />我还是继续研究我的嵌入式去吧....</div>
<p> </p>
<p>比较有个性的人,不错</p>
5 楼 天机老人 2009-02-25  
呵呵spring mvc 也可以使用 ongl 而且可以实现pojo的form!
现在开发感觉比较轻还不错!
4 楼 timerri 2009-02-25  
从架构上来说,继承于servlet的框架大部分走的还是servlet架构的老路,最多就是多进行了几次重定向和数据映射。架构上没有任何的超越。而繁多的框架又吸引了太多人的目光,这真可谓是java界的悲哀。事实上,能掌握servlet,就基本能掌握所有这些框架了。

为什么很少人能从架构上做文章呢?简单举个例子,request进来后不再进入线程池,而是进入request队列并分解到对应的controler队列,每个controler独立且仅维护自己的线程(或用背对背的方式多controler共用一个线程),并仅从自己的队列读取request处理后将返回结果添加到response队列(response队列也可级联),最后由server读取response队列并返回。这种就是纯粹的异步操作,在高并发下会有远远超越现有架构的能力。一些应用服务器已经有了这样的苗头,可惜,为了servlet架构,还是继续在使用线程池。java这么多技术里,就spring还有些新意,可惜还是经常被滥用。

不好意思,借你的地方抱怨了一下,现在越来越觉得上javaeye是在浪费时间。除了个别人外。很少有人能够直指本质的讨论问题。就算讨论了,也没几个人能听懂。

我还是继续研究我的嵌入式去吧....
3 楼 netfishx 2009-02-25  
月经贴。。。。。。
2 楼 wintersun 2009-02-22  
引用
如果开发者依然怀念Struts1 ActionForm 的模式,Struts 2 提供了ModelDriven 模式

我想应该没有人会怀念吧,呵呵
1 楼 yyjn12 2009-02-22  
优点都是什么呢?

相关推荐

    Jsp Mvc 案例打包下载(二)

    **JSP MVC 案例打包下载(二)** 在Web开发领域,JavaServer Pages (JSP) 和 Model-View...记得在实践中不断学习和探索,因为Web开发是一个不断发展的领域,新的技术和框架如Spring MVC、Struts等也值得你去了解和掌握。

    SlugDungeon游戏:基于Apple MVC模型的Python图形界面设计与实现

    目标:熟悉游戏逻辑,掌握Python MVC框架的使用,能够运用Tkinter包绘制UI元素,并深入理解软件组件之间的相互合作与协调关系。 此练习要求学生严格按照规定完成各个层次的工作,并将所获得的技术应用到实际项目中...

    一个C++.net实现的智能五子棋人机对战游戏

    在这个C#.NET实现的智能五子棋人机对战游戏中,开发者使用了C#编程语言,结合.NET框架,创建了一个互动的对弈平台,玩家可以与计算机进行对战。五子棋是一种策略型两人棋类游戏,目标是在棋盘上先连成五子的玩家获胜...

    在线移动端投票系统源码(asp.net mvc)

    利用Nhibernet+Castle以及AOP+IOC...实现俩俩PK时投票,可以把这个比较当作比较综合的框架来学习Nhaibernet和Castle.net。数据库时需要自己创建一个数据库,名称和配置文件中一致,然后运行后自动通过模型创建数据表。

    基于Python和Django框架的二级学院资料室图书管理系统设计与实现.zip

    Django遵循MVC(模型-视图-控制器)设计模式,但在此基础上进行了改良,采用MTV(模型-模板-视图)模式。模型(Model)负责数据的处理和存储,模板(Template)处理页面的呈现,视图(View)则负责业务逻辑和数据的...

    OA源码(PK时发型不乱1-30讲).rar

    SSH整合是指Spring、Struts和Hibernate这三大开源框架的集成应用。Spring作为IoC(Inversion of Control,控制反转)容器和AOP(Aspect-Oriented Programming,面向切面编程)框架,负责管理和协调各组件;Struts则...

    Biny:Biny是用于Web应用程序的微型高性能PHP框架

    比尼 Biny是一种高性能的轻量级PHP框架遵循MVC模式,用于快速开发现代Web应用程序Biny代码简洁优雅,对应用层,数据层,模板渲染层的封装简单易懂,能够快速上手使用高质量,框架响应时间在1ms以内Biny是一个高性能...

    .NET源码分享卓越在线,新版高升,带KJ带PK拾

    了解ASP.NET的页面生命周期、控件、路由、MVC模式等是必要的。 4. **ADO.NET**:用于数据库访问的组件,它提供了连接、命令、数据集等对象,使得数据操作更加便捷。 5. **Windows Forms**或**WPF**:如果涉及到...

    python django 框架 编写写的 博客系统

    Django遵循模型-视图-控制器(MVC)设计模式,但在这里被改称为模型-视图-模板(MVT)。在这个博客系统项目中,我们可以看到Django如何帮助开发者快速构建功能完备的Web应用。 首先,我们从“模型”开始。在Django...

    CI框架实现框架前后端分离的方法详解

    CodeIgniter(简称CI)是一个轻量级的PHP MVC开发框架,它被广泛用于Web应用开发。CI框架的灵活性使得它能够很好地实现前后端分离。本文将详细介绍如何使用CI框架来实现前后端分离的方法。 首先,实现前后端分离的...

    基于java开发的六级单词PK小游戏-源码

    11. **软件工程实践**:良好的代码组织和命名规范也是项目的一部分,遵循一定的设计模式如MVC(模型-视图-控制器)可以提高代码可读性和维护性。 通过分析这个六级单词PK小游戏的源码,不仅能够学习到Java编程的...

    学生选课管理系统

    在技术实现上,服务器端通常使用Servlet或Spring MVC框架,这些框架提供了处理HTTP请求、管理业务逻辑和控制流程的能力。后端开发还需要掌握Java编程语言,以及如Hibernate或MyBatis这样的持久层框架,简化数据库...

    JSP基于SSH2物流企业订单管理系统毕业源码案例设计.zip

    2. **SSH2框架**:由Spring、Struts和Hibernate三个框架组成,提供了完整的MVC(Model-View-Controller)架构。Spring负责依赖注入和业务逻辑,Struts处理请求和视图展现,Hibernate则作为对象关系映射工具,简化了...

    基于PHP的so700(天天PK)网络游戏列表源码.zip

    6. **框架或库**:如jQuery、Bootstrap等,简化开发工作。 7. **文档**:README.md、LICENSE等,提供安装指南和许可信息。 8. **配置文件**:如.htaccess,设置URL重写规则或其他服务器配置。 基于PHP的Web应用程序...

    PHP增删改查模板(原生PHP+BootStrap前端框架)

    涵盖php增删改查的所有操作,并按照java的mvc设计模式写的(只是没写service,但dao层和controller,pojo,dbhelper还是有写...需要自己建立一个login表,有id(int auto_increment PK),user(varchar),pwd(varchar) 这三个字段

    books_management:基于 Django 框架开发的图书管理系统

    1. **Django 框架**:Django 是一个开源的、基于模型-视图-控制器(MVC)架构模式的 Web 框架。它提供了 ORM(对象关系映射)系统,可以方便地处理数据库操作,无需编写 SQL 语句。Django 还包含了一个内置的开发...

    大学计算机专业毕业设计JSP+Struts+js(自己做的)

    Struts是一个开源的MVC(Model-View-Controller)框架,用于构建基于Java Web的应用程序。它简化了开发过程,提供了更好的结构和控制流程,使得应用程序更易于维护和扩展。Struts的核心组件包括ActionServlet、...

    Struts2.1.6+Hibernate3.3.2+Spring2.5.5+Extjs3.0.0+Annotations

    Spring2.5.5版本加强了对注解的支持,简化了Bean配置,同时提供了事务管理、数据访问、MVC框架等功能。 **4. Extjs3.0.0** Extjs是一个用于构建企业级Web应用的JavaScript库,它提供了一套丰富的UI组件,如表格、...

    用django模仿的精简版知乎网站.zip

    例如,`/questions/`可能映射到显示所有问题的视图,而`/question/&lt;int:pk&gt;/`可能映射到显示特定问题的视图。 7. 用户认证与授权:Django提供了一套完整的用户认证系统,包括注册、登录、密码重置等功能。在模仿...

    Desafio-Django:登录到CRUD,utilizando或Django框架

    对于CRUD操作,Django的模型-视图-控制器(MVC)架构提供了强大的支持。你需要定义一个模型来描述数据结构,这通常是在`models.py`文件中完成。例如,你可能创建一个`Book`模型,包含`title`、`author`和`出版日期`...

Global site tag (gtag.js) - Google Analytics