`
javatar
  • 浏览: 1680665 次
  • 性别: Icon_minigender_1
  • 来自: 杭州699号
社区版块
存档分类
最新评论

轻量级MVC标准

阅读更多
看到标题,估计有人就开始想吐了,没关系,你可以先吐完再看,现在MVC框架多如牛毛,没必要再重复发明轮子了,要声明的是,这里不是想要发明轮子,也没那个闲工夫去发明轮子,而是看到这么多MVC框架模样都差不多,想统一接口,减少迁移成本,Java世界里,最喜欢的就是定标准,然后就是一大堆的实现,估且这里也当一个标准来搞,纯属娱乐的标准。

注:下面的定义都是狭义的,用于限定本次要解决的问题域,你也可以定义你自己标准,这不是啥业界标准。

(一) 轻量级MVC定义:
1. 框架对应用无侵入,不依赖任何接口类
2. 框架零配置,零注解
3. 简单易用,易于理解,暂且不搞RESTful,免得复杂

(二) 轻量级MVC接口:
1. Controller采用setter注入请求参数,并支持层级注入,如:book.title.
2. Controller采用getter供给数据给View,在View中可直接取到相应属性值,如:${property}.
3. Controller采用任意非setter和getter函数处理请求。
4. Controller采用函数返回值控制跳转,只允许跳转到另一Controller,不允许一个Controller对应两个View.
5. Controller对Model的依赖采用setter自动装配,包括Model之间的依赖.
6. Session参数,如:loginUserId,也通过setter注入到Controller,如果有请求参数注入了loginUserId,也会被Session参数给覆盖.
7. View与Controller一对一,通过名称映射,并支持各种View模板类型扩展,比如:JSP, Velocity, FreeMarker, CommonTemplate等.
8. 没有Controller时,View也能执行,相当于隐式Controller。
9. 框架应提供COC接口,基于规则约定某个包名是model,某个包名是controller,某个目录是view,比如:com.company.module.controller,自动发现module,并以单例模式加载model,以原型模式加载controller。
总而言之,接口除了setter和getter,以及自动映射规则,什么都没有.

(三) 轻量级MVC访问:
http://主机名[:端口][/应用名]/模块名/控制器名/函数名.html[?参数名=参数值]
注:方括号代表可省

(四) 轻量级MVC实现:
符合以上接口的实现均可。

(五) 轻量级MVC优势:
业务逻辑不依赖任何框架,可以适配到任意框架而不影响业务代码,当旧的框架被淘汰,无人维护时,可以以最快的方式迁移到新的更稳定的框架.

理想是美好的,现实是残酷的,上面纯属个人想法,现实中困难多了,怀着美好愿景总是好的。
分享到:
评论
20 楼 天机老人 2009-05-13  
好有空玩玩nutz这个mvc!
19 楼 天机老人 2009-05-13  
我也来说说我用的spring mvc(基于注解)
目前玩web4j,比较讨厌他回归了sql这一点,不过可以用Hibernate实现(参考里提到了不推荐)。

(一) 轻量级MVC定义:
引用
1. 框架对应用无侵入,不依赖任何接口类

Controller就是javaBean,类名上注解@Controller。非常勉强的列入不依赖。 
引用
2. 框架零配置,零注解

配置为零点几(java Bean扫描还是得配置的,基于注解也得配置),使用注解----还是难逃配置与注解。
引用
3. 简单易用,易于理解,暂且不搞RESTful,免得复杂

比较符合。

(二) 轻量级MVC接口:
1. Controller采用setter注入请求参数,并支持层级注入,如:book.title.
@Resource方式注入
[private] BaseService baeService (无需写set)
引用
2. Controller采用getter供给数据给View,在View中可直接取到相应属性值,如:${property}.

Controller返回值,返回一个model或者domain即可。
引用
3. Controller采用任意非setter和getter函数处理请求。

没发现
引用
4. Controller采用函数返回值控制跳转,只允许跳转到另一Controller,不允许一个Controller对应两个View.

支持
引用
5. Controller对Model的依赖采用setter自动装配,包括Model之间的依赖.
支持
6. Session参数,如:loginUserId,也通过setter注入到Controller,如果有请求参数注入了loginUserId,也会被Session参数给覆盖.
支持
引用
7. View与Controller一对一,通过名称映射,并支持各种View模板类型扩展,比如:JSP, Velocity, FreeMarker, CommonTemplate等.

不支持
引用
8. 没有Controller时,View也能执行,相当于隐式Controller。

不支持
引用
9. 框架应提供COC接口,基于规则约定某个包名是model,某个包名是controller,某个目录是view,比如:com.company.module.controller,自动发现module,并以单例模式加载model,以原型模式加载controller。

不支持。但是我发现spring mvc已经到到了这个边缘,但是为何不做成这样,这一点让我很郁闷!
18 楼 wendong007 2009-05-11  
<div class="quote_title">jindw 写道<br>
</div>
<div class="quote_div">
<br>提两个扩展建议: 可以考虑增加一个新的注入方式。 参数注入。 比如,根据类型注入。 请求处理函数中带有 HttpServletRequest,就把当前请求懂得request对象传入。。。。 也可以考虑更具参数名称注入。这个好像mod_python上也有实现, 就是说,如果我有一个参数 :int pageSize,那么,他自动吧请求参数的【pageSize】给注入,<br>
</div>
<p><br>我之前写个一个MVC框架就是这么用的,不过遇到一个小问题:如果方法参数中有int等基本类型,而请求参数中又没有同名的参数,这个时候应该怎么注入呢,基本类型不能为NULL,0可能又会有特殊的含义,用包装类可以解决这个问题,不过总觉得有些别扭。<br></p>
<div class="quote_title">hatedance 写道</div>
<div class="quote_div">
<br>LZ的这个idea我以前尝试过,很容易基于反射就能实现了。虽然少了一层url到controler映射配置文件,但是总觉得不安,代码结构都让用户一览无遗了。也许只是心理问题。<br>
</div>
<p><br>这些倒不是什么问题,这个我也实现过,不过这个功能看起来很好,其实灵活性很差,某些场景下还会带来很多麻烦,LZ好像是阿里的吧,公司内部框架不用太多考虑通用性的问题,这样还没什么问题,但是都说到制定标准了,这样就有点说不过去了吧,至少也应该提供个配置路由的功能</p>
<p> </p>
<p>至于前面说的侵入性的问题,如果是制定标准的话,根本不存在所谓的侵入性问题,依赖于某个实现才算是侵入性,所以没必要追求不依赖任何接口、类</p>
<p> </p>
17 楼 javatar 2009-05-11  
whaosoft 写道

1. 框架对应用无侵入,不依赖任何接口类 2. 框架零配置,零注解 ?????难道不是这样就不是轻量级了吗???

这里是狭义的定义,每个人都可以有自己的定义。

neptune 写道

还是不要再搞了,今天你有一个好的想法,也按这个做了。明天,例如:spring出了一个新的mvc框架,和你想的差不多,而且有些地方更好,你会选择那个呀。现实点,维护不起的,除了你是一个大公司!!!

如果Spring实现了同样的功能,并且更稳定,因为接口不依赖框架,直接作一个COC适配,就直接用Spring了,业务代码不变。

jindw 写道

提两个扩展建议: 可以考虑增加一个新的注入方式。 参数注入。 比如,根据类型注入。 请求处理函数中带有 HttpServletRequest,就把当前请求懂得request对象传入。。。。 也可以考虑更具参数名称注入。这个好像mod_python上也有实现, 就是说,如果我有一个参数 :int pageSize,那么,他自动吧请求参数的【pageSize】给注入,

呵呵,细节再考虑,我只是大概的瞎想想,但HttpServletRequest最好不用被业务代码所依赖。

hatedance 写道

LZ的这个idea我以前尝试过,很容易基于反射就能实现了。虽然少了一层url到controler映射配置文件,但是总觉得不安,代码结构都让用户一览无遗了。也许只是心理问题。

呵呵,配置文件通常也是一对一的,有些配置很无聊的。
16 楼 hatedance 2009-05-11  
javatar 写道

...
http://主机名[:端口][/应用名]/模块名/控制器名/函数名.html[?参数名=参数值]
...


LZ的这个idea我以前尝试过,很容易基于反射就能实现了。虽然少了一层url到controler映射配置文件,但是总觉得不安,代码结构都让用户一览无遗了。也许只是心理问题。
15 楼 jindw 2009-05-11  
javatar 写道

1. Controller采用setter注入请求参数,并支持层级注入,如:book.title.
2. Controller采用getter供给数据给View,在View中可直接取到相应属性值,如:${property}.
3. Controller采用任意非setter和getter函数处理请求。



提两个扩展建议:

可以考虑增加一个新的注入方式。
参数注入。

比如,根据类型注入。
请求处理函数中带有 HttpServletRequest,就把当前请求懂得request对象传入。。。。

也可以考虑更具参数名称注入。这个好像mod_python上也有实现,


就是说,如果我有一个参数 :int pageSize,那么,他自动吧请求参数的【pageSize】给注入,
14 楼 neptune 2009-05-11  
还是不要再搞了,今天你有一个好的想法,也按这个做了。明天,例如:spring出了一个新的mvc框架,和你想的差不多,而且有些地方更好,你会选择那个呀。

现实点,维护不起的,除了你是一个大公司!!!
13 楼 kennethlin 2009-05-11  
grails可以实现LZ所说的COC
12 楼 esanone 2009-05-10  
kjj 写道
别搞什么mvc 标准了,都是人家创意触发了你的思维,怎么看也逃不出人家的圈圈,mvc基本也就那样了!!

同意这此兄才的说法!
11 楼 whaosoft 2009-05-10  
1. 框架对应用无侵入,不依赖任何接口类
2. 框架零配置,零注解

?????难道不是这样就不是轻量级了吗???
10 楼 zozoh 2009-05-10  
javatar 写道
TO: zozoh
上面的接口是采用原型模式的,Controller相当于命令模式中的命令,自身持有上下文状态,倾向于Martin的充血模型,WebWork, Struts2, Seam等采用该方式。你的nutz是采用单例模式的,Controller相当于前端服务域,上下文状态由参数传递,倾向于Eric的领域服务模型,类似的有Struts1, SpringMVC等,但你的nutz不同于其它MVC,函数返回值没有用作页面流控制,而是以数据为中心,这样便于资源多重表述渲染,很不错,感谢分享。


没错,最初的设想是这样的,但是现在的 Nutz 更加灵活了:
1. Nutz 的 Controller 有一个实现叫做 Action,也是个抽象类, 当你的命令继承自 Action 的时候,它每次被调用都会被重新创建并充血
2. Nutz 的 Controller 的配置基于 Nutz.Ioc 这个注入框架,任何 Controller 如果 singleton 被声明为 false,那么它也会被重新创建,不是单例。
3. 任何 Controller 可以返回三种对象,
   1) 另外一个 Controller ,那么框架会执行这个 controller,相当于动作链模式
   2) 某个 View ,框架会停止执行后续的 controller,直接渲染这个View,然后返回
   3) 随便一个 Object,那么框架会将这个对象记录在 request 里面,以备后续的 View 使用。

所以, Nutz 的 MVC 框架,你可以同时使用单例模式和充血模式,这个类似于 Spring 的 MVC ,可以使用普通 Controller 和 ThrowableController 一样。 并且它的返回值又不局限于一个 View
9 楼 javatar 2009-05-09  
TO: zozoh
上面的接口是采用原型模式的,Controller相当于命令模式中的命令,自身持有上下文状态,倾向于Martin的充血模型,WebWork, Struts2, Seam等采用该方式。你的nutz是采用单例模式的,Controller相当于前端服务域,上下文状态由参数传递,倾向于Eric的领域服务模型,类似的有Struts1, SpringMVC等,但你的nutz不同于其它MVC,函数返回值没有用作页面流控制,而是以数据为中心,这样便于资源多重表述渲染,很不错,感谢分享。
8 楼 zozoh 2009-05-08  
呵呵,忍不住和 Nutz框架 比较一下:

引用
1. Controller采用setter注入请求参数,并支持层级注入,如:book.title.

如果没有 getter 和 setter 也能注入到 Controller 里,但是不支持层级
引用
2. Controller采用getter供给数据给View,在View中可直接取到相应属性值,如:${property}.

将 Controller 的返回设在 Request 里,View 如果是 JSP 可以直接拿到,如果是 JsonView ,直接返回 Json 字符串。
引用
3. Controller采用任意非setter和getter函数处理请求。

侵入式的要求 Controller 实现 Controller 接口
引用
4. Controller采用函数返回值控制跳转,只允许跳转到另一Controller,不允许一个Controller对应两个View.

Controller 可以返回另外一个 Controller 也可以是个View, 也可以是随便什么对象,这个对象会被后续的 View 使用 (通过放在 request 属性里)
引用
5. Controller对Model的依赖采用setter自动装配,包括Model之间的依赖.

符合
引用

6. Session参数,如:loginUserId,也通过setter注入到Controller,如果有请求参数注入了loginUserId,也会被Session参数给覆盖.

不符合
引用
7. View与Controller一对一,通过名称映射,并支持各种View模板类型扩展,比如:JSP, Velocity, FreeMarker, CommonTemplate等.

符合
引用
8. 没有Controller时,View也能执行,相当于隐式Controller。

符合
引用
9. 框架应提供COC接口,基于规则约定某个包名是model,某个包名是controller,某个目录是view,比如:com.company.module.controller,自动发现module,并以单例模式加载model,以原型模式加载 controller。总而言之,接口除了setter和getter,以及自动映射规则,什么都没有.

Nutz 的 MVC  提供了一个 MvcSupport 接口,以及一个默认实现。 默认实现是使用 Nutz.Ioc 框架来为 Controller 注入相关的 Service 和参数。 当然也可以作一个基于上述约定的实现。并且这个实现应该可以支持LZ从1-8 大部分需求。比如要求用一个 POJO 作为 Controllor 等。

总之,LZ基于URL做映射的想法和我以前的一个框架差不多,我现在的框架更灵活一些,不过还是很欣赏搂主这种思路滴~~~~
7 楼 yananay 2009-05-08  
目前来说 rails 的方式是最方便的,甚至连 php 也已经开始模仿。
java 是麻烦了点,呵呵。不过熟练了也就那么回事,一个mvc,也就是控制一下流程,还能干多大的事呢?

至于 session 那个,注入到controller也不好,还是用一个session scope 的对象来管理好。

-------------------------------------
另外发到 ct mail group 那个问题再看一下?
6 楼 javatar 2009-05-08  
kjj 写道

别搞什么mvc 标准了,都是人家创意触发了你的思维,怎么看也逃不出人家的圈圈,mvc基本也就那样了!!

是的,就是因为MVC都这模样,才抽取最小交集接口,本来就没什么创意,呵呵。

stworthy 写道

有点RAILS和ASP.NET MVC的影子

像谁都没关系,只是因为迁移了一个应用,很麻烦,有感而发。

unsid 写道

印象中就是摒弃领域层

没有摒弃领域层,Service, Domain, DAO等,都是Model的一部分。
5 楼 unsid 2009-05-08  
印象中就是摒弃领域层
4 楼 stworthy 2009-05-08  
有点RAILS和ASP.NET MVC的影子
3 楼 kjj 2009-05-07  
别搞什么mvc 标准了,都是人家创意触发了你的思维,怎么看也逃不出人家的圈圈,mvc基本也就那样了!!
2 楼 javatar 2009-05-07  
wangxin0072000 写道

坏消息是: 我们都失业了。

呵呵,有点恺人忧天了,没有人会失业的,世上没有哪个人只会coding,其它什么都不会干的,不需要coding的时候,自然有其它活干。
wangxin0072000 写道

JVM上跑的都是各种DSL

DSL多了,复杂度更高,活更多了。
1 楼 wangxin0072000 2009-05-07  
最后一句话比较实际。醒醒吧。别做梦了。也许再过两年Java就没有了,JVM上跑的都是各种DSL,开发都是一站式的。Oracle给前台也定个标准。
这时候,好消息是:
基本表达流畅,思路清晰的人都能写出可读性极高的代码。那时候,什么设计模式,什么MVC都么有了。
坏消息是:
我们都失业了。

相关推荐

    phpscup 轻量级企业建站系统 v1.8.2 UTF8 正式版.rar

    系统构架:PHPSCUP拥有自己的MVC构架(标准的MVC三层构架且是轻量级MVC构架,php源码与静态网页彻底分离开来,这样设计师就可以很快的完全更改界面),此构架大量使用缓存技术,从而是系统运行加快,且显示层自定义了...

    phpscup轻量级cms系统 v1.1 beta GBK.rar

    系统构架:PHPSCUP拥有自己的MVC构架(标准的MVC三层构架且是轻量级MVC构架,php源码与静态网页彻底分离开来,这样设计师就可以很快的完全更改界面),此构架大量使用缓存技术,从而是系统运行加快,且显示层自定义了...

    uIP:一种用在8位嵌入式系统中的轻量级的TCP/IP协议栈

    UIP(User Interface Process Application Block)是微软社区开发的众多Application Block中的其中之一,它... uIP:一种用在8位嵌入式系统中的轻量级的TCP/IP协议栈,仅需很少的ROM和几百B的RAM,很适合嵌入式系统应用。

    puremvc-csharp-standard-framework:用于C#的PureMVC标准框架

    PureMVC是一个轻量级框架,用于基于经典的“设计元模式创建应用程序。 这是语言的特定实现。 它不支持,因为它使用作为核心角色,而不是在使用版本。 Nuget安装 dotnet add package PureMVC 平台/技术 状态 量产- ...

    OwOFrame:一个非常轻量级PHP MVC框架

    OwOFrame 基于 MVC (Model-Views-Controller) 模式开发, 框架的制定标准借鉴了 ThinkPHP 和 Laravel(框架太大了), 因此有部分方法的命名规则看起来与其有相似之处. 此项目仅为我个人的练习项目.如果您觉得本项目对...

    totallyjs:Totallyjs是一个轻量级,动态,前端MVC框架,旨在与RESTful Web界面进行交互

    #TotallyJS Totallyjs是一个轻量级的,动态的,前端MVC框架,旨在与RESTful Web界面进行交互。 完全允许开发人员仅使用javascript语言来定义其应用程序的所有部分。 可以使用Totally模板引擎定义模板,该引擎可实现...

    pureMVC_API

    Pure MVC是在基于模型、视图和控制器MVC模式建立的一个轻量级的应用框架,这种开源框架是免费的,它最初是执行的ActionScript 3语言使用的Adobe Flex、Flash和AIR,现在已经移植到几乎所有主要的发展平台,目前支持...

    使用PureMVC构建FLASH网站

    PureMVC是在基于模型、视图和控制器MVC模式建立的一个轻量级的应用框架,这种开源框架是免费的,它最初是执行的ActionScript 3语言使用的Adobe Flex、Flash和AIR,现在已经移植到几乎所有主要的发展平台,目前支持两...

    SAEA:SAEA.Socket是基于dotnet标准2.0的高性能IOCP框架TCP; Src包含其应用程序测试方案,例如websocket,rpc,redis驱动程序,MVC WebAPI,轻量级消息服务器,超大文件传输等。SAEA.Socket是一个高性能IOCP框架的TCP,基于dotnet standard 2.0; Src中包含其应用测试场景,例如websocket,rpc,redis驱动,MVC WebAPI,轻量级消息服务器,超大文件传输等

    SAEA.Socket是基于dotnet标准2.0的IOCP高性能套接字网络框架; SRC包含其使用场景,例如大文件传输,websocket客户端和服务器,高性能消息队列,RPC,redis驱动程序,httpserver,mqtt,MVC,DNS,消息服务器等 ...

    用WCFWebAPI在MVC3.0下实现REST

    就web service而言,REST要比SOAP(SOAP是标准,不是风格)轻量得多,容易得多。最初开始接触web service的时候,所有的材料上来就是一大堆的名词,SOAP, WSDL,看得头都要大了,后来提出来的REST就容易理解得多,...

    framework:一个轻量级PHP框架

    #CrossPHP 简洁的开发框架# MVC,视图Layer布局,灵活的Module,注释配置,智能路由别名,PSR标准, PHP7.2+ 官方网站: 文档地址: 欢迎加入QQ群120801063

    pure mvc介绍

    Pure MVC是在基于模型、视图和控制器MVC模式建立的一个轻量级的应用框架,这种开源框架是免费的,它最初是执行的ActionScript 3语言使用的Adobe Flex、Flash和AIR,现在已经移植到几乎所有主要的发展平台,目前支持...

    HerosPHP(PHP MVC开发框架) v3.0.1.zip

    HerosPHP是一个免费开源的,快速、优雅的面向对象的 轻量级PHP MVC开发框架。使用她你能够快速的搭建简洁,易于扩展的web应用。 Herosphp特点 1、部署简单,高开发效率并且高性能 2、框架简单实用,傻瓜式开发,...

    Flex之PurMVC

    PureMVC是在基于模型,视图和控制器MVC模式建立的一个轻量级的应用框架,而且是免费的,它最初是执行的ActionScript 3语言使用的Adobe Flex、Flash和AIR,现在已经移植到几乎所有主要的发展平台。目前支持两个版本...

    StartBBS轻量开源社区 V1.0.3.zip

    StartBBS(起点开源社区系统)是一个基于PHP MySQL开发的新型社区系统,她轻量小巧, 简单易用,强大高效的开源论坛系统。又简称”SB(烧饼)”, 采用MVC框架开发,前台UI采用流式响应式设计,可以适应各种设备浏览。 ...

    Helium:Helium 是一个 PHP MVC 框架-开源

    Helium 是一个轻量级的 PHP MVC 框架,旨在安装无痛、使用简单、高度可扩展和可扩展。 它是为标准 LAMP 堆栈构建的,可从命令行安装和配置。 从命令行获取框架: - wget ...

    无垠式代码生成器SimpleJEE版 1.0.1 Ada

    这是最轻量级的代码生成器,生成物只有大约6.5兆。 采用Servlet,JSP, JSON, JQuery等简单技术实现,是标准的Model2的MVC设计模式的架构。 程序员的瑞士军刀。是喜欢使用低配服务器的程序员和运维人员的最佳选择。 这...

    免费Spring+SpringMVC+Mybatis框架整合例子(SSM)支持跨域

    2.Spring是一个开源框架,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,还能更好的让其他框架整合。 3.Spring MVC框架是有一个MVC框架,通过实现Model-View-Controller模式来很好地将数据、...

    无垠式代码生成器SimpleJEE版 1.0.2 Ada

    这是最轻量级的代码生成器,生成物只有大约6.5兆。 采用Servlet,JSP, JSON, JQuery等简单技术实现,是标准的Model2的MVC设计模式的架构。 程序员的瑞士军刀。是喜欢使用低配服务器的程序员和运维人员的最佳选择。 这...

    ThinkPHP 3.1.2 - PHP的开发框架MVC - 含Core,Extend,Example

    ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架, 遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而 诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持...

Global site tag (gtag.js) - Google Analytics