基于Spring的MVC框架设计与实现

说明:这篇博客中并非讲SpringMVC,而是讲述我曾经实现过的一个MVC框架,它利用Spring框架作为基础框架,并吸收了部分其它框架中的思想,结合了自己的一些想法。此框架的代码算不上复杂,也不如常用MVC框架那么强大,它只是作为我重新发明轮子的一个成果。设计这个框架起源于在老师那里做过的一个项目,Turbine的设计给了我很大的启发,实现后,给它取了个名叫WebSide,并作为毕业设计中的一部分,下文是从毕业设计中选出,标题与图表都没有经过修改,且其中非常少量内容并非原创,请读者原谅。

2.1 MVC模式WebSide框架基本特性

MVC 是一种使用 MVCModel View Controller 模型-视图-控制器)设计创建交互式应用程序的模式,MVC模式在GUI程序中有很广泛的应用

Model(模型)表示应用程序核心(比如数据库记录列表)。是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据,程序的业务逻辑等。

View(视图)显示数据(数据库记录)。是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。

Controller(控制器)处理输入(写入数据库记录)。是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。传统MVC模式的示意图如图2.1。


在传统MVC模式中,控制器作为用户与系统功能之间的桥梁,控制器用于处理用户输入,如键盘,按钮的点击等,而模型与视图之间则使用了观擦者模式,当模型中的状态发生变化时,会通知给所有与模型关联的视图,以修改视图的显示。

Web应用中,MVC模式有所变化,由于Web应用无状态的特点,模型与视图之间不需要使用观擦者模式。Web MVC模式的示意图如图2.2所示。


FrontController又叫中心控制器,它的作用主要是请求的分发。在Web应用中,事件是http请求,而不是用户的键盘或者鼠标输入,应用在接收到请求后,中心控制器可以做请求的通用处理,比如做一些验证,将参数封装成对象等,然后利用一定的规则将请求委派给Controller做进一步处理。

Web MVC框架的最核心的功能是请求分发,WebSide在实现请求分发功能的同时,实现了以下特性: 

1. 对请求的拦截加入分支与try-catch-finally逻辑,使请求的拦截更灵活;

2. 利用Spring的父子容器功能,让每一个模块有一个独立的依赖注入容器,且每个模块的依赖注入容器共用同一个父容器,保证各模块之间的独立性;

3. 可配置的静态数据,如有些数据可以在整个应用中使用,有些数据只能在某一个模块中使用;

4. 视图请求视图,而不是直接请求Controller,实现视图与控制器的间接依赖,但也可在控制器中做跳转;

5. 实现多视图的支持,一个请求可以指定它需要什么样的数据

6. 实现将视图中需要的数据的处理与Action分离,且可能根据请求指定的数据类型自动调用对应的视图处理方法;

7. 对HTTP相关的对象的包装,因为Actionsingleton范围,而HttpServletRequestrequest范围,HttpSession则是sesison范围,对它们进行包装后,使request和sesison以被注入到Action中;

8. 支持多种使用方式,多种使用方式可以同时使用。

2.2 WebSide的使用方式

上面说到了WebSide支持多种使用方式,且它们不是互斥的,而是可同时使用的。

2.2.1 多视图

这是WebSide设计的初衷之一,但它是框架的使用方式中最复杂的一种。抛开pipeline细节,它将ActionController当作是从一个视图跳到另一个视图的过程中的两个不同的拦截器,Action与Screen都是可选。且请求需要严格遵守框架的约定。这种请求方式如图2.3所示。请求所返回的资源与请求的urlevent,type参数相关,event代码了需要执行的Action中的方式,typeevent参数决定Screen中调用的方法,而type决定了返回的数据的类型以及返回数据所在的目录,url最后一级(或者resource参数)表示资源名,resourceevent决定了返回给请求者的文件名。


2.2.2 使用注解简化多视图的使用

由于最初设计的多视图渲染的使用方式过于复杂,对于返回jsonxml样的数据时,有时候可以直接使用jacksonxstream工具将对象序列化成为json或者xstream所以在最初定义的约定的基础上,添加了在Screen中使用注解做视图渲染的使用方式。如图2.4中的代码段所示。


当在Screen中的方法上加上@Xml或者@Json,并给Screen上的方法加上返回值后,不需要再严格按照约定在对应的xml目录和json目录下存放一个资源文件。WebSide支持自定义视图渲染注解,任何时候都可以使用自定义注解处理Screen返回的数据。这种方式与前一种方式差不多。

2.2.3 只使用Screen或者Action

Screen虽然是可选的,但它与请求的资源绑定,如果只使用Screen,可以保证在请求某个资源前,需要的逻辑一定被执行。但只使用Screen在处理请求数据上不太方便。Screen主要用于视图渲染前的数据处理。

Action也是可选的,但Action的执行需要用户指定,使用Action处理请求与业务逻辑的调用比使用Screen要灵活,在不需要使用多视图渲染的情况下可以使用。

2.2.4 使用注解与Action

在不需要支持多视图渲染的情况下,使用Action与注解是比较简单的一种使用方式。能在Screen上使用的注解同样也可以使用在Action上。这种情况下,pipeline不会再执行Screen中的方法。目前支持的注解有@ToString、@Json@Xml@Forward@Redirect@Stream,任何时候都可以很方便的给它添加其它注解。

2.3 设计理念

Web MVC框架需要实现的功能主要是请求的分发以及请求在到达Action在Pipeline中的处理过程。常见的MVC框架Struts2和SpringMVC中,页面请求一个Action或者Controller,在Action中返回数据来确定跳转在哪一个视图。WebSide框架的实现过程中,页面请求的不是Action,而是一个资源或者视图,这里的ActionStruts2中的Action有较多的不同,同时,将

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值