32、最简单的mvc框架tiny,orm、原理图、问题与解决思路

orm

先说下orm,在前面我们没有提这个,其实我们已经实现了orm功能。

这里把orm做了极大的简化,以一个model映射到数据库的一张表。在前面看到我们把业务处理也放在model里,所以这时model才是真正的充血模型,并把对数据库的操作封装为dao,所以orm其实为model+dao。

Tiny v1.0框架原理图

再补一下框架的原理图

Tiny v2.0 设计中。。。(先贴个图)

**
**

Tiny框架的问题及解决思路

**问题1:**参数类型Map<String,String>问题

我们规定所有参数都为Map<String,String>,中值都为String类型确实有点不好让人接受(虽然从页面传递过来的,都是String类型),现在我们想参数转型的工作由tiny来完成,我们怎么解决这个问题呢?

解决思路:

重写一个TinyMap类继承HashMap。我们实现getInt,getString等方法,调用这些方法可以对类型自动转换,当使用get方法时,其实是调用HashMap的get方法,放回object类型,代码如下:

1TinyMap tMap = new TinyMap(); 2tMap.getInt(key); 3tMap.getString(key); 4tMap.get(key);//Ojbect

然后由前置控制器中将页面的参数转换为TinyMap类型(现在转换为HashMap),最后放入action参数中。由于action中参数为map接口,所有对原设计无影响,用户可同时使用HashMap和TinyMap的方法。

问题2:****Aop功能太过鸡轴,只能对action访问的织入,而不能对业务(model)织入

解决办法

方式1:动态代理模式

实现动态代理类。在前置控制器中代码Container.inject(o);(注入模型)时,注入代理类,然后在BindingAop中绑定model(类似action),代理类调用具体的model方法,在执行前后调用aop的before和after。具体如下:

BindingUtil.binding("/模型类/模型方法/", new Class[]{TestAop.class});//模型和aop的绑定
通过绑定,我们把模型类,自动放入代理类中,然后在action中定义代理类,同以前那样注入,然后action中调用代理类.invok();即可。

缺点:

方式1有个缺点,或者说是java的动态代理模式的缺点(也许大家好的办法,请告诉我下),就是必须得实现接口。实现一个接口一般没什么不好,但是咱们的模型是有很多个的,让用户去自己弄接口然后自己实现,这样也没什么不对,只是这样用户开发时,尤其是非常小的系统时,开发时就会很麻烦,这样有违咱们当初设计tiny的初衷,所以放弃方式1.

方式2:神秘方式

呵呵,我想到了一个变态的方式,以前看过别的框架实现过,觉得真是麻烦(需要用户去自己弄好多东西),我现在决定改一下,我自己感觉还不错,而且没有方式1的麻烦问题,在action中的模型,还是用户自己写的模型类,也不需要用户像绑定action那样去绑定模型和aop的关系,感觉一个action绑定就够了。就是说用户在什么也没做的情况下就有了aop的功能,是不是很神秘啊,很符合tiny的隐形特性。这个先买个关子,先不说明,等大家看见代码就一下明白了。就让它在神秘下吧。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )