`
zh_harry
  • 浏览: 99695 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
877aca81-daac-33c8-8bf9-3a886cebc6c3
自己动手写java 框架
浏览量:27325
社区版块
存档分类
最新评论

疯子在思考之自己动手写MVC

    博客分类:
  • JAVA
阅读更多
MVC-1
http://lizhizhang.iteye.com/blog/1912005
MVC-2
http://lizhizhang.iteye.com/blog/1913546
自己动手写MVC3,前两篇我们分析了MVC的基础,在这里大家对main函数有争论,接下来会有java多线程的文章,与大家分享。(这里会略带一些tomcat main函数的内容)。
第二篇介绍了为什么要用MVC以及MVC的概念,即什么是MVC。
通过以上的了解,我个人认为,对于开发者来讲,MVC的filter即我们在web.xml中配置的拦截器是不重要的,框架为我们写好了,我们做的事情就是配置一下就可以了,而我们更关注具体的业务逻辑和VIEW,而如果我们自己写一个MVC那么,我觉得关注点就是开发人员不关心的那部分。即filter。业务逻辑和VIEW要留给开发人员自己实现。
那么filter中具体要实现哪些功能呢?

1、action方法映射
2、拦截器
3、参数注入
4、模型驱动(模型参数注入)
5、路由跳转
6、action方法的执行
参考struts及spring mvc其实有两种实现方法,对比而言,spring mvc的方法更简单效率更高。

这里附参数注入代码
private Object[] actionIoc(ServletRequest request, ActionEntity actionEntity) {
		// 参数名称列表
		List<String> parameterList = actionEntity.getParameterNameList();
		Class<?>[] parameterClass = actionEntity.getMethod()
				.getParameterTypes();
		BeanFactory beanFactory = BeanFactory.getInstance();
		// 参数列表
		Object[] args = new Object[parameterList.size()];
		for (int i = 0; i < parameterList.size(); i++) {
			String parameterName = parameterList.get(i);
			// 如果是基本数据类型
			if (parameterClass[i].equals(String.class)) {
				args[i] = request.getParameter(parameterName);
			} else {
				Object entity = null;
				try {
					entity = parameterClass[i].newInstance();
				} catch (Exception e) {
					Log.getInstance().error(e);
					return null;
				}
				MethodAccessor methodAccessor = beanFactory
						.getProxyBean(parameterClass[i].getSimpleName());
				Method[] methods = parameterClass[i].getMethods();
				for (Method method : methods) {
					if (method.getName().startsWith("set")) {
						String parameterName4Request = parameterName
								+ "."
								+ StringUtil.setFirstByteLowerCase(method
										.getName().substring(3));
						methodAccessor.set(entity, method.getName(),
								request.getParameter(parameterName4Request));
					}
				}
				args[i] = entity;
			}
		}
		return args;
	}


methodAccessor的思想是这样的
对于模型驱动而言,这里没有采用jdk反射或cglib字节码反射,而是生成一个代理类来变相反射(实际上是对象方法的直接调用)对于这部分思考有兴趣的朋友可以参考reflectasm。

其他代码可以在框架中下载
http://lizhizhang.iteye.com/blog/1896545
有什么意见或建意可以在这里拍砖。
MVC这部分比较简单,大家有什么好想法可以继续补充,接下来ORM....
2
7
分享到:
评论
31 楼 zh_harry 2013-07-31  
freezingsky 写道
博主,我刚才突发兴趣下载了你自己写的MVC框架。同时也花了十多分钟看了一下,发现代码和整个架构上感觉很是轻量,而且思路很好。我在想,你是否能跟着你现在的《疯子思考》系列,最后把自己的框架做一个详细的解说,以及各个部分划分的思路。这部分我想,意义更为重大。

我是这样考虑的,之前的疯子思考系统,如果你都看过的话,会感觉都是为这个框架的铺垫。
接下来是ORM
理论上从0讲起,以后会出框架的demo,和实践性项目。
30 楼 freezingsky 2013-07-31  
博主,我刚才突发兴趣下载了你自己写的MVC框架。同时也花了十多分钟看了一下,发现代码和整个架构上感觉很是轻量,而且思路很好。我在想,你是否能跟着你现在的《疯子思考》系列,最后把自己的框架做一个详细的解说,以及各个部分划分的思路。这部分我想,意义更为重大。
29 楼 alvin198761 2013-07-31  
zh_harry 写道
foible 写道
alvin198761 写道
tedeum 写道
我觉在写之前不要考虑太多的技术,什么action方法映射
2、拦截器
3、参数注入
4、模型驱动(模型参数注入)
5、路由跳转
6、action方法的执行,
MVC是什么?目标是什么先考虑清楚,因为我觉得不用上面这些东西也可能是MVC,先考虑技术这些东西就把目标限定死了,那么你写的这个MVC就没有超越别人的东西,还不如去读别人的代码,参与相关开源项目好一些。

个人感觉读了别人的代码,会把自己目标限制死。
中国人发明了一种计算工具,用了n年,甚至后来用它计算火箭升天,原子弹爆炸。它就是算盘。
西方人完全不参考这个工具,自己创造了一个计算工具,最初的时候,需要几十个人一起合作,用很多的点,才能计算,但经过不断改造,后来变的无所不能,这就是电子计算机

人啊,往往喜欢用一个极端去佐证另一个极端,读懂别人的代码,就能了解别人的想法和创意,这是基础,大部分是开发人员生存的工具,在此基础上做出自己的创新,也可以是微创新,别人已经造发了轮子,非常高效安全,你便便要重新造个轮子,那不是浪费生命吗?
站在巨人的肩膀上去思考创造,一定比闭门造车强。

是对的,我刚想回复这位同学,不知道怎么回复呢,你说得这个很对

突破传统的人才会有创新,陈规守旧的人才能守住文明,我们的观念是完全不同的,但不代表谁对谁错,
28 楼 zh_harry 2013-07-31  
大家有真心觉得文章有用的请顶上来,谢谢了
27 楼 zaq369cde 2013-07-31  
ฌููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููู็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็  ฏ๎๎๎๎๎๎๎๎๎  ๎๎๎๎๎๎ด้้้้้็็็็็้้้้็็็็็ฏ๎๎๎๎๎๎๎๎   ด้้้้้็  ฌููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููู
26 楼 zh_harry 2013-07-30  
笨蕉xx 写道
ฌููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููู็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็  ฏ๎๎๎๎๎๎๎๎๎  ๎๎๎๎๎๎ด้้้้้็็็็็้้้้็็็็็ฏ๎๎๎๎๎๎๎๎   ด้้้้้็  ฌููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููู

玩是吧
25 楼 笨蕉xx 2013-07-30  
ฌููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููู็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็  ฏ๎๎๎๎๎๎๎๎๎  ๎๎๎๎๎๎ด้้้้้็็็็็้้้้็็็็็ฏ๎๎๎๎๎๎๎๎   ด้้้้้็  ฌููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููู
24 楼 zh_harry 2013-07-30  
foible 写道
alvin198761 写道
tedeum 写道
我觉在写之前不要考虑太多的技术,什么action方法映射
2、拦截器
3、参数注入
4、模型驱动(模型参数注入)
5、路由跳转
6、action方法的执行,
MVC是什么?目标是什么先考虑清楚,因为我觉得不用上面这些东西也可能是MVC,先考虑技术这些东西就把目标限定死了,那么你写的这个MVC就没有超越别人的东西,还不如去读别人的代码,参与相关开源项目好一些。

个人感觉读了别人的代码,会把自己目标限制死。
中国人发明了一种计算工具,用了n年,甚至后来用它计算火箭升天,原子弹爆炸。它就是算盘。
西方人完全不参考这个工具,自己创造了一个计算工具,最初的时候,需要几十个人一起合作,用很多的点,才能计算,但经过不断改造,后来变的无所不能,这就是电子计算机

人啊,往往喜欢用一个极端去佐证另一个极端,读懂别人的代码,就能了解别人的想法和创意,这是基础,大部分是开发人员生存的工具,在此基础上做出自己的创新,也可以是微创新,别人已经造发了轮子,非常高效安全,你便便要重新造个轮子,那不是浪费生命吗?
站在巨人的肩膀上去思考创造,一定比闭门造车强。

是对的,我刚想回复这位同学,不知道怎么回复呢,你说得这个很对
23 楼 foible 2013-07-30  
alvin198761 写道
tedeum 写道
我觉在写之前不要考虑太多的技术,什么action方法映射
2、拦截器
3、参数注入
4、模型驱动(模型参数注入)
5、路由跳转
6、action方法的执行,
MVC是什么?目标是什么先考虑清楚,因为我觉得不用上面这些东西也可能是MVC,先考虑技术这些东西就把目标限定死了,那么你写的这个MVC就没有超越别人的东西,还不如去读别人的代码,参与相关开源项目好一些。

个人感觉读了别人的代码,会把自己目标限制死。
中国人发明了一种计算工具,用了n年,甚至后来用它计算火箭升天,原子弹爆炸。它就是算盘。
西方人完全不参考这个工具,自己创造了一个计算工具,最初的时候,需要几十个人一起合作,用很多的点,才能计算,但经过不断改造,后来变的无所不能,这就是电子计算机

人啊,往往喜欢用一个极端去佐证另一个极端,读懂别人的代码,就能了解别人的想法和创意,这是基础,大部分是开发人员生存的工具,在此基础上做出自己的创新,也可以是微创新,别人已经造发了轮子,非常高效安全,你便便要重新造个轮子,那不是浪费生命吗?
站在巨人的肩膀上去思考创造,一定比闭门造车强。
22 楼 alvin198761 2013-07-30  
tedeum 写道
我觉在写之前不要考虑太多的技术,什么action方法映射
2、拦截器
3、参数注入
4、模型驱动(模型参数注入)
5、路由跳转
6、action方法的执行,
MVC是什么?目标是什么先考虑清楚,因为我觉得不用上面这些东西也可能是MVC,先考虑技术这些东西就把目标限定死了,那么你写的这个MVC就没有超越别人的东西,还不如去读别人的代码,参与相关开源项目好一些。

个人感觉读了别人的代码,会把自己目标限制死。
中国人发明了一种计算工具,用了n年,甚至后来用它计算火箭升天,原子弹爆炸。它就是算盘。
西方人完全不参考这个工具,自己创造了一个计算工具,最初的时候,需要几十个人一起合作,用很多的点,才能计算,但经过不断改造,后来变的无所不能,这就是电子计算机
21 楼 zh_harry 2013-07-30  
http://lizhizhang.iteye.com/blog/1915601一篇关于log4j的文章,大家看一下
20 楼 gujian123456 2013-07-30  
heroying 写道
zh_harry 写道
zhoujiangzi 写道
alvin198761 写道
foible 写道
我个人觉得没有意义了,5年前很多人都做过了,真不如读别人的源码或参与相关开源项目好些。

罗列下5年前做的:
1、在web.xml定义监听器,负责tomcat启动后的框架数据加载
2、定义统一的映射+不同的id参数,用于请求和响应,及权限方面的判断
3、定义抽象类,继承httpservlet,定义处理请求和跳转方法
4、所以开发者定义的类继承抽象类,实现处理请求和跳转方法。

最基本MVC搞定。

访问方式:mvc?id=1; mvc?id=2,根据定义的1,2对应的处理类路径反射和跳转页面.

很多人做过了,你做过吗?别人学会的东西,不代表你会了,自己做一个东西不是为了写代码,而是让自己掌握架构的能力


我个人觉得不管这个东西是否有人做过,或者做了多少次,但是不排除很多人都是对其有个简单的了解,看源码又觉得头痛,所以这样简单的分析是好的。个人见解


我也看了源码,个人感觉很头疼,应该是我本人的技术水平还很低,觉得框架里的逻辑都比较绕。



你的代码不绕是因为你考虑的因素太少了;学学基本可以;但如果也要成产品,考虑各种各样的因素;你的代码不绕才怪。


说的不错!!!!
补充一下:


MVC
19 楼 zh_harry 2013-07-30  
heroying 写道
zh_harry 写道
zhoujiangzi 写道
alvin198761 写道
foible 写道
我个人觉得没有意义了,5年前很多人都做过了,真不如读别人的源码或参与相关开源项目好些。

罗列下5年前做的:
1、在web.xml定义监听器,负责tomcat启动后的框架数据加载
2、定义统一的映射+不同的id参数,用于请求和响应,及权限方面的判断
3、定义抽象类,继承httpservlet,定义处理请求和跳转方法
4、所以开发者定义的类继承抽象类,实现处理请求和跳转方法。

最基本MVC搞定。

访问方式:mvc?id=1; mvc?id=2,根据定义的1,2对应的处理类路径反射和跳转页面.

很多人做过了,你做过吗?别人学会的东西,不代表你会了,自己做一个东西不是为了写代码,而是让自己掌握架构的能力


我个人觉得不管这个东西是否有人做过,或者做了多少次,但是不排除很多人都是对其有个简单的了解,看源码又觉得头痛,所以这样简单的分析是好的。个人见解


我也看了源码,个人感觉很头疼,应该是我本人的技术水平还很低,觉得框架里的逻辑都比较绕。



你的代码不绕是因为你考虑的因素太少了;学学基本可以;但如果也要成产品,考虑各种各样的因素;你的代码不绕才怪。

在学习,多谢指教
18 楼 heroying 2013-07-30  
zh_harry 写道
zhoujiangzi 写道
alvin198761 写道
foible 写道
我个人觉得没有意义了,5年前很多人都做过了,真不如读别人的源码或参与相关开源项目好些。

罗列下5年前做的:
1、在web.xml定义监听器,负责tomcat启动后的框架数据加载
2、定义统一的映射+不同的id参数,用于请求和响应,及权限方面的判断
3、定义抽象类,继承httpservlet,定义处理请求和跳转方法
4、所以开发者定义的类继承抽象类,实现处理请求和跳转方法。

最基本MVC搞定。

访问方式:mvc?id=1; mvc?id=2,根据定义的1,2对应的处理类路径反射和跳转页面.

很多人做过了,你做过吗?别人学会的东西,不代表你会了,自己做一个东西不是为了写代码,而是让自己掌握架构的能力


我个人觉得不管这个东西是否有人做过,或者做了多少次,但是不排除很多人都是对其有个简单的了解,看源码又觉得头痛,所以这样简单的分析是好的。个人见解


我也看了源码,个人感觉很头疼,应该是我本人的技术水平还很低,觉得框架里的逻辑都比较绕。



你的代码不绕是因为你考虑的因素太少了;学学基本可以;但如果也要成产品,考虑各种各样的因素;你的代码不绕才怪。
17 楼 zh_harry 2013-07-30  
http://vb2005xu.iteye.com/blog/849125
vb2005xu 写道
此处贴一个几年前我关于这个想法的一个帖子 http://vb2005xu.iteye.com/blog/849125 呵呵

兄弟,我看了,咱俩臭味相投
16 楼 vb2005xu 2013-07-30  
此处贴一个几年前我关于这个想法的一个帖子 http://vb2005xu.iteye.com/blog/849125 呵呵
15 楼 vb2005xu 2013-07-30  
支持下 对个人而言 搞这个东西对理解框架结构会理解的够深,我也是这么过来的.建议lz在一定时刻可以阅读spring mvc的源码 再回过头来看你自己的,重复2次之后以后再接触其它的mvc框架就相当的轻松了 个人之见哈
14 楼 lian 2013-07-30  
zh_harry 写道
bevis.cn 写道
ฌููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููู็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็  ฏ๎๎๎๎๎๎๎๎๎  ๎๎๎๎๎๎ด้้้้้็็็็็้้้้็็็็็ฏ๎๎๎๎๎๎๎๎   ด้้้้้็  ฌููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููููู

你这玩意怎么 玩的,好神奇啊

同求咋玩的啊 有点神奇!
13 楼 zh_harry 2013-07-30  
freezingsky 写道
foible 写道
我个人觉得没有意义了,5年前很多人都做过了,真不如读别人的源码或参与相关开源项目好些。

罗列下5年前做的:
1、在web.xml定义监听器,负责tomcat启动后的框架数据加载
2、定义统一的映射+不同的id参数,用于请求和响应,及权限方面的判断
3、定义抽象类,继承httpservlet,定义处理请求和跳转方法
4、所以开发者定义的类继承抽象类,实现处理请求和跳转方法。

最基本MVC搞定。

访问方式:mvc?id=1; mvc?id=2,根据定义的1,2对应的处理类路径反射和跳转页面.

如果从MVC的实现角度来看,这确实是最简单的MVC实现了。不过,看楼主的意思,估计是想把MVC的东西写一遍,同时把一些框架都有的技术也整合到一起,更多是一种示例来理解。但是建议楼主在示例编写时,最好尽可能用最简单的方式去实现,不要过多的考虑旁的,否则这个教程就没完没了。

这是MVC的最后一篇了,大家感兴趣可以看我框架源码,非常简单。有什么好的建议请到回复,谢谢!
http://lizhizhang.iteye.com/blog/1896545
12 楼 zh_harry 2013-07-30  
zhoujiangzi 写道
alvin198761 写道
foible 写道
我个人觉得没有意义了,5年前很多人都做过了,真不如读别人的源码或参与相关开源项目好些。

罗列下5年前做的:
1、在web.xml定义监听器,负责tomcat启动后的框架数据加载
2、定义统一的映射+不同的id参数,用于请求和响应,及权限方面的判断
3、定义抽象类,继承httpservlet,定义处理请求和跳转方法
4、所以开发者定义的类继承抽象类,实现处理请求和跳转方法。

最基本MVC搞定。

访问方式:mvc?id=1; mvc?id=2,根据定义的1,2对应的处理类路径反射和跳转页面.

很多人做过了,你做过吗?别人学会的东西,不代表你会了,自己做一个东西不是为了写代码,而是让自己掌握架构的能力


我个人觉得不管这个东西是否有人做过,或者做了多少次,但是不排除很多人都是对其有个简单的了解,看源码又觉得头痛,所以这样简单的分析是好的。个人见解


我也看了源码,个人感觉很头疼,应该是我本人的技术水平还很低,觉得框架里的逻辑都比较绕。

相关推荐

Global site tag (gtag.js) - Google Analytics