目次
序文
Spring MVC (Model-View-Controller) は、Spring フレームワークの一部である Java ベースの Web アプリケーション フレームワークです。主に Web 開発に使用され、サーブレットをカプセル化したもので、サーブレットの拡張版とも言えます。
MVC 3 層アーキテクチャを確認する
SpringMVC を学ぶ前に、カスタム MVC フレームワークの概念を確認してみましょう。
カスタム MVC フレームワークの基本的なワークフローは次のとおりです。
- ユーザーはビューを通じてアプリケーションと対話し、ビューはユーザーのリクエストをコントローラーに渡します。
- コントローラーはユーザーのリクエストを受け取り、リクエストの種類と内容に応じてリクエストを処理するためにどのモデルを呼び出すかを決定し、処理結果に応じてどのビューを更新する必要があるかを決定します。
- リクエストを処理するプロセスでは、モデルはデータベースまたは他のデータ ソースと対話して、必要なデータを取得し、対応する処理を実行する必要がある場合があります。処理が完了したら、結果をコントローラーに返します。
- モデルの処理結果に基づいて、コントローラーはユーザーに結果を表示するためにどのビューを更新するかを決定します。
- コントローラーからの指示を受け取ったビューは、表示するコンテンツに従って対応する処理とレンダリングを実行し、最終的に結果をユーザーに提示します。
カスタム MVC では、リクエストごとにサーブレットを作成する必要がありますが、これは明らかに不便です。SpringMVC のワークフローもこれに似ており、コントローラーは複数のリクエストを処理し、リクエストを分散し、さまざまな業務を実行することができ、開発をより便利にするために機能強化されています。
Spring MVC の概要
Spring MVC (Model-View-Controller) は、Spring フレームワークの一部である Java ベースの Web アプリケーション フレームワークです。Spring MVC は、MVC 設計パターンに従って、Web アプリケーションを構築するためのシンプルで柔軟かつ強力なモデルを提供します。このパターンは、アプリケーションのプレゼンテーション層、ビジネス ロジック層、データ アクセス層を分離するのに役立ち、開発がよりモジュール化され、保守が容易になります。
Spring MVCの特徴
Spring MVC の中心原則は関心の分離であり、コード管理とメンテナンスを改善するためにアプリケーションのさまざまな側面を分離します。これは、アプリケーションをモデル、ビュー、コントローラーの 3 つの部分に分割することで実現されます。
-
モデル (モデル): モデルは、アプリケーションのデータとビジネス ロジックを表します。これは、POJO (Plain Old Java Object) または永続エンティティ クラスにすることができます。モデルは、データの読み取り、保存、検証を行い、表示のためにビューにデータを提供します。
-
ビュー (View): ビューは、モデル内のデータをユーザーに表示する役割を果たします。これは、JSP (JavaServer Pages)、HTML ページ、または他のテンプレート エンジンによって生成されたページにすることができます。ビューは通常、ユーザーにデータを提示するためにモデル データに基づいて動的に生成されます。
-
コントローラー (コントローラー): コントローラーは、ユーザーのリクエストを処理し、モデルとビューの間の対話を調整する責任があります。ユーザーのリクエストを受け取り、適切なモデルを呼び出してデータを処理し、適切なビューを選択して結果を表示します。コントローラーは、フォーム検証、例外処理、その他のリクエスト関連のロジックも処理できます。
SpringMVC コアコンポーネント
Spring MVC フレームワークは、このモデル-ビュー-コントローラー アーキテクチャを実装するための一連のコア コンポーネントを提供します。これらには次のものが含まれます。
-
DispatcherServlet: Spring MVC のフロント コントローラーであり、すべての HTTP リクエストを受信し、それらを適切なハンドラーにディスパッチする役割を果たします。
-
HandlerMapping: リクエストを適切なハンドラー (コントローラー) にマッピングする役割を果たします。
-
コントローラー: これはハンドラーのインターフェースであり、ユーザー要求を処理し、適切なモデルとビューを返す役割を果たします。
-
ViewResolver: 論理ビュー名を実際のビュー オブジェクトに解決する役割を果たします。
-
ビュー: モデル データを最終応答結果 (JSP、HTML ページ、またはその他のタイプのビュー) にレンダリングする役割を果たします。
これらのコアコンポーネントに加えて、Spring MVC は、開発者が Web アプリケーションをより簡単に構築できるように、データバインディング、フォーム処理、ファイルアップロード、インターセプター、国際化サポートなどの他の多くの機能も提供します。
Spring MVC ワークフロー
- ユーザーがリクエストを送信するとき、最初に入力するのはフロント コントローラーの DispatcherServlet
- フロント コントローラー (DispacherServlet) は、ユーザーからのリクエストをプロセッサ マッパー (HandlerMapping) に送信します。
- プロセッサ マッパーは、フロントエンド コントローラーから送信されたユーザーのリクエストに従って、対応するコントローラー (ハンドラー) を見つけ、それをプロセッサ実行チェーンにカプセル化し、フロントエンド コントローラーに返します。
- プロセッサ アダプタは、フロント コントローラから実行チェーンを受信した後、実行チェーンに対応するプロセッサ アダプタ (HandlerAdapter) によって呼び出される特定のコントローラ (つまり、対応するメソッドまたはロジック) を見つけます。
- プロセッサ アダプタ (HandlerAdaptoer) は、対応する特定のコントローラ (ビジネス ロジックの処理) を呼び出します。
- コントローラーが実行されると、ModelAndView オブジェクトがプロセッサー アダプターに返されます。
- プロセッサ アダプタは、返された ModelAndView オブジェクトをフロント コントローラに返します (すべてのビジネス処理はここで終了し、次のステップでは結果をページの形式でユーザーに応答します)。
- フロント コントローラーは返された ModelAndView オブジェクトをビュー リゾルバー (ViewResolver) に渡し、ビュー リゾルバーは渡された View オブジェクトに従って対応するページ オブジェクトを解決します。
- ViewResolver は、カプセル化されたページ オブジェクトとモデル オブジェクトを DIspatcherServlet に返します。
- 次に、フロント コントローラーは返されたオブジェクトをビュー (View) に渡します。
- ビューは、渡された Model オブジェクトに従ってページを再度レンダリングし (モデル データをビューに入力し)、フロント コントローラーに戻ります。
- フロント コントローラーは完成した結果をブラウザーに応答し、ブラウザーはそれをユーザーに表示します。
SpringMVCエントリーケース
pom.xml 依存関係を追加
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>mybatis_spring</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>mybatis_spring Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.plugin.version>3.7.0</maven.compiler.plugin.version>
<!--添加jar包依赖-->
<!--1.spring 5.0.2.RELEASE相关-->
<spring.version>5.0.2.RELEASE</spring.version>
<!-- jstl+standard -->
<jstl.version>1.2</jstl.version>
<standard.version>1.1.2</standard.version>
<!-- spring -->
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<!--1.spring相关-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring mvc相关依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>${standard.version}</version>
</dependency>
</dependencies>
<build>
<finalName>mybatis_spring</finalName>
</build>
</project>
jstl+standard が欠落している 2 つの jar パッケージは、java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config を報告します。これは、 org.springframework.web.servlet.view.JstlView がビューの解析でこれを必要とするためです。 2 つの jar パッケージ。
spring-mvc.xml を作成する
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--1) 扫描com.zking.zf及子子孙孙包下的控制器(扫描范围过大,耗时)-->
<context:component-scan base-package="com.ycxw"/>
<!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
<mvc:annotation-driven/>
<!--3) 创建ViewResolver视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar -->
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--4) 单独处理图片、样式、js等资源 -->
<!-- <mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="WEB-INF/images/" mapping="/images/**"/>-->
</beans>
説明する:
このコードは、Spring MVC アプリケーションの XML 構成ファイルです。これは、コンポーネントのスキャン、アノテーションの駆動、ビューリゾルバー、静的リソースの処理など、Spring MVC のいくつかの基本設定を構成するために使用されます。このコードを 1 行ずつ説明します。
<context:component-scan base-package="com.ycxw"/>
: コンポーネントのスキャンを有効にし、指定されたパッケージ (ここ) とそのサブパッケージ内のすべてのクラスを Spring が自動的にスキャンし、特定のアノテーション (など)com.ycxw
を持つクラスを Spring コンテナ内の Bean として識別して登録します。@Controller
@Service
<mvc:annotation-driven/>
: Spring MVC のアノテーション駆動機能を有効にし、Spring MVC がデフォルトのプロセッサ マッピング (DefaultAnnotationHandlerMapping
) とプロセッサ アダプタ (AnnotationMethodHandlerAdapter
) を自動的に登録して、アノテーション ベースのコントローラ メソッドをサポートできるようにします。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
: ビュー リゾルバー (InternalResourceViewResolver
) Bean を定義します。これは、コントローラーから返された論理ビュー名を実際のビュー リソース (JSP ファイルなど) に解決するために使用されます。
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView">
: JSTL タグの処理に使用するクラスをviewClass
指定して、ビュー パーサーのプロパティを設定します。JstlView
<property name="prefix" value="/WEB-INF/jsp/"/>
: ビュー リゾルバーのプロパティを設定してprefix
、ビュー リソース (JSP ファイルなど) のプレフィックス パスを指定します。
<property name="suffix" value=".jsp"/>
:suffix
ビュー リゾルバーのプロパティを設定し、ビュー リソース (JSP ファイルなど) のサフィックスを指定します。
<!--4) 单独处理图片、样式、js等资源 -->
: これは、静的リソースを処理するために以下の構成が使用されることを示す注意事項です。
<!-- <mvc:resources location="/css/" mapping="/css/**"/>
: これはコメントアウトされた設定で、有効にすると、/css/
リクエスト パスが/css/
ディレクトリ内の静的リソース (CSS ファイルなど) で始まるリクエストをマップします。
<!-- <mvc:resources location="/js/" mapping="/js/**"/>
: これはコメントアウトされた構成で、有効にすると、ディレクトリ内の静的リソース (JavaScript ファイルなど)/js/
から始まるリクエスト パスにリクエストがマップされます。/js/
<!-- <mvc:resources location="WEB-INF/images/" mapping="/images/**"/>
: これはコメントアウトされた構成で、有効にすると、/images/
リクエスト パスで始まるリクエストWEB-INF/images/
がディレクトリ内の静的リソース (画像ファイルなど) にマップされます。要約すると、このコードは、コンポーネントのスキャン、アノテーションの駆動、ビュー リゾルバー、静的リソースの処理を含む、基本的な Spring MVC アプリケーションを構成します。
web.xmlを構成する
設定手順:
- Web プロジェクトと統合するように Spring を構成する
- 中国語文字化けフィルターを構成する
- SpringMVCコアコントローラーDispatcherServletを構成する
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Archetype Created Web Application</display-name>
<!-- Spring和web项目集成start -->
<!-- spring上下文配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-context.xml</param-value>
</context-param>
<!-- 读取Spring上下文的监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Spring和web项目集成end -->
<!-- 中文乱码处理 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Spring MVC servlet -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--此参数可以不配置,默认值为:/WEB-INF/springmvc-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!--web.xml 3.0的新特性,是否支持异步-->
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
ハンドラークラスを書く
package com.ycxw.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author 云村小威
* @site blog.csdn.net/Justw320
* @create 2023-09-04 20:11
*/
@Controller
public class HelloController {
@RequestMapping(value="/hello")
public String hello(){
System.out.println("调用了hello方法...");
return null;
}
}
-
@Controller
:@Controller
アノテーションを使用して、このクラスを Spring MVC コントローラーとしてマークします。このアノテーションは、このクラスが HTTP リクエストを処理することを Spring フレームワークに伝えます。 -
@RequestMapping(value="/hello")
:アノテーションを使用して、@RequestMapping
HTTP リクエスト パス (ここでは/hello
) をコントローラーのメソッド (ここではhello()
メソッド ) にマップします。このメソッドは、ユーザーが/hello
パスにアクセスしたときにhello()
呼び出されます。
hello.jsp を書く
ViewResolver ビュー リゾルバーは spring-mvc.xml ファイルで構成されています
テストを実行する
静的リソースの処理
すべてのファイルは spring-mvc.xml 設定ファイルによってインターセプトされるため、プロセッサがリソースをスキャンできるように設定を追加します。
<mvc:resources location="/static/" mapping="/static/**"/>
パスなど:
テストを実行します。