我在写了一个MVC,希望大家给点意见@

方小葱 发布于 2011/03/11 09:57
阅读 1K+
收藏 3

    过年前wo在写一个项目,由于想保持系统的简单,不想引入太多的包,所以没有用MVC,,没有用ORM...没有使用任何应该用的框架;可后来发现...好吧一段痛苦的经历,你懂的,往事不要再提@

过年的时候,在家闲着没事干,逛了一下社区,看了红薯老大发布的一些代码,于是一时冲动想写一个MVC,我用了两天的时间写出了第一个版本(0.1.0),简单的完成了MVC的一些必要的功能(当然这只是个玩具,也是悲剧的开始);我在这个版本中,我使用了一些第三方的包来完成必要工作,比如beanutils来对action属性的注入和类型转换,使用了COS来做文件上传等等!

--------------------------------------------华丽一割---------------------------------------------------

    接下来的一个礼拜我尝试着将Freemarker和Velocity等视图技术集成到了我的框架中,当然由于没有很好的测试,以及对这些视图技术只停留在一个比较浅显的认识,加上框架先天性的不足,可能实现的没有我预想那么完美,但是无论如何,它能工作了!

按照我三分钟热度的性格,原则上,以及理论上我应该到此为止了,剩下的应该是对原来匆忙写成的代码进行重构和测试,可问题发生了,beanutils不能很好的工作,好吧,继续我的悲剧,于是我又开始着手写一个类型转换器,以及一个Bean的"操作框架"用以对Bean属性的读写,很抱歉,由于急功近利,贪图多快好省,我没有使用"内省",而是直接"反射",哦,天哪@这又是我人生中一个不大不小的悲剧!我怎么能这么干呢?好吧,我确实这么干了@

    对于类型转换我是这样考虑的:

    1,便于扩展,而不影响已有的转换器(除非特别指定覆盖或者提示冲突),同时效率得高,用户可以实现自己的类型转换器,使用注解或者特定的接口对转换器提供上下文参数.

    2,类型转换器界限是确定的,我们只对特定类型进行某种规则的转换,如果用户需要将自定义的类型转换,可以,自己动手写一个,而不是万能转换器,万能意味着你可能会失控@而不利于代码的测试,个人比较喜欢"单一语意"的代码,能转换就转换,转换不了就抛出异常,而不是提供一种模棱两可,退而求其次的方法,我原来"万能类型转换"的思路是:将所有的类型转换成string,然后为类型转换器设计一个string->type的,如果转换不了就跟beanutils一样提供这个类型的默认值(当然这玩意儿也支持不使用默认值);

   事实上它到现在还可能是一个半拉子工程@因为我没法找到让我内心一阵欣喜的设计思路,然而我的耐心却已经崩溃了!

   好吧,淡定,我应该干点别的事情来冲淡这时的忧郁之情,挽救我崩溃的耐心

于是I18N功能就出现了,这源于类型转换中对不同情况需要转换成不同,比如:Date<->String,用户可能会需要根据"上下文"来选择一种比较合理方式来!

1,使用注解来标志或者声明资源文件,或者在找不到资源的请款下提供默认值

2,提供默认的资源命名方式,比如和接口相同,和Action名称相同..

3,提供getText()一样的方法来获得资源

4,提供GWT一样的,Constants/Messages接口,让用户只需要继承这个接口,很容易的获得常量以及格式化的后"消息";可以看一下:i18n3中的类,或者在test包下有几个示例(应该是可以运行的,别看文档,如果觉得这种方式可以,想深入了解,可以参考一下GWT i18n的文档),

5,提供一些jspTag

6,在为模板提供一些"获取消息的指令"

这可能又是一个半拉子工程;事实上,我为这个东西写了3个版本,所以为什么大家看到的包是i18n3.在back文件夹下有一个i18n,这个版本原来是可以运行的,但是它被我杯具掉了,为什么呢?我高估了Java资源文件的搜索方式了(以前只知道用,没有细究),原来这个实现可以更简单的,或者原来的设计需要重新编写资源文件查找方式!或许你已经厌烦了这些"吹嘘"出来的功能,别急,还有一个半拉子工程:validation,事实上单纯的对数据进行校验是一件比较简单的事情,问题在于:校验之后我们做什么?如果在发现用户输入的数据不符合校验规则,我们该怎么办?这个才是重点@为程序提供一个ErrorMessageStack,将错误的消息保存到里面然后返回"Input"?好吧,或许我们有"更好"的思路?比如提供一个Handler来处理这个问题?当然最关键问题是程序可能没有个一个Input视图?有问题嘛?当然,我忘了说了,Action不一定只返回一个"逻辑字符串"来控制视图的转向@他可以返回"任何东西",迷茫了?好吧,我也迷茫了@Action 的"逻辑字符串"可以很好的为Action和视图进行解耦,但是对于一些小型的应用,这种配置会显得比较繁琐,同时在Ajax泛滥的年代我们可能会使用JSON来传递数据,如何将"逻辑字符串"映射到JSON中去?OK,你可能会说sonplugin,好吧,我错了@有时间的话看一下吧?validation现在没有任何用户,怎么说呢?不是实现的问题,而是策略的问题,我们不知道如何为用户提供一种轻松应对抑郁的的百忧解!那就暂时放着吧@等哪天灵感大爆发的时候我们在来折腾@如果需要?还是乖乖的Struts2吧@我说了,框架先天不足,

出现的问题:

1,由于时间仓促,我没有做任何必要的和不必要的测试,我甚至都没有给这个框架取名字,也没有在Eclipse中新建一个工程,而是直接在原来只开了一个头的项目中写代码.导致的代码质量可能不是很高!甚至会有一些可以或者不可以预见的错误

2,MVC中没有使用类似ValueStack和Intercepter的东西(我个人认为这是Struts2的亮点,是比较优秀的设计)这是框架先天的缺陷,可能会导致框架的扩展性不是很好,或者一些很容易实现的功能复杂化!当然我最初的目标不是Struts2,我要的是一个简单到不能再简单的MVC框架@

3,AOP功能非常不实用

4,先入为主的性格让我对Struts2有莫名的"好感",所以,甚至,写着写着我发现自己可能是再实现一个S2的感觉,这个有悖于我的初衷,

5,写它过分随意,没办法,散漫惯了@(我不知道这是不是写开源软件的人一个通病!)

6,如果你说这是一个轮子,好吧,我承认@但是我听社区中某个童鞋讲了一句话:Java从来不缺少框架!S2有它的历史和发展思路,但这仅仅是属于S2 的,我也希望有我们的历史,哪怕这个历史比较屈辱,我们可以通过这个屈辱的历史走向光明!

7,我不想让他失控成为一个Struts2,我希望他尽量简单,给用户提供单一的行为方式,而不是,让用户来选择,可显然已经有点失控了@

接着:

等现在的功能可以,我准备在框架里嵌入一个脚本语言

我喜欢ONGL的语法,但是这玩意儿效率太低,最不能让我忍受的是她的源代码比我的还写的丑(所有的类放在一个包里,一个类几千行代码<JavaCC生成的语法分析器>,)我想MVEL是一个不错的选择!

如果可能,还会写一个Eclipse的插件,早先年搞过这东西,虽然现在忘了,但是搞明白插件要做什么之后应该还是没有问题的,对就这么干吧,

路很长,夜也很长!

文档写的狗屁不通,很多东西都没有说明,老实说我也不知道是怎么写的这个文档(机器翻译的应该都比这个强),如果你骂我能爽一点,好吧,但是可不可以爽完之后帮忙拾掇拾掇,写写漂亮,语句通顺内容充实就行?

如果你有耐心或者闲着无聊,还是看看代码吧,虽然也写得比较狗屁不通@

哦,对了,声明一点:我"盗用"了红薯老大之前做的Cache的封装,虽然没有很好的将它集成,先放在那边摆个样子吧@提醒一下自己我会想办法将它集成进去的,代码我没改,也没有测试,保留了红薯大哥名字的,如果出现问题,或者觉得代码丑,大家"可以找他麻烦"@

PS:我敢说他可能不及Struts2百分之一的好(甚至现在还无法部署到真正的项目中去),但是有一点我可以保证,他是中国人写的,我们可以交流,我希望大家能给一些意见,如果不嫌代码写的臭可以一起加入,改改代码,写写测试,写写文档之类的,提交一些....我希望他到1.0版本的时候可以正式运用到一些小的项目,

PPS:不要觉得写程序痛苦,把他当做一件喜欢做的事情,从中获得成就感@有益身心健康的@

PPPS:我有些烦了,先贴代码@吃饱没事儿干的童鞋可以检出来看看,代码在开发期间,所以很多类在eclipse中会有一个红叉叉,别惊慌,这是正常现象-_-,我保证他比你想象的会好一些@

http://kal.googlecode.com/svn/trunk/Project/

如果有什么想法或者想骂骂我之类的,可以给我发邮件:kanalun#qq.com(#->@,你懂的@),我想会第一时间回复你的@

加载中
0
麦麸子lee
麦麸子lee

是自己练技术吗?

0
方小葱
方小葱

引用来自#2楼“南宫傲”的帖子

是自己练技术吗?

准备以后放到项目中去

0
超级奶爸老谭
超级奶爸老谭

有轮子,就别折腾了。spring mvc不错的

0
方小葱
方小葱

引用来自#4楼“超级奶爸老谭!”的帖子

有轮子,就别折腾了。spring mvc不错的

好嘛,我就说嘛@但是人家的东西毕竟是人家的东西嘛,你要这么说>java什么框架没有?那为什么每年还会涌现一些新的东西?一样的功能可以有不同的实现,何况,我们可以通过这个起点走到别的路上去,走出自己的路.每个人喜欢的操作方式不一样,思维方式也不一样,别人用vi,记事本,有的人就喜欢用NB,EC?有的人觉得黑别人的电脑是一件很值得显摆的事情,但是我觉得技术是用来"造福人类的,而不是搞破坏的",起码的道德底线都不知道在哪儿何来的光荣?

0
方小葱
方小葱

个人认为,不会瞎折腾的程序员不是一个好程序员@如果混口饭吃,别的行当可能更容易@开家包子店一年都能挣个几十万,卖泡菜还能挣钱的?不是么?

0
方小葱
方小葱

你要说什么东西不错,确实,那我们只能停留在别人给我们什么我们就用什么的层次上!创新呢?你不了解创新需要自己的基础和历史@自己的轮子都没有你还指望造出一辆自主品牌的高级跑车嘛?

0
crazyhadoop
crazyhadoop

练练思想很不错

0
超级奶爸老谭
超级奶爸老谭

引用来自#6楼“方小葱”的帖子

个人认为,不会瞎折腾的程序员不是一个好程序员@如果混口饭吃,别的行当可能更容易@开家包子店一年都能挣个几十万,卖泡菜还能挣钱的?不是么?

 现在的程序员,往往不会从业务的角度去考虑自身的发展。使用Java 的框架,其实就是为了减轻程序员的编码量,用最简单的编码实现复杂的业务逻辑。如果要搞算法什么的,为什么要用Java?(并不是说算法不重要,而是应该更专注于业务)

每个人都有自己的看法,但希望楼主本身能够考虑使用框架的原意,也希望楼主梦想成真!

0
Appcrashes
Appcrashes

我之前花了三年时间写了一个框架

除了标签使用MVEL,其它都是自己编写的,包括基于注解的MVC,ORM(自己编写了JQL编译系统,用纯JAVA API写的)等

整个系统只有了一个第三方库就是MVEL(修改了部分代码)

成功运用于多家大型网站及大型公司

感兴趣的话,可以在网上搜索"Jxva Framework"

----------------------------

Jxva Framework is a lightly and quickly jee development framework
Easy to build, easy to study, easy to develop.

  • Based on Annotation MVC
  • Generic & Java Query Language DAO
  • Smart Jsp Tag Library
  • Automatic Code Generate Toolkit
  • Based on Pull Parse XML
  • Advance Performance Cache
  • More...
       Jxva Framework, is a open source resource integrated enterprise platform,based on hot swap function expansion,super lightweight,quick development, and doesn’t rely on any third party jee frameworks,has aimed to the international market in r&d, and combined lots of practical projects experiences that makes its products not only with good international generality also with the features of domestic business.
0
Appcrashes
Appcrashes

我支持楼主

另告其它人:

          你不写MVC,你就不知道Struts有多垃圾,OGNL有多慢,

          你不写ORM,你就不知道HQL原来还需要编译原理及深入的SQL知识

          你不写RBAC,你就不知道系统的权限原来是如此复杂

          你不写框架,你就好好的在旁边学习吧....

返回顶部
顶部