MVC第2週リリース


インフラストラクチャ-金英漢の
Spring完全征服シリーズの学習を参考にしました
https://www.inflearn.com/roadmaps/373

Front Controlモード


フロントエンドコントローラなし、100個のコントローラ...200個なら?
FrontController(Servlet)
POJO Controller (java)
管理が難しい.
共通の論理を含めることができます.
要求がある場合は、テンプレートは直接マッピングされません.
フロントエンドコントローラにすべてのサーバ要求を受信させ、コントローラに送信します.
以前、すべてのコントローラからサーブレットリクエストが受信されました.
残りのコントローラはトップボックスを使用する必要はありません.

フロントエンドコントローラの導入(v 1)


フロントエンドコントローラを作成し、urlごとにコントローラをマッピングします.

要求に応じて値をジェネレータに挿入

分離ビュー(v 2)


コントローラからビューを返す代わりにMyViewというクラスを作成
public class MyView {
    private String viewPath;

    public MyView(String viewPath) {
        this.viewPath = viewPath;
    }


    public void render(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
        dispatcher.forward(request,response);
    }
コントローラからviewpathを転送する
 return new MyView("WEB-INF/views/members.jsp");

モデルの追加(v 3)


サーブレットテクノロジーを使用しないコードもあります
既存のリクエスト.setAttribute()をモデルとして使用し、テンプレートの依存関係を解消するためにモデルを直接作成します.
public interface ControllerV3 {

    ModelView process(Map<String, String> paramMap); // v2의 인터페이스와다르게 서블릿 기술이 들어가지않았다.
}

v4


モデルAndViewを作成して戻すのではなく、コントローラインタフェースにモデルを追加して、コントローラがビューの論理名のみを返すようにします.
public class MemberSaveControllerV4 implements ControllerV4 {
    ..
    
    @Override
    public String process(Map<String, String> paramMap, Map<String,Object>model) {
    	...
        // ModelView mv = new ModelView("save-result");
		//mv.getModel().put("member", member);
		//return mv; 
        model.put("member",member);
        return "save-result";
    }
}

v5


コントローラをFront Controlにマッピングする方法をより柔軟に変更
supportsはhandleメソッド付きアダプタを導入

スプリングMVC-構造を知る


ばねMVCの全体構造



Spring BootはDispathCerServiceletを自動的に登録し、すべてのパスにマッピングします.

DispatcherServiceletリクエストフロー


HttpServletを継承するFrameworkServletのサービス()メソッドを簡略化し、複数のメソッドを呼び出すときにDispathServletを呼び出す.doDispatch()メソッドを実行します.
@Controller
public class SpringMemberFormControllerV1 {

    @RequestMapping("/springmvc/v1/members/new-form")
    public ModelAndView process() {
        return new ModelAndView("new-form");

    }
}

DispatcherServiceletストリームをデバッグモードで表示



FrameWorkService()の上書き方法

doDispatchでHandlerを取得する部分に入りましょう


RequestMappingHandleMappingをマップしました
このリクエストをマッピングできますか?
5つのプロセッサマッピング中に検索(nullではないため、プロセッサは現在のプロセッサを返します)

プロセッサアダプタを検索する

4つのプロセッサアダプタの実行可能アダプタを検索

RequestMappingHandleAdapterが見つかりました

Handlerマッピング、アダプタを見つけて要求を処理します.

Handlerメソッドを呼び出します(Javaのアプリケーションでは、コントローラのHandlerメソッドに関する情報が得られ、実行できます).

Handlerマッピング、アダプタ


どうやってハンドルを見つけたらいいか分からない
ランキング0のrequestmappingHandlerMapping:プレゼンテーションベースのコントローラ@requestMappingがある場合、マッピング
スプリングシートに@ResquestMappingまたは@Controllerがある場合は、マッピング情報とみなされます.
1位BenNameUrlHandleMapping:スプリングシートの名前で一致
ハンドルアダプタ
0位RequestMappingHandleAdapter
第1位HttpRequestHandler処理
第2位単純Handler Controller

ビューマネージャの動作(デバッグモード)


Spring boot-propertiesファイルにprefix、接尾辞を指定
Spring BootはInternalResourceViewResolverを自動的に登録しますmvc.view.prefix、接尾辞設定情報を使用して登録します.
DispatcherServlet


ViewResolverタイプのビンを探して、ArrayListに入れて遊ぶ.
なければ、基本戦略をもたらします.ここにInternalResourceViewResolverがあります.

基本ポリシーをインポートする部分


Dispathcer.propertiesに格納されるデフォルトポリシー
beanにコンテンツが保存されていない場合に使用される基本ポリシー

スプリングMVC-起動


@Controller=スプリング空席+ハンドルマッピングとして認識可能
@RequestMappingがHandleMappingとして認識される方法

@Controller.class or @ReqeustMapping.クラス表現マッピング可能