[Spring MVC]#2フレームワークの作成(1)フロントエンドコントローラモード


MVCモードでフレーム構造を直接作成し,Spring MVCの構造を学習する.
△金ヨンハンの春のMVC講座を聞いて整理した.

フロントエンドコントローラ


フロントエンドコントローラモードとは?


  • は、各コントローラからのクライアント要求ではなく、1つのフロントエンドコントローラサーバからのクライアント要求
  • である.
  • フロントエンドコントローラ要求に適合するコントローラを見つけ、
  • を呼び出す.
  • は1つのエントリしかなく、汎用処理
  • が可能である.
  • フロントエンドコントローラを除き、他のコントローラはアシストコントローラを使用する必要はありません
    𘥪¥タブレットを使う理由はHTTP specを使いやすいためです.
  • Spring MVCのDispatcherServiceはFront Controlモードを採用しています.

    フロントエンドコントローラ導入版



    ControllerV1

    public interface ControllerV1 {
    
        void process(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException;
    }
  • の多形性を利用するために、コントローラはインタフェースを用いて実現される.
  • タブレットのようなコントローラインタフェースを作成します.
  • 各コントローラはインタフェース
  • を実装する
    АААААААААААААА

    会員登録コントローラ

    public class MemberFormController implements ControllerV1 {
    
        @Override
        public void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String viewPath = "/WEB-INF/views/new-form.jsp";
            RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
            dispatcher.forward(request, response);
        }
    }

    会員ストレージコントローラ

    public class MemberSaveController implements ControllerV1 {
    
        MemberRepository memberRepository = MemberRepository.getInstance();
    
        @Override
        public void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String username = request.getParameter("username");
            int age = Integer.parseInt(request.getParameter("age"));
    
            Member member = new Member(username, age);
            memberRepository.save(member);
            //Model에 데이터를 보관한다.
            request.setAttribute("member", member);
    
            String viewPath = "/WEB-INF/views/save-result.jsp";
            RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
            dispatcher.forward(request, response);
        }
    }

    メンバーリストコントローラ

    public class MemberListController implements ControllerV1 {
    
        MemberRepository memberRepository = MemberRepository.getInstance();
    
        @Override
        public void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            List<Member> members = memberRepository.findAll();
    
            request.setAttribute("members", members);
    
            String viewPath = "/WEB-INF/views/members.jsp";
            RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
            dispatcher.forward(request, response);
        }
    }

    FrontControllerV1

    @WebServlet(name = "frontControllerServletV1", urlPatterns = "/front-controller/v1/*")
    public class FrontControllerServletV1 extends HttpServlet {
    
        private Map<String, ControllerV1> controllerMap = new HashMap<>();
    
        public FrontControllerServletV1() {
            controllerMap.put("/front-controller/v1/members/new-form", new MemberFormController());
            controllerMap.put("/front-controller/v1/members/save", new MemberSaveController());
            controllerMap.put("/front-controller/v1/members", new MemberListController());
        }
    
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("FrontControllerServletV1.service");
    
            String requestURI = request.getRequestURI();
            ControllerV1 controller = controllerMap.get(requestURI);
            if (controller == null){
                response.setStatus(HttpServletResponse.SC_NOT_FOUND);
                return;
            }
            controller.process(request, response);
        }
    }
  • コントローラがインタフェースを介して実装されていない場合、if文を1つずつ実行する必要があります.
  • 多形性を利用してDIPの原則を守った.
  • @WebServletのURLモードから、フロントエンドコントローラであるため、パスはxx/v 1/*です.
    v 1/のいずれのコンテンツもフロントエンドコントローラを経由する
  • Mapのキーと値はurlとコントローラです.
    事前にMapに保管されている勘定科目のマッピング情報

    改善すべき点


    各コントローラからビューに移動する部分には重複コードがあります。

    String viewPath = "/WEB-INF/views/xxx.jsp";
    RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
    dispatcher.forward(request, response);