Springの手書きMVCの3つのコアコンポーネント

序文

このシリーズは、ついに2番目のコア関数の作成を開始しました。まず、Springにはさらに3つの重要なコア関数があります。1つ目は、IOCの制御の反転DI依存性注入と、もちろんAOPの側面です。このパートでは、すでに「Spring5コア原則と30クラスの手書き練習」に精通しており、猫と虎に従って実装しましたが、現時点ではAOPパートを実装しておらず、今日のパートはMVCパートです。 、私たちのほとんどを達成するためにコア機能の1つは、もちろん、最も単純なモデルであり、データベースのサポートがそれに続きます。次に、基本的に3つのコンポーネントはほぼ同じです。次に、私自身の理解に従ってアップグレードおよび保守します(Springの実際のソースコードをコピーします)。この本を含むシリーズ全体は、実際にはソースコードを直接見るのではなく、このアイデアに傾倒しています。まず、混乱するだろうと思います。なぜこのように設計されているのかわかりません。最初に本を読んで全体像を見ていきます。もしあなたが男なら、この一般的な考え方を理解してから自分で書いて、なぜこのように書いたのかを考えてから、実際のソースを組み合わせてください。それを最適化する方法を知るためのコード。

ここでは、最初の2つのブログ投稿を事前に確認することをお勧めします。
Springの手書きのSpringMVC5注釈

第3レベルのキャッシュを理解するためのSpringの手書きSpringMVC5アノテーション(IOC、DI最適化)

記事の最後に固執して、倉庫の住所を取得します。

プロセスレビュー(MVC)

その前に、MVCの最初のバージョンの処理フローを簡単に確認しましょう。これは非常に重要です。

まず、MVCには実際には2つの部分があり、1つは初期化部分です。初期化部分は2つの部分に分かれており、最初の部分は当然IOC部分であり、2番目の部分はMVC専用の部分です。

ここに画像の説明を挿入

その後は、MVCの実行コンポーネントであるディスパッチャーです。
ここに画像の説明を挿入

これが私たちの元の実行フローです。明らかに、ステップ全体を最適化でき、コンポーネントを追加することもできます。

MVCの最も重要なポイントは、明らかに私たちのビューとモデル、ビューの読み込みとデータのレンダリングです。

SpringMVCの9つのコンポーネント(理解)

コンテンツを入力する前に、SpringMVCの9つのコンポーネントを簡単に理解する必要があります。

     	initMultipartResolver(context) 多文件上传组件
     	initThemeResolver(context) 初始化模板处理器
        //mvc mapping组件(扫描mvc注解参数)
        initHandlerMappings(context);
        // 参数适配器,匹配参数执行方法
        initHandlerAdapters(context);
        initHandleExceptionResolvers(context) 异常拦截器
        initRequestToViewNameTranslator(context) 初始化视图预处理器
        // 初始化视图转换器
        initViewResolvers(context);
        //FlashMap处理器
        initFlashMapManager(context);

ですから、今日私たちが明らかに達成したいのは

initHandlerMappings(context);
initHandlerAdapters(context);
initViewResolvers(context);

新しいプロセス

さて、私たちに話を戻しましょう。最適化について話しているので、明らかにこれら3つのことを実装する必要があります。次に、現在のプロセスで少し処理を行う必要があります。

初期化プロセス

ここでは、主にMVC部分のプロセスについて説明しますが、IOCについては、DI部分には注意を払いません。対応するコードはこちら
ここに画像の説明を挿入

コンポーネントの初期化

ここに画像の説明を挿入

初期化は何をしましたか?

今これを見ると混乱するかもしれませんので、これら3つのカテゴリーが何をするのかをお話ししましょう。
ここでフローチャートを直接参照してください
ここに画像の説明を挿入
。プロセス全体が初期化部分です。

実装プロセス

その後、実行プロセスが行われます
ここに画像の説明を挿入
。まず、最初の2人は古くからの友人であり、主に後で行ったこと、つまり、ビューの解析部分、何をしたかです。

まず、htmlファイルと対応する名前が初期化によってカプセル化されていることを確認します。これは、モデルとビューに対応します
ここに画像の説明を挿入
ここに画像の説明を挿入
。次に、モデルはレンダリングする必要のあるデータです。この部分では、テンプレートを渡す必要があります。 。エンジンがそれを行います。

そして、これらすべてを解析するのはエントリです
ここに画像の説明を挿入
ここに画像の説明を挿入
。次に、このビューが私たちのために行うことは、テンプレートを解析することです。
ここに画像の説明を挿入
ここに画像の説明を挿入

そして、この理由は、実際、重要なトリックの1つがまだアダプターにあります
ここに画像の説明を挿入
ここに画像の説明を挿入

次に、これがMVC全体のコアプロセスです。

ここでのポイントは、実際にはカプセル化された「情報クラス」、つまり情報をカプセル化するクラスです。

「情報教室」

HUHandlerMapping

まず、ハンドラーマッピングは自然にカプセル化されます。スキャンした対応するメソッドと対応するURL(ここでは通常のURLなので、実際にはパターンです)の後にコントローラーが続きます。

HUModelAndView

これにより、ビューの名前(htmlとして理解できます)と、次にパーサーにレンダリングする必要のあるデータがカプセル化されます。
ここに画像の説明を挿入

もちろん、HUViewResolverと一致します

HUViewResolverとHUModelAndViewの関係

実際、名前からわかるように、前者は実際に後者に対応するhtmlファイルをロードし、解析するデータをテンプレートエンジンに送信するのに役立ちます。

パーサーHUView

その後の焦点はパーサーです。ここでの単語はHUViewクラスです。

package com.huterox.spring.framework.webmvc.servlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HUView {
    
    
    private File viewFile;
    public HUView(File templateFile) {
    
    
        this.viewFile = templateFile;
    }

    public void render(Map<String,?> model, HttpServletRequest req, HttpServletResponse resp) throws IOException {
    
    
        StringBuffer sb = new StringBuffer();//最后输出的内容
        RandomAccessFile ra = new RandomAccessFile(this.viewFile,"r");
        String line = null;
        while (null!=(line=ra.readLine())){
    
    
            line = new String(line.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
            Pattern pattern = Pattern.compile("\\$\\{[^\\}]+\\}",Pattern.CASE_INSENSITIVE);
            Matcher matcher = pattern.matcher(line);
            while (matcher.find()){
    
    
                String paramName = matcher.group();
                paramName = paramName.replaceAll("\\$\\{|\\}", "");
                Object paramValue = model.get(paramName);
                line = matcher.replaceFirst(makeStringForRegExp(paramValue.toString()));
                matcher = pattern.matcher(line);
            }
            sb.append(line);
        }
        resp.setCharacterEncoding("UTF-8");
        resp.getWriter().write(sb.toString());
        resp.getWriter().flush();

    }

    public static String makeStringForRegExp(String str){
    
    
        //特殊字符转移
        return str.replace("\\","\\\\").replace("*","\\*")
                .replace("+","\\+").replace("|","\\|")
                .replace("{","\\{").replace("}","\\}")
                .replace("(","\\(").replace(")","\\)")
                .replace("^","\\^").replace("$","\\$")
                .replace("[","\\[").replace("]","\\]")
                .replace("?","\\?").replace(",","\\,")
                .replace(".","\\.").replace("&","\\&");
    }
}

コア全体は、正規表現
がデータをレンダリングするために使用するものです。ここに画像の説明を挿入

テスト

わかりました、テストリンクを入力することはあまりありません
ここに画像の説明を挿入

データレンダリングOK

プロジェクトの買収

次のステップは、プロジェクトを取得することです。今回は、giteeに直接アップロードしました。はい、giteeに直接アップロードしました。

https://gitee.com/Huterox/springcoding

おすすめ

転載: blog.csdn.net/FUTEROX/article/details/123502928