1
)
MVC
模式
当年做
JSP
生产实习时,印象最深也最困惑的模式就是
MVC
模式了。那时候
Struts
刚红,几乎每本
Struts
书中都会有大篇幅的
MVC
介绍。这个模式最早出现在
GUI
,后来在
Web
服务器端红火起来,先前在
Ajax
书中也看到
Web
客户端的
MVC
介绍。说实话,在我看了很多人的
MVC
解释后,我仍有些糊涂,这里说说我的理解。
有人提到MVC模式时说MVC代表了模型层、视图层、控制层,我觉得这是不对的。在经典的J2EE三层架构中,三层是分为Web层、业务层、持久化层;这个经典分层是基于分布式应用(EJB)的,也就说,Web层物理上是在Web服务器中,
业务层和持久化层物理上是在应用服务器中。在这种情况下,MVC只是属于Web层这一层的,而不是分为三层。在这种分布式应用中,视图就是JSP(如果采用的话),控制器就是Servlet(如果采用的话),而模型就是就是调用业务层的在Web层中的桩子。假如我们采用轻量级的SSH技术架构,视图还是JSP,控制器是Struts,而模型就是Spring+Hibernate。这里最难理解的就是模型的概念。我觉得模型是有状态和行为的,那么Struts中的Action调用的Servcie方法就是模型的行为,而返回给JSP的DTO(DO)就是模型的状态。
2
)页面控制器
对于一个页面请求,总要有个地方负责处理和页面跳转的地方,这个地方就是页面控制器。页面控制器有两种,一种是如Servlet的脚本文件,一种是如JSP的服务器页面。对于Java来说,JSP就是只应该用来显示动态的或静态的信息,而不是用来负责处理Request并Redirect页面,否则Servlet就要失业了。尽管一个Web程序可以全由JSP文件组成,但将控制甚至业务脚本杂乱的穿插在Tag中真的是太糟糕的实践了。我记得最初学JSP时,从网上得到的用JSP做的管理系统很多都是纯JSP,那时我还以为那就是Java
Web开发的最佳实践了!
3
)前端控制器
如果你不是Web框架的设计者,想必你不会有机会做个前端控制器,尤其是在拥有了大量优秀的Web框架的Java社区里。前端控制器这个模式我以前在《J2EE核心模式》中看到过,感觉那本书的例子写的很好。前端控制器是由一个Web处理程序和一个命令(Conmmand)层次结构组成。以Struts1为例,其前端控制器就是ActionServlet,那些我们需要编写的Action就是前端控制器要处理的命令。在简化Web开发方面,前端控制器通过Web处理程序做一些具有共性的有价值的事情。比如Struts1的前端控制器通过Form简化了请求参数的获取和验证,而Struts2(WebWork)做的就更多,它的命令Action不是单例的,Action的属性可以是封装了请求参数的(经过类型转换)域对象或传输对象,其以拦截器链表现的Web
AOP更是简化了横切性方面的操作。
4
)模板视图
Java
Web
中最常用的视图表现技术就是
JSP
,我们可以以多种编程手法表现来自于数据库中的数据。我们可以使用
Scriptlet
将模型数据嵌在
HTML
中间,我们可以使用诸如
JSTL
和框架标签穿插在
HTML
中间,我们也可以自定义标签来封装一类数据表现。相比来说,使用标签要比
Scriptlet
更清晰些,毕竟
JSP
页面就是应该编写可视化更好的标签。但如果有条件判断等逻辑信息,使用标签有时也不见得有多清晰,这是可以考虑使用自定义标签。
5
)转换视图
MF
通过
XSLT
介绍了转换视图,由于本人没有使用过
XSLT
,这里不做介绍。我倒想起了以前的
Ajax
编程,也是个转换视图的过程。在
Servlet
中将模型数据拼串成
XML
(
HTML
)文档,然后传送到
JS
,再构造成
DOM
树(或是将
HTML
文档添充在指定的
HTML
标签内)。在最原始的
Ajax
编程中,无论是在
Servlet
中拼串还是在
JS
中构造
DOM
树都是很繁琐很难调试的事情,尤其是在我很不喜欢在
Java
文件中夹杂着
Tag
信息的情况下。
6
)两步视图
两步视图说的是,用两个步骤把领域数据转换成
HTML
:第一步形成某种逻辑页面,第二步把这些逻辑页面转换成
HTML
页面。这个模式实际上一种装饰者模式,第二步的视图渲染过程要做的就是将逻辑视图加上一致的表现形式。我能想到的是,可以通过诸如
SiteMesh
、
Tiles
等工具完成两步视图模式。在不使用
XSLT
的情况下,第一步形成的模板视图显然也不是一种诸如
XML
的逻辑页面
。
7
)应用控制器
这是《
POEAA
》
Web
表现模式中的最后一个模式,
MF
说这个模式很少会被用到,它一般用在具有特定的视图导航的情况下,也就是说页面访问顺序不是任意的而是和当时的对象状态有关。书中介绍的例子是关于状态模型的,没完全理解的说。我能想到的例子是具有上下步的注册过程,可以认为上下步的切换是特定的,是具有状态信息的;可以强联系上
MF
的说法,一个输入控制器将请求传到应用控制器,应用控制器根据当前步数和请求的步数使用特定的命令进行操作,并传回输入控制器下一步的视图。关于应用控制器的更精确的理解,也欢迎明白的你指出。
注:此文系重温《企业应用架构模式》一书的简要笔记,对企业应用架构模式或
Web
表现模式感兴趣的朋友可以阅读一下该书。