記事のディレクトリ
ゼロ、学習目標
- SpringBootでのSpringMVC自動構成を理解する
- SpringBootでのマスターSpringMVC関数の拡張とカスタマイズ
Web開発では、静的リソースへのアクセスサポート、ビューパーサーの構成、コンバーターとフォーマッターのカスタマイズ、ファイルのアップロードとダウンロードなどの機能が含まれ、Webサーバーに関連付けられたサーブレット関連コンポーネントのカスタマイズも必要です。 Spring Bootフレームワークは、Web開発を実現するために一般的に使用されるいくつかのWebフレームワークの統合をサポートし、デフォルトでWeb開発のいくつかの一般的な機能をサポートします。
1つは、SpringMVCの自動構成です。
(1)自動構成の概要
Spring Bootプロジェクトでは、Web依存関係スターターが導入spring-boot-starter-web
されると、SpringMVCフレームワークによって統合されたSpringBootによって実装されるいくつかのXxxAutoConfiguration
自動構成クラスが自動的に有効になり、追加の構成なしでWeb開発をほぼ実行できます。
(2)Spring Bootは、SpringMVCの自動構成機能を統合します
- 組み込みの2つのビューリゾルバー:
ContentNegotiatingViewResolver
およびBeanNameViewResolver
; - 静的リソースをサポートし、
WebJars
; - コンバーターとフォーマッターは自動的に登録されます。
- Httpメッセージコンバーターをサポートします。
- メッセージコードパーサーは自動的に登録されます。
- 静的プロジェクトのホームページをサポートします
index.html
; - カスタムアプリケーションアイコンをサポートします
favicon.ico
; - Webデータバインダーを自動的に初期化します
ConfigurableWebBindingInitializer
。
次に、SpringMVC関数拡張の実装
(1)SpringBootプロジェクトを作成します-SpringMvcDemo2021
- SpringInitializrメソッドを使用してSpringBootプロジェクトを作成し、[依存関係]依存関係の選択でWeb依存関係スターターとThymeleaf依存関係スターターを選択します
(2)現在のプロジェクトを変換する-前のプロジェクトのコンテンツを移植する
- 10回目の講義ケース[Thymeleaf18N]のhtmlテンプレートファイル、国際設定ファイル、グローバル設定ファイル、および関連するJavaファイル(エントリファイルを除く)を現在のプロジェクトの対応する場所にコピーします。
- アプリケーションを起動し、成功するかどうかを確認します
- ログインページにアクセスします-http:// localhost:8080 / toLoginPage
- [すべてのユーザーを表示]ページにアクセスします-http:// localhost:8080 / allUsers
(3)MVC構成ファイルを記述し、ビュージャンプを定義します
1.コントローラーLoginControllerのtoLoginPage()メソッドのコメントをコメントアウトします。
2.インターフェイスWebMvcConfigurerを実装し、addViewControllersメソッドを書き直します
package net.hw.lesson11.config;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import sun.misc.Contended;
/**
* 功能:自定义MVC配置
* 作者:华卫
* 日期:2021年02月27日
*/
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
/**
* 添加视图控制器
* @param registry
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// 当通过login.html访问时,直接跳转到login视图对应的页面,即login.html页面
registry.addViewController("login.html").setViewName("login");
// 通过toLoginPage访问时,也直接跳转到视图名login对应的页面,login.html页面
registry.addViewController("toLoginPage").setViewName("login");
}
}
- 注:カスタムMVC構成クラスには注釈を付ける必要があります
@Configuration
- 注:toLoginPage()メソッドでは、属性はモデルを介して設定されます。モデル
currentYear
は、ログインページにジャンプするときにフロントエンドに渡されますが、現在定義されているView Controllerを介して直接渡されるため、データ転送は行われません。ログインページコードを変更する必要があります。プログラムでエラーが報告されないように、当面は年を表示しないでください。
3.ログインページを変更し、年を示すコードをコメントアウトします
3.アプリケーションを起動し、効果をテストします
- アクセス
http://localhost:8080/toLoginPage
- アクセス
http://localhost:8080/login.html
- どちらの方法でもlogin.htmlページにジャンプできます。もちろん、現時点では年は表示されません。
(4)ログインページに年を表示するインターセプターを作成します
インターセプターの役割は、ユーザーがリソースにアクセスする前にログインしているかどうかを判断するなど、アクセス要求の前後に関連する処理を実行することです。ログインしている場合はアクセスでき、そうでない場合はアクセスできません。この場合、アクセス要求後に当年の年データを取得し、ログインページに移動して表示します。
1.インターフェイスHandlerInterceptorを実装し、postHandle()メソッドを実装します
- 注:リクエストを処理する前にpreHandle()メソッドを書き換え、リクエストを処理するためにpostHandle()メソッドを書き換え、リクエストの完了後にafterCompletion()メソッドを書き換える必要があります。
package net.hw.lesson11.interceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Calendar;
/**
* 功能:自定义拦截器
* 作者:华卫
* 日期:2021年02月27日
*/
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
request.setAttribute("currentYear", Calendar.getInstance().get(Calendar.YEAR));
}
}
2. MyMvcConfigのaddInterceptors()メソッドを書き直して、カスタムインターセプターをロードします
3.ログインページを変更し、年を示すコメントをキャンセルします
currentYear
データはコントローラーからではなくインターセプターから取得されるため、コンパイルでは解析できないというエラーが報告されます。データはランタイムリクエストの後でのみ取得できるため、コンパイルでは次のようになります。エラーを報告します。
4.アプリケーションを起動し、効果をテストします
- アクセス
http://localhost:8080/toLoginPage
- アクセス
http://localhost:8080/login.html
- 年は両方の方法で表示でき、カスタムインターセプターのpostHandle()が有効になったことを示します。
(5)ログインブロッカーを作成して、ログインしていないユーザーがすべてのユーザー情報を表示できないようにします。
- ログインしていないユーザーはユーザー情報を表示できない必要がありますが、インターセプターを定義する前に、パスを介して
http://localhost:8080/allUsers
すべてのユーザー情報を表示できます。
1.ログインコントローラでtoLoginPageメソッドのアノテーションを復元します
2.カスタムMVC構成で対応するViewControllerをコメントアウトします
3.ログインコントロールのlogin()メソッドを変更します
4.カスタムインターセプターのpreHandle()メソッドを書き直します
- ログインしていないユーザーを傍受し、ログインページに直接リダイレクトして、強制的にログインさせます
5.カスタムMVC構成ファイルでインターセプトできないパスを除外します
6.アプリケーションを起動し、効果をテストします
http://localhost:8080/allUsers
ログインする前に、ログインページに直接アクセスしてジャンプしてください。ログインに成功すると、すべてのユーザー情報を表示できます。