讨论贴,关于开发一个MVC框架。

golden24kcn 2010-04-14 10:59:46


目前我的做的项目,基本上是一个页面、一个业务类、一个类似hibernate的数据库持久层的这种结构。

有想法做一个类似于spring和struts的清晰的MVC模式的框架,当然,目的是提高开发质量和水准,spring太复杂了,做不了那么大,目前有想法如下:

1、建立parameter对象,用于收集view层用户请求的参数,其中包括一个command字串。

2、建立return对象,用于收集反馈给view层的处理结果,并交给view进行展示。

3、建立一个ApplicationService,提供request的方法,用于接收parameter,将返回return。

4、一个ioc注入器,将所有业务类实例化。

5、一个xml配置文件,用于描述每个业务类所在的程序集、类名、方法名、参数、返回值,并对每个方法都做一个command的key,对应前面提到的parameter对象的command。

6、一个execute,用于接收ApplicationService请求中发过来的parameter,并根据command及xml中的配置调用指定业务方法,取得返回值,封装为return对象,返回给applicationService,由其交给view。



该框架目的:

1、MVC,其实主要是分离view和pojo的关系,因为我所用的orm框架生成的pojo对象就是一个数据库的映像,我不希望做view的程序员可以知道数据库中的结构和关系。

2、业务可配置化,这点比较虚,其实怎么着也是得写点代码的。

3、没想好.....


目前可预见的问题:

xml的配置太复杂,可能搞得大家不喜欢用它。


请大家给提供宝贵意见,一起讨论,给我些指点。欢迎板砖鸡蛋。

注:我也是做java的,但这个要用C#写,原贴也是在.net版发的,无耐没人回复。
...全文
152 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
tomcat520 2011-01-03
  • 打赏
  • 举报
回复
good job!
golden24kcn 2010-04-28
  • 打赏
  • 举报
回复
up again
golden24kcn 2010-04-27
  • 打赏
  • 举报
回复
我感觉我应该开发一个更高层次的东西,着眼于2012年,如果能引导地球灭亡就最好了。
golden24kcn 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 efg00 的回复:]
我不知道自己的理解是否正确。
疑点二:[业务处理]
其中return的值完全可以返回为object。然后使用类似于struts1的类型转换器来搞定。当然struts1采用的类型转换器是commonutils的单向类型转换器,楼主可以学习下sturts2的双向类型转换器机制搞搞。
还有个问题,楼主担心的是xml配置太复杂,那么我建议你使用注解的方式,这种方式开始流行了。你的框架不要开发出来……
[/Quote]

感谢您的建议!呵呵,我感觉我要做的这个东西已经是02、03年时讨论的东西了。
golden24kcn 2010-04-27
  • 打赏
  • 举报
回复
UP
Leo55888 2010-04-27
  • 打赏
  • 举报
回复
求一些牛人进一个JAVA技术交流高级群,群目前处于发展趋势,希望可以来些牛人照顾下里面的新人 谢谢了 群号8319449 简介:有你将会更精彩
蹦跑中的蜗牛 2010-04-26
  • 打赏
  • 举报
回复
我不知道自己的理解是否正确。
疑点二:[业务处理]
其中return的值完全可以返回为object。然后使用类似于struts1的类型转换器来搞定。当然struts1采用的类型转换器是commonutils的单向类型转换器,楼主可以学习下sturts2的双向类型转换器机制搞搞。
还有个问题,楼主担心的是xml配置太复杂,那么我建议你使用注解的方式,这种方式开始流行了。你的框架不要开发出来就过时很久了哈。
smi_ling 2010-04-26
  • 打赏
  • 举报
回复
学习了!
justwalking 2010-04-26
  • 打赏
  • 举报
回复
学习。。。
golden24kcn 2010-04-26
  • 打赏
  • 举报
回复
再次感觉楼上诸位的回贴,希望能和各位继续探讨交流,我的QQ:286661494
golden24kcn 2010-04-26
  • 打赏
  • 举报
回复
看了楼上诸位的回复,深感自己的浅薄!

---------------------
首先回复[kurama_mail]

的确像您说的一样,是在重复发明轮子。小弟我入行也有些年头了,可是只有嘴上的水平渐涨,所以愤下决心要提高一下水平。最近看了一些关于DDD方面的东西,而C#下正没有这样的框架,所以想做一个为自己所用,并提高一下设计能力。不过DDD至今看得比较含混,所以想不如做个Spring类似的。

----------------------
回复:[cool_scorpion]

疑问1、如果您不说,我真没想到这个问题,因为以前看过一个JAVA下的框架,对每个事件都设置一个event_id,就是据此才有今天的这个想法,想想的确是有不要C层的嫌疑,我本意是想设计一种消息处理机制的,由一个消息接入转发的层搁在V和M之间,通过消息key,去xml里判断,应该把调用哪个m类。不知道此外还有其它方式吗?请指教下。

疑问2、针对一个表生成一个pojo对象,以及访问该pojo每个字段的key对象(汗,也许应该叫另一个pojo对象)。
如:
class t_test
{
public string id{get; set;}
public string name{get; set;}
}

class t_test_key
{
public string Test_ID
{
return "id";
}

public string Test_Name
{
return "name";
}
}

然后在页面的parameter里这么写

inputclass.parameter.add(t_test_key.Test_ID, "123");
inputclass.parameter.add(t_test_key.Test_Name, "tom");

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

回复:[wolfKingTy]

疑问1参数封装:
不妨给您看看我的代码,只是一个初步想法,很不成熟。
public class InputClass
{
public string From { get;set;}
public string Command { get;set;}
public List<string> Parameter {get;set;}
}

return类与此相同

疑点2返回值:
也没想太好,说个想法请指教一下。
前面说了,用command消息方式,姑且不说它是否完全符合MVC规范。用户在编制command消息的这个xml时,假设格式如下:
<?xml version="1.0" encoding="utf-8" ?>
<classmap>
<assembly name = "TestLib.dll" path = "D:\CSDNProject\QuickRemoing\QuickRemoting\TestLib\bin\Debug\">

<class name = "TestLib.TestClass1">

<method key = "test.add" method_name = "doInsert" input_type="T_Test" return_type="int" return_name = "result.test.add">
<return value="1" message="成功" />
<return value="0" message="失败" />
<return value="-1" message="同名test已经存在,请更改其它test名" />
</method>

<method key = "test.query" method_name = "getList" input_type="T_Test" return_type="ArrayList" return_name = "result.test.query">
<return />
</method>

</class>

</assembly>
</classmap>

根据以上这个xml,用户在调用TestClass1的add或query方法时,可能写如下代码

InputClass input = new InputClass();
inputclass.command = Classmap.test.add;
....................
ArrayList lst = (ArrayList)returnclass.result[ResultKey.test.query];

疑点3[持久化]
已经写了一个类似于hibernate的持久层,只是功能上简陋得多,不过暂时还可以用。

疑点四[事务,日志,等处理]
还没想过那么多呢,关于事务和日志我都不知道要处理哪些东西呢。


kurama_mail 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cool_scorpion 的回复:]
支持这种比较有技术含量的活,虽然有重复发明轮子的倾向。

有以下疑问:
1.页面直接包含command字串?似乎楼主不要C层了,页面直接调用M层的方法。有点像JSP+Bean的开发模式,这样JSP页面和业务逻辑耦合一起了。M层要返回那个页面都要写在代码里?

2.楼主说目的是分离view和pojo的关系,不希望做view的程序员可以知道数据库中的结构和关系,那就必须pojo对象不暴露给程……
[/Quote]

1:通过页面直接送出目标页参数(将页面的开发完全与控制层剥离)
2:服务层使用BO并且只返回BO或其相关对象,将vo的使用范围限制在DAO

我不是楼主,我也反对建立这样一个框架,因为我相信你很难保证偶合松散且灵活.
xuexijava 2010-04-14
  • 打赏
  • 举报
回复
Mark。。。。。。。。。。。。。。
小霍夫 2010-04-14
  • 打赏
  • 举报
回复
仔细看过lz的贴!大概知道你的想法!

提出几点疑问!

struts1.x 核心是在sevlet上进行封装的 ,strut2.x 是核心是利用filter进行封装!

那么我想

疑点一:[参数封装]

你的parameter对象 页面参数你打算用什么方式进行封装! 简单说就是请求参数怎么样去进入parameter对象!

疑点二:[业务处理]

你打算用applicationService [加载配置文件,生成相应的业务实体,这倒不是问题,反射完全可以搞定,加上上工厂设计模式,估计这里很ok]

Return applicationService(Parameter);

返回值有 string Integer List 等 。。。。。 Retrun 对象你又打算怎么设计呢?

疑点三[持久化]

上面没有提到你持久化打算用什么方式? jdbc 自己封装,还是用 hibernate


疑点四[事务,日志,等处理]

spring给我们很方便的解决了事务,日志等问题! 我很想知道lz的解决方法!

我的相法:
1: 如果你用jdbc 完全可以做到 applicationService 动态化理生成业务实体,在前后织入事务
详细点说就是 让 connection设置自动提交为false 然后在织入前后打开和 的交!
2: 如你用hibernate 没做过类似的封装,这个我就不知道!估计也行!不然spring怎么就做到


之前我也有类似的想法:qq 330765472 mail tytyler@163.com
希望能有lz交流!..


cool_scorpion 2010-04-14
  • 打赏
  • 举报
回复
支持这种比较有技术含量的活,虽然有重复发明轮子的倾向。

有以下疑问:
1.页面直接包含command字串?似乎楼主不要C层了,页面直接调用M层的方法。有点像JSP+Bean的开发模式,这样JSP页面和业务逻辑耦合一起了。M层要返回那个页面都要写在代码里?

2.楼主说目的是分离view和pojo的关系,不希望做view的程序员可以知道数据库中的结构和关系,那就必须pojo对象不暴露给程序员,连setter和getter方法都不行。这个不知楼主如何实现。

本人未开发过框架,以上问题可能因未了解lz意思而引发的。不对之处,请原谅。
kurama_mail 2010-04-14
  • 打赏
  • 举报
回复
顺带一说 springMVC 就完全符合你的要求了
2010-04-14
  • 打赏
  • 举报
回复
开发一个MVC框架。。

LZ 强淫也。
kurama_mail 2010-04-14
  • 打赏
  • 举报
回复
知道什么叫重复造轮子吗 - -
spring的使用并不复杂,尤其在注解注入上.只是理解为什么它能做到那样需要花点时间.
我使用过spring的MVC其实感觉还是可以
xihui912 2010-04-14
  • 打赏
  • 举报
回复
如果不是很有必要
让他先停留在想法上吧 
xiaohuanjie 2010-04-14
  • 打赏
  • 举报
回复

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧