ばねMVC構造


前章で作成したプロジェクトの構造とSpring MVCの構造を比較してみましょう

GOT YOUNGHNの講義がどれほど体系的だったかがわかりますが…

ばねMVCの構造


  • Handlerクエリ:Handlerマッピングクエリによって要求URLのHandler(コントローラ)にマッピングされます.

  • クエリーHandlerアダプタ:クエリーはHandlerのHandlerアダプタを実行します.

  • Handlerアダプタの実行:Handlerアダプタを実行します.

  • Handlerを実行:Handlerアダプタで実際のHandlerを実行します.

  • ModelAndViewを返します:HandlerアダプタHandlerが返した情報をModelAndViewに変換します.

  • viewResolverの呼び出し:ビューアZooverを検索して実行します.
  • JSPの場合:InternalResourceViewResolverが自動的に登録され、使用されます.

  • ビューに戻る:ビューの論理名を物理名に変更し、レンダリングを担当するビューオブジェクトを返します.
  • JSPではInternalResourceViewに戻り、内部に順方向論理があります.

  • レンダービュー(Render View):ビューからビューをレンダーします.
  • さあ.正直難しすぎるので、私たちがやった項目を基準に簡単に解いてみましょう.
    public class FrontControllerServletV5 extends HttpServlet {
    
        private final Map<String, Object> handlerMappingMap = new HashMap<>();
        private final List<MyHandlerAdapter> handlerAdapters = new ArrayList<>();
    
        public FrontControllerServletV5() {
            initHandlerMappingMap();
            initHandlerAdapters();
        }
    
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            Object handler = getHandler(request);
    
            if(handler == null) {
                response.setStatus(HttpServletResponse.SC_NOT_FOUND);
                return;
            }
    
            MyHandlerAdapter adapter = getHandlerAdapter(handler);
    
            ModelView mv = adapter.handle(request, response, handler);
    
            MyView view = viewResolver(mv);
    
            view.render(mv.getModel(), request, response);
        }
    
        private MyHandlerAdapter getHandlerAdapter(Object handler) {
            for (MyHandlerAdapter adapter : handlerAdapters) {
                if(adapter.supports(handler)) {
                    return adapter;
                }
            }
            throw new IllegalArgumentException("no handler adapter, handler= " + handler);
        }
    
        private Object getHandler(HttpServletRequest request) {
            String requestURI = request.getRequestURI();
            return handlerMappingMap.get(requestURI);
        }
    
        private void initHandlerAdapters() {
            handlerAdapters.add(new ControllerV3HandlerAdapter());
            handlerAdapters.add(new ControllerV4HandlerAdapter());
        }
    
        private void initHandlerMappingMap() {
            handlerMappingMap.put("/front-controller/v5/v3/members/new-form", new MemberFormControllerV3());
            handlerMappingMap.put("/front-controller/v5/v3/members/save", new MemberSaveControllerV3());
            handlerMappingMap.put("/front-controller/v5/v3/members", new MemberListControllerV3());
    
            handlerMappingMap.put("/front-controller/v5/v4/members/new-form", new MemberFormControllerV4());
            handlerMappingMap.put("/front-controller/v5/v4/members/save", new MemberSaveControllerV4());
            handlerMappingMap.put("/front-controller/v5/v4/members", new MemberListControllerV4());
        }
    
        private MyView viewResolver(ModelView mv) {
            return new MyView("/WEB-INF/views/" + mv.getViewName() + ".jsp");
        }
    
    }
    私たちのV 5フロントエンドコントローラ.
  • Handlerクエリー->入力要求のURL情報を取得してコントローラをクエリーします.
  • Object handler = getHandler(request);
    
    private Object getHandler(HttpServletRequest request) {
            String requestURI = request.getRequestURI();
            return handlerMappingMap.get(requestURI);
    }
    クエリー
  • Handlerアダプタ->クエリーされたコントローラがアダプタの実行に適しているかどうかを判断します.
  • MyHandlerAdapter adapter = getHandlerAdapter(handler);
    
    private MyHandlerAdapter getHandlerAdapter(Object handler) {
            for (MyHandlerAdapter adapter : handlerAdapters) {
                if(adapter.supports(handler)) {
                    return adapter;
                }
            }
            throw new IllegalArgumentException();
        }
  • Handlerアダプタ->Handlerアダプタを実行します.
  • Handler->
  • を実行
    ModelView mv = adapter.handle(request, response, handler);
    
    @Override // 핸들러 어댑터를 상속 받은 실제 어댑터
    public ModelView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
            ControllerV3 controller = (ControllerV3) handler;
    
            Map<String, String> paramMap = createParamMap(request);
    
            return controller.process(paramMap);
    }
  • ModelAndViewを返します.>4からMv
  • を返します.
    呼び出し
  • viewResolver
  • ビュー
  • を返します.
    MyView view = viewResolver(mv);
    
    private MyView viewResolver(ModelView mv) {
            return new MyView("/WEB-INF/views/" + mv.getViewName() + ".jsp");
    }
  • レンダー
  • Handlerマッピング、アダプタ


    コントローラを呼び出すには、HandlerマッピングとHandlerアダプタが必要です.
  • ハンドルマッピング:ハンドルマッピングでコントローラを見つける必要があります.
  • Handlerアダプタ:Handlerマッピングで見つかったHandlerを実行するには、Handlerアダプタが必要です.
  • スプリングは,必要なHandlerマッピングとHandlerアダプタの大部分を実現した.
    スプリングガイドによって自動的に登録されるHandlerマッピングのセットとHandlerアダプタのセットがあります.
    優先順位に従って順番に検索します.
    HandlerMapping
    0=requestmappingHandleMapping:プレゼンテーションベースのコントローラ@requestMapping用
    1=BeanName UrlHandleMapping:SpringBinの名前でHandlerを検索します.
    HandlerAadapter
    0=requestmappingHandlerAdapter:アニメーションベースのコントローラ@requestmapping用
    1=HttpResquestHandler Adapter:HttpResquestHandler処理
    2=単純コントローラHandler Adapter:Controllerインタフェース(ノイズX、過去使用)処理

    ビューアグリゲータ-内部リソースビューアResolver


    Spring Bootでは、InternalResourceViewResolverというビューライブラリが自動的に登録されます.
    このとき、application.propertiesに登録されているspring.mvc.view.prefix , spring.mvc.view.suffixの構成情報を用いて登録する.

    ビューアZooverの動作


    スプリングガイドによって自動的に登録されたビュートリム
    1=BeanName ViewResolver:空の名前でビューを検索して返します.(たとえば、Excelファイルを作成する場合)
    2=InternalResourceViewResolver:JSPを処理できるビューを返します.

  • ハンドラアダプタの呼び出し
    Handlerアダプタでnew-formという論理ビューを取得します.

  • ViewResolverの呼び出し
    new-formという名前のビュー名でviewResolverを順次呼び出します.
    BeanNameViewResolverは、new-formと命名されたスプリングシート登録のビューを検索する必要はありません.InternalResourceViewResolverを呼び出します.

  • InternalResourceViewResolver
    このビューアZooverはInternalResourceViewを返します.

  • ビュー-InternalResourceView
    InternalResourceViewは、JSPのように順方向()を呼び出して処理できる場合に使用します.

  • view.render()
    view.render()が呼び出され、InternalResourceViewはforward()を使用してJSPを実行します.