[Design Patterns] Front Controller

Front Controller được sử dụng để cung cấp một trung tâm xử lý yêu cầu, nơi mà tất cả các yêu cầu sẽ được tiếp nhận và phản hồi bởi 1 object duy nhất. Object này có thể thực hiện xác thực đăng nhập/ghi nhật ký/theo dõi yêu cầu và chuyển yêu cầu tới các

Front Controller được sử dụng để cung cấp một trung tâm xử lý yêu cầu, nơi mà tất cả các yêu cầu sẽ được tiếp nhận và phản hồi bởi 1 object duy nhất. Object này có thể thực hiện xác thực đăng nhập/ghi nhật ký/theo dõi yêu cầu và chuyển yêu cầu tới các object xử ký khác ở cấp thấp hơn. Sau đây là các thành phần của pattern:

  • Front Controller – Object tiếp nhận tất cả các yêu cầu được gửi tới ứng dụng (web hoặc desktop).
  • Dispatcher – Object này sẽ hỗ trợ Front Controller chuyển yêu cầu tới các object xử lý ở cấp thấp hơn.
  • View – Object mô tả giao diện người dùng, nơi mà yêu cầu được tạo ra và gửi tới Front Controller.

Áp dụng triển khai

Chúng ta sẽ tạo ra một FrontController để nhận tất cả các yêu cầu request từ các View, sau đó nhờ Dispatcher chuyển tới các Controller tương ứng với các yêu cầu cần xử lý.

Bước 1

Tạo FrontControllerDispatcher.

frontcontroller/FrontController.java

packagefrontcontroller;publicclassFrontController{privatestaticfinalFrontController instance =newFrontController();privatefinalDispatcher dispatcher =newDispatcher();publicstaticFrontControllergetInstance(){return instance;};privatebooleanisAuthenticUser(){System.out.println("User is authenticated successfully.");returntrue;}publicvoidtrackRequest(String request){System.out.println("Page requested: "+ request);}publicvoiddispatchRequest(String request){trackRequest(request);if(!isAuthenticUser()){/* do nothing */}else
         dispatcher.dispatch(request);}}

frontcontroller/Dispatcher.java

packagefrontcontroller;importfrontcontroller.controller.*;publicclassDispatcher{privateController homeController =newHomeController(),
                      studentController =newStudentController(),
                      notfoundController =newNotfoundController(),
                      logoutController =newLogoutController();publicvoiddispatch(String request){if("home".equalsIgnoreCase(request))
         homeController.process(request);elseif("student".equalsIgnoreCase(request))
         studentController.process(request);elseif("logout".equalsIgnoreCase(request))
         logoutController.process(request);else
         notfoundController.process(request);}}

Bước 2

Tạo interface Controller.

frontcontroller/controller/Controller.java

packagefrontcontroller.controller;publicinterfaceController{voidprocess(String request);}

Và các class triển khai xử lý các yêu cầu cụ thể.

frontcontroller/controller/HomeController.java

packagefrontcontroller.controller;importfrontcontroller.view.HomeView;publicclassHomeControllerimplementsController{privateHomeView view =newHomeView();@Overridepublicvoidprocess(String request){
      view.show();}}

frontcontroller/controller/StudentController.java

packagefrontcontroller.controller;importfrontcontroller.view.StudentView;publicclassStudentControllerimplementsController{privateStudentView view =newStudentView();@Overridepublicvoidprocess(String request){
      view.show();}}

frontcontroller/controller/NotfoundController.java

packagefrontcontroller.controller;importfrontcontroller.view.NotfoundView;importfrontcontroller.view.View;publicclassNotfoundControllerimplementsController{privateView notfoundView =newNotfoundView();@Overridepublicvoidprocess(String request){
      notfoundView.show();}}

frontcontroller/controller/LogoutController.java

packagefrontcontroller.controller;importfrontcontroller.view.LogoutView;publicclassLogoutControllerimplementsController{privateLogoutView exitView =newLogoutView();@Overridepublicvoidprocess(String request){
      exitView.show();}}

Bước 3

Tạo interface View.

frontcontroller/view/View.java

packagefrontcontroller.view;publicinterfaceView{voidshow();}

Và các class triển khai.

frontcontroller/view/HomeView.java

packagefrontcontroller.view;importfrontcontroller.FrontController;importjava.util.Scanner;publicclassHomeViewimplementsView{@Overridepublicvoidshow(){System.out.println("=== Trang chủ");System.out.print("Bạn đang ở trang chủ.n"+"Hãy nhập trang mà bạn muốn di chuyển tới ( home | student | logout ): ");Scanner scanner =newScanner(System.in);String request = scanner.nextLine();FrontController.getInstance().dispatchRequest(request);}}

frontcontroller/view/StudentView.java

packagefrontcontroller.view;importfrontcontroller.FrontController;importjava.util.Scanner;publicclassStudentViewimplementsView{privateFrontController controller =FrontController.getInstance();@Overridepublicvoidshow(){System.out.println("=== Thông tin sinh viên");System.out.print("Bạn đang ở trang hiển thị thông tin sinh viên.n"+"Hãy nhập trang mà bạn muốn di chuyển tới ( home | student | logout ): ");Scanner scanner =newScanner(System.in);String request = scanner.nextLine();FrontController.getInstance().dispatchRequest(request);}}

frontcontroller/view/NotfoundView.java

packagefrontcontroller.view;importfrontcontroller.FrontController;publicclassNotfoundViewimplementsView{@Overridepublicvoidshow(){System.out.println("=== Trang hiển thị tạm");System.out.println("Trang hiển thị mà bạn yêu cầu không tồn tại.n"+"Đang điều hướng trở lại trang chủ.");FrontController.getInstance().dispatchRequest("home");}}

frontcontroller/view/LogoutView.java

packagefrontcontroller.view;publicclassLogoutViewimplementsView{@Overridepublicvoidshow(){System.out.println("=== Đăng xuất");System.out.println("Tài khoản của bạn đã được đăng xuất.");System.exit(0);}}

Bước 4

Chạy thử chương trình.

PatternDemo.java

importfrontcontroller.FrontController;publicclassPatternDemo{publicstaticvoidmain(String[] args){FrontController.getInstance().dispatchRequest("home");}}

Bước 5

Tương tác ở console và kiểm chứng kết quả hoạt động của pattern.

console

Page requested: home
User is authenticated successfully.===Trang chủ
Bạn đang ở trang chủ.Hãy nhập trang mà bạn muốn di chuyển tới ( home | student | logout ): student
Page requested: student
User is authenticated successfully.===Thông tin sinh viên
Bạn đang ở trang hiển thị thông tin sinh viên.
Hãy nhập trang mà bạn muốn di chuyển tới ( home | student | logout ): about
Page requested: about
User is authenticated successfully.===Trang hiển thị tạm
Trang hiển thị mà bạn yêu cầu không tồn tại.
Đang điều hướng trở lại trang chủ.Page requested: home
User is authenticated successfully.===Trang chủ
Bạn đang ở trang chủ.Hãy nhập trang mà bạn muốn di chuyển tới ( home | student | logout ): logout
Page requested: logout
User is authenticated successfully.=== Đăng xuất
Tài khoản của bạn đã được đăng xuất.

Nguồn: viblo.asia

Bài viết liên quan

Tấn Công Ứng Dụng Web: Mối Đe Dọa Hàng Đầu – Phần 2

viết lại nội dung này ” Phát hiện các cuộc tấn công Cross Site Scripting (XSS)

AI Chatbot 2025: Xu Hướng Tất Yếu Cho Doanh Nghiệp Dẫn Đầu

Giới thiệu AI chatbots đã trải qua một hành trình đáng kể, từ những công cụ t

Tấn Công Ứng Dụng Web: Mối Đe Dọa Hàng Đầu – Phần 1

Tấn công web là gì? Ứng dụng web là các ứng dụng cung cấp dịch vụ cho người

SEO Mũ Trắng, Mũ Đen, Mũ Xám: Hiểu Biết và Lựa Chọn Phù Hợp

SEO Mũ Trắng, Mũ Đen, Mũ Xám: Hiểu Biết và Lựa Chọn Phù Hợp Trong kỷ nguyên s