自己的web框架的需求和设计
其实之前师兄就叫我试试自己写个mvc框架,但是各种破事加上懒,就一直没有做。但是需求是第一生产力。刚开始用框架还觉得框架简单好使省事,但是用久了,一些为了开发方便固定下来的套路就渐渐觉得不那么灵活了。什么套路呢?先让我复习一下mvc。
MVC框架
MVC框架的m
v
c
分别代表了模型层
,视图层
和控制器
。
维基百科上讲的:
控制器(Controller)- 负责转发请求,对请求进行处理。
视图(View) - 界面设计人员进行图形界面设计。
模型(Model) - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。
极客学院的解释:
模型封装了应用程序数据,并且通常它们由 POJO 组成。
视图主要用于呈现模型数据,并且通常它生成客户端的浏览器可以解释的 HTML 输出。
控制器主要用于处理用户请求,并且构建合适的模型并将其传递到视图呈现。
其实以前我对MVC不理解,视图层和控制器解释差不多,视图层对于html,控制器对应controler或者action。但是相比维基,极客学院对模型层的解释就有所残缺了,而我以前一直看到的都是极客学院样的说法。按极客学院的说法,模型层就只对应了数据库的操作类,那业务逻辑类丢了?按维基的说法模型层就包活了数据库操作类和业务逻辑类,算是解决我一直以来的疑惑。
这三层通过数据连接在一起,用户通过视图层请求控制器,并可能携带一定数据,之后控制器把数据传递给模型层,模型层完成业务逻辑,或者修改了数据库数据之后,把需要的数据传递给视图层展示给客户。这样一个流程是ojbk的,不是我需要改的部分,但是这个按照mvc结构的业务流却是静态的,啥意思呢?我举个例子把,例如在springmvc中,模型层有两个接口M1和M2,控制器也有两个接受url请求的方法C1和C2,识图也有两个识图V1和V2,由于业务需要,C1调用M1还是M2是确定的,写死在代码里的。同样C1之后返回哪个视图给用户也是确定的,写死的。这样感觉就非常不灵活。如果某一天,我要在某个控制器里增加需要调用的业务接口,或者添加视图展示的数据,就要修改代码,测试再发布,鸡儿麻烦。这个其实如果把页面渲染用前端框架,后台做好比较细的接口,这样修改前端页面的代码就可是实现很灵活的修改。但是,这个需求是来自于我的博客,如果把页面用js来渲染,怕会对蜘蛛不友好,并且我看别人的博客都是静态的,所以这法子不接受。
我的MVC框架逻辑
1 |
|
我的MVC框架的控制器
控制器的动态数据传入。无论是什么,都可以通过字符串在request里获得,而字符串可以是动态的,因此可以把字符串和数据做成Map,传入控制器方法,在控制器里再在map里get。
通过控制器名字,获取其需要调用的业务接口。这里可以找个地方存储不同控制器名字对应那些业务方法,之后通过Map结构表示。而业务接口为了通用性还是用字符串表示吧,例如是业务类的方法名。还有,既然是存储控制器名字对应那些业务方法,那么控制器的业务方法是可以被修改的,作为一种数据。
获得方法名字之后,通过反射看看方法的参数,通过反射调用。当然还有个问题,我忘记了反射获取方法的参数具体是咋样,毕竟没办法就通过参数的类型来确定往业务方法里传入哪个对象。或者也可以把业务方法的传入都封装成map,不过就比较麻烦了。
业务方法返回的对象全部传入视图,至于这些对象用不用得上就是视图层的事情了。
我的MVC框架的视图
与控制器一样,视图的动态参数可以考虑也做成map。
也与控制器一样,通过视图名字获取html模板也要找地方存储,可以被修改,也是map结构。
需要找一个框架,用于把数据渲染到html里,而这个确实最头疼的。既然是可以修改html,我希望修改html能做到简单方便。html做静态页面就挺方便的,就算是用js渲染页面,数据写死几个用来测试,写好保存到html文件里,在浏览器打开或者刷新一下就能看。还可以像markdown编辑器一样,左边在写html,右边展示效果。如果视图渲染html效果能在浏览器里即刻展示就方便了(不希望有所谓的客户端,就用浏览器方便)。
所以第一方案,由于语法之类的问题,编辑时候写几个json来测试,用js来渲染,例如用个我唯一会的vue,视图后台也要用js来渲染咯?java,用js,来渲染html?我暂时没找到实现方案,之前好像看见有像一个java实现的浏览器样的渲染页面的,但是没试过,不知道效果咋样。
第二个方案是后台仍然用thymeleaf渲染,所以html渲染就不能交给浏览器了,可以在编辑页面用js设定时器,定时把编辑的html提交到后台渲染,返回前端展示效果。但是有个大问题,测试的数据怎么办?不知道thymeleaf渲染能不能用json,如果不能,要用java对象,那在浏览器里怎么写几个测试数据?
既然html都可以变编辑,那js文件,css文件可应该可以顺便被编辑。但是视图层就要判断这个是html需要被渲染,还是是静态文件不要渲染。
感觉差不多了,bb了这么多。
参考文献