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....