1. SpringMVC とは何ですか?
SpringMVC は、Spring が提供する強力かつ柔軟な Web フレームワークです。アノテーションの助けを借りて、Spring MVC はほぼ POJO 開発モデルを提供します [POJO は、単純な Java オブジェクト (Plain Old Java Objects、純粋な古い Java オブジェクト、または単純な通常の Java オブジェクト) を指します。POJO の本質的な意味は、どのクラスからも継承せず、どのインターフェースも実装せず、他のフレームワークによって侵入されていない Java オブジェクトを指します。POJO を使用すると、開発者はフレームワークの外でビジネス ロジックと単体テストに集中できます。POJO は通常の Java クラスとみなすことができ、シンプルで柔軟かつ拡張可能なプログラミング モデルを備えているため、開発者はフレームワーク関連の仕様や制約をあまり考慮することなくビジネス ロジックの実装に集中でき、コントローラーの開発とテストが可能になります。のほうが簡単です。これは、MVC 設計モデルを実装する Java ベースのリクエスト駆動型の軽量 Web フレームワークです。Spring Framework のフォローアップ製品であり、Spring Web Flow に統合されています。SpringMVC は、責任のあるコントローラーとして考えることができます。ユーザーを処理するための要求と応答を返します。SpringMVCではコントローラー、ビュー、モデルが分離されています。コントローラーはユーザーのリクエストを処理して応答を返す役割を果たし、ビューはデータを表示する役割を担い、モデルはデータを保存する役割を担います。
2. SpringMVC を使用する理由
明確な役割分担: SpringMVC は、コントローラー、バリデーター、コマンド オブジェクト、フォーム オブジェクト、モデル オブジェクト、サーブレット ディストリビューター (DispatcherServlet)、プロセッサー (ハンドラー マッピング)、ビュー リゾルバーなどをマップします。各役割は 1 つ以上のコンポーネントで実装できるため、開発者はビジネス ロジックの実装に集中できるようになります。
構成は不要: SpringMVC は典型的な軽量 MVC フレームワークであり、以前の struts2 フレームワークと比較して、SpringMVC はより高速に実行され、アノテーションベースの開発はより効率的かつ柔軟です。Springフレームワークとシームレスに統合可能
コードの高い再利用性: SpringMVC は RESTful スタイルの URL 設計とパラメーターの受け渡しをサポートしているため、コードが非常に読みやすく、保守しやすくなります。
テストが簡単: SpringMVC は JUnit や Mockito などのテスト フレームワークをサポートしているため、開発者にとって単体テストがより便利になります。
3. SpringMVC ワークフロー [超詳細なフローチャート付き]
プロセスの説明:
-
ユーザーがリクエストを送信すると、最初にフロントエンド コントローラー DispatcherServlet が入力されます。
-
フロントエンド コントローラー (DispacherServlet) は、ユーザーからのリクエストをプロセッサ マッパー (HandlerMapping) に送信します。
-
プロセッサ マッパーは、フロントエンド コントローラーから送信されたユーザーのリクエストに従って、対応するコントローラー (ハンドラー) を見つけ、それをプロセッサ実行チェーンにカプセル化してフロントエンド コントローラーに返します。
-
プロセッサ アダプタは、フロントエンド コントローラから実行チェーンを受信した後、この実行チェーンを実行するプロセッサ アダプタ (HandlerAdapter) によって呼び出される特定のコントローラ (つまり、対応するメソッドまたはロジック) を見つけます。
-
ハンドラー アダプター (HandlerAdaptoer) は、対応する特定のコントローラー (ビジネス ロジックの処理) を呼び出します。
-
コントローラーが実行されると、ModelAndView オブジェクトがプロセッサー アダプターに返されます。
-
プロセッサ アダプタは、返された ModelAndView オブジェクトをフロントエンド コントローラに返します (すべてのビジネス処理プロセスはここで完了し、次のステップはページの形式でユーザーに応答することです)。
-
フロントエンド コントローラーは返された ModelAndView オブジェクトをビュー リゾルバー (ViewResolver) に渡し、ビュー リゾルバーは渡された View オブジェクトを対応するページ オブジェクトに解析します。
-
ViewResolver は、カプセル化されたページ オブジェクトとモデル オブジェクトを DISpatcherServlet に返します。
-
フロントエンド コントローラーは、返されたオブジェクトをビュー (View) に渡します。
-
ビューは、渡された Model オブジェクトに基づいてページを再度レンダリングし (ビューにモデル データを埋め込み)、それをフロントエンド コントローラーに返します。
-
フロントエンド コントローラーは完成した結果をブラウザーに応答し、ブラウザーはそれをユーザーに表示します。
4. SpringMVC コアコンポーネント
ディスパッチャサーブレット
DispatcherServlet は SpringMVC フレームワークのフロントエンド コントローラーです
機能: ユーザーからのリクエストとレスポンスを一元的に処理し、中間コンバータに相当し、さまざまなコンポーネント間のスケジューリングを削減し、カップリングを削減します。
ハンドラーマッピング
HandlerMapping は SpringMVC フレームワークのプロセッサ マッパーです。
機能: リクエストによって送信された URL とメソッドに従って、対応するハンドラーを検索します (つまり、SpringMVC フレームワークを使用するプロジェクトには多くのメソッドとロジックが存在します。このコンポーネントの機能は、対応するメソッドとコンポーネントを検索して返すことです)フロントエンドコントローラーに送信されます)
ハンドラ
ハンドラー プロセッサーは、エンジニア自身が開発する必要があることに注意してください。
機能: DispatcherServlet の制御下で、Handler は特定のユーザー要求を処理します。
ハンドラーアダプター
HandlerAdapter は、SpringMVC フレームワークによって提供されるプロセッサ アダプターです。
機能: マッパーによって検出されたプロセッサ ハンドラ情報に基づいて、特定のルールに従って関連するプロセッサ ハンドラを実行します。
ビューリゾルバー
ViewResolver は、SpringMVC フレームワークによって提供されるビュー リゾルバーです。
機能: 名前が示すように、処理結果をビューに解析してユーザーに表示するために使用されます。ビュー パーサーは、論理ビュー名を物理ビュー名に解析し、View オブジェクトを生成し、最後にビューをレンダリングしてユーザーに応答します。
ビュー
ビューは開発者自身が提供するビューです
機能: モデル オブジェクトの要件に従ってページをレンダリングし、フロントエンド コントローラーがユーザーに応答します。
5. SpringMVC の小さな入門ケース
pom.xml は関連する依存関係をインポートします
<!-- jstl-->
<jstl.version>1.2</jstl.version>
<!-- standard -->
<standard.version>1.1.2</standard.version>
<!-- spring -->
<spring.version>5.0.2.RELEASE</spring.version>
<!-- 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>
springmvc.xmlを作成する
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/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"
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.liwen"/>
<!--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>
web.xmlを構成する
<?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>
5.1. SpringMVC アノテーションを使用して Web 層を設定する
package com.liwen.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/mvc")
public class Springmvc1 {
@RequestMapping("/print")
public String test(){
return "hello";
}
}
jspページ
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>SpringMVC测试</title>
</head>
<body>666</body>
</html>
6. SpringMVC のアノテーション
- 1. @Controller: クラスをマークするために使用され、これでマークされたクラスは SpringMVC コントローラー オブジェクトです。ディスパッチ プロセッサは、このアノテーションを使用してクラスをスキャンし、それをコントローラとして登録します。
- 2. @RequestMapping: リクエストのパスとリクエストを処理するメソッドをマッピングするために使用されます。
- 3. @RequestParam: リクエストパラメータから値を取得するために使用され、パラメータの名前、必須かどうか、デフォルト値などを指定できます。
- 4. @PathVariable: URL 内のパラメータ値を取得するために使用され、パラメータの名前を指定できます。
- 5. @ModelAttribute: リクエストパラメータをモデルオブジェクトにバインドするために使用されます。
- 6. @RequestBody: リクエスト本文のデータをメソッドのパラメータにバインドするために使用されます。
- 7. @ResponseBody: メソッドの戻り値を応答本文にバインドするために使用されます。
7. SpringMVC は静的リソースを処理します
静的リソースにアクセスできない場合は、DispatcherServlet がすべてのリクエストと静的リソースへのアクセスをインターセプトするため、次の行を追加してください。
<mvc:resources location="/static/" mapping="/static/**"/>