自学教程 学编程从这里开始

前端控制器模式

《前端控制器模式》|J2EE企业架构模式

关键词:Front Controller、请求统一入口、集中控制、路由分发、权限校验
说明:前端控制器模式不属于GOF23设计模式,属于J2EE企业架构模式

一、什么是前端控制器模式

前端控制器模式(Front Controller Pattern):为Web应用提供唯一的请求入口,所有客户端请求都先经过这个前端控制器,由它统一完成公共处理(路由、鉴权、编码、日志、参数校验),再分发到对应的业务处理器。
避免分散在各个页面/接口中重复写登录校验、编码处理等通用逻辑。

核心意图
集中管理Web请求的公共横切逻辑,统一入口做预处理,再分发至具体页面/业务处理器。

角色划分

  1. Client(客户端):浏览器,发起HTTP请求
  2. Front Controller(前端控制器):全局唯一入口,接收所有请求,调用调度器
  3. Dispatcher(调度器):根据请求路径,分发请求到对应的视图/业务处理器
  4. View(视图):最终渲染返回给客户端的页面/数据

数据流:
Client Request → Front Controller → Dispatcher → View

二、UML结构图

角色划分:

  1. Client:浏览器发起请求
  2. FrontController:全局入口,处理公共逻辑,持有Dispatcher
  3. Dispatcher:负责路由分发
  4. View:页面渲染

三、Java完整示例

模拟Web请求分发,代码全部使用英文。

// View
public class HomeView {
    public void show() {
        System.out.println("Displaying Home Page");
    }
}

public class StudentView {
    public void show() {
        System.out.println("Displaying Student Page");
    }
}

// Dispatcher
public class Dispatcher {
    private HomeView homeView;
    private StudentView studentView;

    public Dispatcher() {
        homeView = new HomeView();
        studentView = new StudentView();
    }

    public void dispatch(String request) {
        if (request.equalsIgnoreCase("home")) {
            homeView.show();
        } else if (request.equalsIgnoreCase("student")) {
            studentView.show();
        }
    }
}

// Front Controller
public class FrontController {
    private Dispatcher dispatcher;

    public FrontController() {
        dispatcher = new Dispatcher();
    }

    private boolean isAuthenticate() {
        // simulate authentication
        return true;
    }

    private void trackRequest(String request) {
        System.out.println("Request log: " + request);
    }

    public void dispatchRequest(String request) {
        // common processing
        trackRequest(request);
        if(isAuthenticate()) {
            dispatcher.dispatch(request);
        }
    }
}

// Client
public class Client {
    public static void main(String[] args) {
        FrontController frontController = new FrontController();
        frontController.dispatchRequest("home");
        frontController.dispatchRequest("student");
    }
}

运行输出:

Request log: home
Displaying Home Page
Request log: student
Displaying Student Page

四、前端控制器模式 vs MVC中的Controller

模式定位区别
前端控制器模式J2EE架构模式,全局请求入口所有请求统一拦截,处理公共横切逻辑,负责路由分发
MVC ControllerMVC架构的组件接收前端控制器转发后的请求,处理具体业务,组装模型数据

SpringMVC中 DispatcherServlet 就是前端控制器模式的经典实现。

五、优缺点总结

✅ 优点

  1. 请求统一入口,权限校验、日志、编码等公共逻辑集中处理,避免重复代码
  2. 请求路由统一管理,便于全局管控
  3. 减少视图与业务之间的直接耦合
  4. 公共逻辑变更只需要修改前端控制器,所有请求生效

❌ 缺点

  1. 单点入口,如果设计不当会造成前端控制器过重
  2. 所有请求都经过这一层,有一定性能开销
  3. 复杂场景下调度逻辑容易膨胀

六、框架应用场景

  • Spring MVC DispatcherServlet(最典型实现)
  • Struts 核心前端控制器
  • Web框架的全局过滤器、网关思想同源(Spring Cloud Gateway)

七、小结

前端控制器模式核心:所有Web请求统一进入前端控制器,完成鉴权、日志等公共预处理,再由调度器分发到对应视图/业务处理器。

归属:J2EE架构模式,不属于GOF23;SpringMVC DispatcherServlet就是该模式落地。

标签:

0 条笔记