论坛首页 Java企业应用论坛

轻量级MVC标准

浏览 11671 次
精华帖 (1) :: 良好帖 (4) :: 新手帖 (0) :: 隐藏帖 (6)
作者 正文
   发表时间: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
0 请登录后投票
   发表时间:2009-05-10  
1. 框架对应用无侵入,不依赖任何接口类
2. 框架零配置,零注解

?????难道不是这样就不是轻量级了吗???
0 请登录后投票
   发表时间:2009-05-10  
kjj 写道
别搞什么mvc 标准了,都是人家创意触发了你的思维,怎么看也逃不出人家的圈圈,mvc基本也就那样了!!

同意这此兄才的说法!
0 请登录后投票
   发表时间:2009-05-11  
grails可以实现LZ所说的COC
0 请登录后投票
   发表时间:2009-05-11  
还是不要再搞了,今天你有一个好的想法,也按这个做了。明天,例如:spring出了一个新的mvc框架,和你想的差不多,而且有些地方更好,你会选择那个呀。

现实点,维护不起的,除了你是一个大公司!!!
0 请登录后投票
   发表时间: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】给注入,
0 请登录后投票
   发表时间:2009-05-11  
javatar 写道

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


LZ的这个idea我以前尝试过,很容易基于反射就能实现了。虽然少了一层url到controler映射配置文件,但是总觉得不安,代码结构都让用户一览无遗了。也许只是心理问题。
0 请登录后投票
   发表时间: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映射配置文件,但是总觉得不安,代码结构都让用户一览无遗了。也许只是心理问题。

呵呵,配置文件通常也是一对一的,有些配置很无聊的。
0 请登录后投票
   发表时间:2009-05-11  
jindw 写道

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


我之前写个一个MVC框架就是这么用的,不过遇到一个小问题:如果方法参数中有int等基本类型,而请求参数中又没有同名的参数,这个时候应该怎么注入呢,基本类型不能为NULL,0可能又会有特殊的含义,用包装类可以解决这个问题,不过总觉得有些别扭。

hatedance 写道

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


这些倒不是什么问题,这个我也实现过,不过这个功能看起来很好,其实灵活性很差,某些场景下还会带来很多麻烦,LZ好像是阿里的吧,公司内部框架不用太多考虑通用性的问题,这样还没什么问题,但是都说到制定标准了,这样就有点说不过去了吧,至少也应该提供个配置路由的功能

 

至于前面说的侵入性的问题,如果是制定标准的话,根本不存在所谓的侵入性问题,依赖于某个实现才算是侵入性,所以没必要追求不依赖任何接口、类

 

0 请登录后投票
   发表时间:2009-05-13   最后修改: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已经到到了这个边缘,但是为何不做成这样,这一点让我很郁闷!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics