问题
你想给表现层的请求处理安排一个集中访问点。
系统需要一个集中的访问点来处理请求。如果没有集中访问点,那么多个请求之间公用控制代码就会在许多文件(比如视图文件)中重复出现。如果控制代码和视图创建代码混在一起,整个应用系统的模块化程度和内聚性都要下降。另外,如果控制代码在多处散放,也不便于代码维护,只要代码有一处改动,就需要改动多个文件。
约束
- 你想要避免重复控制逻辑
- 你想要对多个请求采取共通的处理逻辑
- 你想把系统处理代码和视图分割开
- 你想要把系统访问点集中在一起
解决方案
是用一个前端控制器,作为最初的接触点,用来处理所有相关请求。前端控制器集中了控制逻辑,避免了逻辑的重复,完成了主要的请求处理操作。
前端控制器通常会使用应用控制器,后者负责操作和视图管理(action and view management)
- 操作管理,也就是定位特定的操作(action)、并把控制权路由到该操作上,由他处理请求。
- 视图管理,则是指找到合适的视图,并分配到该视图上。虽然这个任务也可以放进前端控制器完成,但是把它独立出来,成为应用控制器的部分功能,能够增进模块化、可维护性和重用性。
设计手记:处理请求
处理请求需要两种操作:请求处理和视图处理。在请求处理过程中,表现层又必须进行几种操作:
- 协议处理和上下文转换
- 导航和路由
- 核心处理
- 分派
协议处理是指处理与特定协议相关的请求,上下文转换是指把与特定协议相关的状态转换成为更为通用的形式。一个例子是,从HttpServletRequest实例中获取参数,再复制到一个MyRequest对象中,从而能够在servlet环境之外独立应用。
导航和路由是指确定一个特定请求的路由,比如用那些对象进行请求的核心处理,用哪个视图显示结果。
核心处理也就是对请求的实际处理。
分派是指把控制权从应用系统的一个部分转交给另一个部分,比如从请求处理机制转交给视图处理组件。
策略
Servlet前端策略
JSP前端策略
命令加控制器策略
物理资源映射策略
逻辑资源映射策略
多路资源映射策略
“控制器中的分配器”策略
基类前端策略
过滤器控制器策略
效果
- 集中控制
- 提高系统可维护性
- 增进了重用
- 增进了开发团队中职责之间的区分