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

Struts不能完全用MVC来理解

阅读更多
刚才有一个关于Struts和MVC组件对应关系的帖子,现在好像被放入了新手区,关于这个问题记得以前有过激烈的讨论,可惜刚才我搜索一下没有找到想找的那篇,希望有谁找到能把链接发上来

对于这个问题我觉得还是有讨论的一些必要,因为疑惑的人还是存在,而且从我个人来说对这个问题的理解也在不断的变化。现在把我现在的理解写下来,可能存在偏颇(本来理解也在变化),只供讨论

我现在的观点是:
MVC可以帮助刚刚进入面向对象设计的开发者理解分层体系结构(MVC的最大价值),之后在面对Struts,Spring时,可以借助那种分层思想、及各层的大致组件角色和职责对这些框架进行理解,但不必钉钉铆铆的去对应,因为这种对应是模糊的、是非对称的
理由如下

第一
MVC是80年代Smalltalk80引入的一种用户界面应用程序设计模型,经过二十多年的发展,到现在Struts、Spring这些框架已经对MVC进行了很大的(局部)扩展,增加了很多原来不存在的角色,以使其分工更加细致。
以Struts为例,Struts其实只是体现MVC思想的Web层框架,只体现了View和“泛Controller”含义,而对于Model实现规定很少,基本可以自由实现。
这其中最有争议的是Action属于Controller还是Model,我觉得如果非要给Action找个归宿的话,就要看系统设计的具体情况,要看让Action来做什么,如果只让Action来根据请求调用相应的业务服务/处理对象,并将处理结果放入Request Attribute中,那么就可以将Action和ActionServlet、RequestProcessor统统作为“泛Controller”的组成部分(这种纯度高的设计层次较多较细,实际使用不多);如果让Action来承担一些业务逻辑的处理,比如一次请求需要调用多个业务服务的多个处理,再比如对于简单的设计Action直接调用DAO进行操作,那么它就又具有Model的部分职能,所以一般情况下Action是一个介于Controller和Model的衔接角色。

第二
原始MVC所存在的Smalltalk用户界面应用程序,与Struts、Spring的Web应用程序体系结构不同。在用户界面应用程序中,View和Model之间交互是基于事件的,Controller是作为一种策略Strategy模式应用的,控制不同的事件产生不同的相应方式;而在Web应用程序中,View和业务服务是基于请求/响应机制的,而Action更普遍的认同是作为一个Command模式。

个人理解,欢迎拍砖
分享到:
评论
19 楼 qinysong 2007-03-29  
阳光晒晒 写道
qinysong 写道
这个帖子怎么被放到新手区来了,难道是大家都有很好的理解了吗?还是不屑一辩
lz你题的太晚了
前年提正好但今年是ROR之年
不是ROR也得ajax
不是ajax也得是jsf
再再不行了也应该用struts2(webwork)
浮燥是流行....

呵呵。。有道理
18 楼 阳光晒晒 2007-03-29  
qinysong 写道
这个帖子怎么被放到新手区来了,难道是大家都有很好的理解了吗?还是不屑一辩
lz你题的太晚了
前年提正好但今年是ROR之年
不是ROR也得ajax
不是ajax也得是jsf
再再不行了也应该用struts2(webwork)
浮燥是流行....


to :lane_cn
引用

action调用model工作,再把工作的结果告诉view。struts框架规定了model的调用方式。

struts的框架里面没有model,任何通用的框架中都不可能有model,model永远要根据自己的业务去开发。

只有象SAP这样的特定领域框架才可能提供model,也只能是提供一个通用性的model,需要根据自己的需要进行扩展。

所有的框架都是为了加强业务对象的功能(比如ORM框架把业务对象自动保存到数据库里)、减少model对view的依赖(比如struts框架所干的事情)。如果不搞业务对象,大搞各种框架,本身就是奇怪的风格。在软件开发的历史上,是先有了model,然后为了解决model身上的问题,才出现各种框架的。


听你说了之后大开眼界
架构师是指model的架构
而非开发框架....
17 楼 qinysong 2007-03-29  
这个帖子怎么被放到新手区来了,难道是大家都有很好的理解了吗?还是不屑一辩
16 楼 lane_cn 2007-03-29  
action调用model工作,再把工作的结果告诉view。struts框架规定了model的调用方式。

struts的框架里面没有model,任何通用的框架中都不可能有model,model永远要根据自己的业务去开发。

只有象SAP这样的特定领域框架才可能提供model,也只能是提供一个通用性的model,需要根据自己的需要进行扩展。

所有的框架都是为了加强业务对象的功能(比如ORM框架把业务对象自动保存到数据库里)、减少model对view的依赖(比如struts框架所干的事情)。如果不搞业务对象,大搞各种框架,本身就是奇怪的风格。在软件开发的历史上,是先有了model,然后为了解决model身上的问题,才出现各种框架的。
15 楼 阳光晒晒 2007-03-29  
lane_cn 写道
阳光晒晒 写道
如果你不切开action的话
你怎么知道service层呢?
怎么知道model是怎么样子的呢?
一切都是在迷雾之后
被action+form所封装

action是控制器的一部分,他肯定会依赖view。比如struts action,他会依赖HttpResponse, HttpRequest这些类型,他还要从request得到请求参数,把输出文字放到response里面去,物理的和逻辑的依赖都是存在的。如果你把model融合到action中,model和view就分不开了。

form就是页面上的表单,在一些情况下他的属性恰好业务对象的属性一样,但是他根本不能作为代替model。道理很简单,界面上的内容不一定正好对应后台的业务对象。比如我要在界面上显示一个客户和他的最大的一笔订单,在界面上这是一个表单,但是在model层应该是两个关联的类:Customer和Order。

model本身是就应该是清晰的,他可以独立的装配,独立进行测试。不需要action+form为他提供封装。
真的不需要么
那么把model
放在struts的哪里呢?

从struts的角度(页面美工角度来看的话)
他们看不到model
为什么只有可能是被封装了
14 楼 lane_cn 2007-03-29  
阳光晒晒 写道
如果你不切开action的话
你怎么知道service层呢?
怎么知道model是怎么样子的呢?
一切都是在迷雾之后
被action+form所封装

action是控制器的一部分,他肯定会依赖view。比如struts action,他会依赖HttpResponse, HttpRequest这些类型,他还要从request得到请求参数,把输出文字放到response里面去,物理的和逻辑的依赖都是存在的。如果你把model融合到action中,model和view就分不开了。

form就是页面上的表单,在一些情况下他的属性恰好业务对象的属性一样,但是他根本不能作为代替model。道理很简单,界面上的内容不一定正好对应后台的业务对象。比如我要在界面上显示一个客户和他的最大的一笔订单,在界面上这是一个表单,但是在model层应该是两个关联的类:Customer和Order。

model本身是就应该是清晰的,他可以独立的装配,独立进行测试。不需要action+form为他提供封装。
13 楼 Y04069 2007-03-28  
个人觉得没有必要分的很清楚,只要保证良好的扩展性和维护性即可~~~
12 楼 阳光晒晒 2007-03-28  
如果你不切开action的话
你怎么知道service层呢?
怎么知道model是怎么样子的呢?
一切都是在迷雾之后
被action+form所封装


每个动作作为一个方法
几个方法组成一个模型
模型的属性存在form中

不是非要向原点切的蛋糕才叫一块蛋糕,#切的也叫一块蛋糕
只要有分割规则就可以作为模型化分规则

例子:
有个飞机 模型
你所说的是
Airplane
属性:
人数 max_person
载重 max_heigh
所在地 airport
动作:
上飞机:load
飞行   fly
下飞机 unload


在我说的model
Action:
以下为方法名
load
fly
unload
init
........

form:
以下为属性名
max_person
max_heigh
airport
pageno
maxpage
.......

把action+form就是一个model了只是业务分离的不清楚.而已
11 楼 lane_cn 2007-03-28  
阳光晒晒 写道
action 内封装了
业务模型
form内存储了
业务模型的属性值

不剖开看的话....
也应该是model了

PS:struts是mvc2并非mvc


也许我们口中的“model”不是一个东西。你能解释一下吗,举个例子?
10 楼 阳光晒晒 2007-03-28  
action 内封装了
业务模型
form内存储了
业务模型的属性值

不剖开看的话....
也应该是model了

PS:struts是mvc2并非mvc
9 楼 lane_cn 2007-03-28  
我用C#写过一个MVC架构的示例:
代码地址:http://www.cnblogs.com/Files/lane_cn/skii.zip
示例说明:
http://www.cnblogs.com/lane_cn/archive/2007/03/13/672628.html
这是一个窗体程序的MVC代码。
示例代码分为三个包:
1、AfricaTelecom:这是model
2、View:这里是视图
3、Action:控制器的主要部分

“action+form = model”这个是不对的,model是业务模型。
8 楼 dwangel 2007-03-28  
Struts的MVC是Web层上的MVC,不是初始的单机上的MVC模式,
以单机的MVC来理解会有一定偏差。

一本struts的书就是以普通mvc来解释struts的mvc,好像这本书还发行量大,造成误解也就难免了。

Web涉及到与服务器交互并非即时,有些东西不一样的。
没必要找在Web层上符合 单机mvc的框架。
7 楼 cozone_柯中 2007-03-27  
qinysong 写道
Lucas Lee 写道
Struts可以说只是借用了MVC的思想和概念。
完全对等不太可能。

是的,我就是要说明这个问题


问下,有完全对等MVC的框架吗?
6 楼 qinysong 2007-03-27  
Lucas Lee 写道
Struts可以说只是借用了MVC的思想和概念。
完全对等不太可能。

是的,我就是要说明这个问题
5 楼 LucasLee 2007-03-27  
Struts可以说只是借用了MVC的思想和概念。
完全对等不太可能。
4 楼 giscat 2007-03-27  
引用
刚才有一个关于Struts和MVC组件对应关系的帖子,现在好像被放入了新手区,关于这个问题记得以前有过激烈的讨论,可惜刚才我搜索一下没有找到想找的那篇,希望有谁找到能把链接发上来

  在入门讨论里
  http://www.iteye.com/topic/65589
3 楼 giscat 2007-03-27  
struts是有点不清不楚
  自己整一个,可以搞得小葱拌豆腐,一清2白
  人要靠自己丫
2 楼 qinysong 2007-03-27  
阳光晒晒 写道
action+form = model

form 只是对页面表单请求及显示数据的封装,在Struts中form还可以承担部分的数据校验逻辑,但在Spring中数据校验逻辑也被封装到了Validator中,所以form应该属于View
1 楼 阳光晒晒 2007-03-26  
action+form = model
actionservlet+struts-config.xml= controller
jsp+自定义标签=veiw

model与veiw可以分离编写(事实上没见过这么开发的)
之后用xml把这两边织在一起....

相关推荐

    全新mvc的升级 完全仿struts2

    对上一个mvc的升级,完全仿struts2,有利于更加深入的理解struts2,以及mvc模式

    struts2JAR包

    Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...

    struts2必须jar包

    Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...

    review.struts.zip

    Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...

    struts-2.3.16.1.zip

    Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。struts-2.3.16.1.zip就是struts2.3的一个版本...

    struts-2.3.16.3-all.zip

    Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...

    struts-2.3.15

    Struts2是一个基于MVC设计模式的Web应用框架,...Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品

    struts_2.5_API (CHM格式)

    Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...

    struts2-205

    struts2-2.5.5 最小开发包 可以用来练习!...Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。

    Struts2+Web常使用的功能经验笔记第1季

    Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。因为Struts 2和Struts 1有着太大的变化,...

    springmvc搭建教程(附带源码)

    本源码适合新手学习,简单易懂,它是一个典型的教科书式的mvc构架,而不像struts等都是变种或者不是完全基于mvc系统的框架,对于初学者或者想了解mvc的人来说我觉得 spring是最好的,它的实现就是教科书!...

    spring MVC 视频教程

    它是一个典型的教科书式的mvc构架,而不像struts等都是变种或者不是完全基于mvc系统的框架,对于初学者或者想了解mvc的人来说我觉得 spring是最好的,它的实现就是教科书!第二它和tapestry一样是一个纯正的servlet...

    Strut2核心JAR包.zip

    Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...

    宿舍管理系统

    Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...

    JavaServer Faces 2.0完全参考手册(JSF2.0中文版).part1

    使用定制的非用户界面组件来扩展JSF。管理安全、可访问性、国际化和本地化。学会使用Liferay的JSF团队领导开发的JSF和Portlet,Liferay是处于领导地位的JavaPortal开发商。 全面介绍JSF2.0、详述如何使用Ajax,以及...

    java面试题

    答:error是指错误,通常程序员不能通过代码来解决。底层环境或硬件问题。 exception是指异常,可以通过代码来解决的问题。 forward和redirect的区别? 答:forward是转发,浏览器跳转后不显示新的地址。 ...

    Spring面试题

    10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring的部分或全部 什么是DI机制? 依赖注入(Dependecy Injection)和控制反转(Inversion of Control)是同一个概念,具体的讲:当...

    JavaServer Faces 2.0完全参考手册(JSF2.0中文版) 1/2

    使用定制的非用户界面组件来扩展JSF。管理安全、可访问性、国际化和本地化。学会使用Liferay的JSF团队领导开发的JSF和Portlet,Liferay是处于领导地位的JavaPortal开发商。 全面介绍JSF2.0、详述如何使用Ajax,以及...

    Spring基础与快速入门

    首先业务逻辑不纯净,其次这些服务被很多业务逻辑反复使用,完全可以剥离出来做到复用。那么AOP就是这些问题的解决方案,我们可以把这些服务剥离出来形成一个“方面”,以期做到复用;然后将“方面”动态的插入到...

    JAVA自学之路

    如果遇到,暂时对于一些思路不能理解的同学,我一般都会劝告说,动手写,先写代码,量变会引起质变的。而这种质变的确发生过不少次。 提醒一句,要理解代码思路之后再跟着敲 ,背着敲,千万不要左边摆着别人的...

Global site tag (gtag.js) - Google Analytics