1. SpringMVCの概要
1.MVCモード
私たちがよく言うMVCは、Model、View、およびControllerの略語であり、Webアプリケーションの3つの責任を表しています。
- モデル:データをカプセル化してマッピングします。主にデータを保存し、ユーザーリクエストのビジネスロジックを処理するために使用されます。
- ビュー:インターフェイスに作業が表示されます。主にデータをコントローラーに送信し、モデルにデータを表示します。
- コントローラー:Webサイト全体のジャンプロジックの制御。ビューからの要求に応じて、どのモデルに要求とデータを渡して処理するか、どのビューを更新して処理後に関連する結果を表示するかを判断します。
サーブレットベースのMVCパターンの具体的な実装は次のとおりです。
- モデル:データの格納(エンティティモデル、JavaBeanクラスによって作成)およびビジネスロジックの処理(ビジネスモデル、一般的なJavaクラスによって作成)に使用される1つ以上のJavaBeanオブジェクト。
- ビュー:コントローラーにデータを送信し、モデルのデータ表示を提供する1つ以上のJSPページ。JSPページは主にHTMLタグとJavaBeanタグを使用してデータを表示します。
- コントローラ:1つ以上のサーブレットオブジェクトは、ビューによって送信された要求に従って制御されます。つまり、要求はビジネスロジックを処理するJavaBeanに転送され、処理結果はエンティティモデルJavaBeanに格納され、ビューに出力されます。表示用。
サーブレットベースのMVCパターンのプロセスは次のとおりです。
2. SpringMVCの概要
Springフレームワークは、Webアプリケーションを構築するためのフル機能のMVCモジュール、つまりSpringMVCを提供します。Spring MVCフレームワークは、リクエストをディスパッチするためのフロントコントローラーとしてDispatcherServletを提供します。同時に、柔軟な構成ハンドラーマッピング、ビュー分析、言語環境、テーマ分析を提供し、ファイルのアップロードをサポートします。利点は次のとおりです。
(1)役割分割の明確化:コントローラー(コントローラー)、バリデーター(バリデーター)、コマンドオブジェクト(コマンドオブジェクト)、フォームオブジェクト(フォームオブジェクト)、モデルオブジェクト(モデルオブジェクト)、サーブレットディストリビューター(DispatcherServlet)、プロセッサーハンドラーマッピング、ビューレゾラー、など。それぞれの役割は、特殊なオブジェクトによって実現できます。
(2)強力で直接的な構成方法:フレームワーククラスとアプリケーションクラスの両方をJavaBeansとして構成でき、Webコントローラー内のビジネスオブジェクトやバリデーターへの参照など、複数のコンテキストにわたる参照をサポートします。
(3)適応性があり、邪魔にならない:さまざまなアプリケーションシナリオに応じて、単一のコントローラー(アクションなど)の代わりに、コントローラーサブクラス(シンプルタイプ、コマンドタイプ、タイプ、ウィザードタイプ、マルチアクションタイプ、またはカスタム)を選択できます。 / ActionForm)継承します。
(4)再利用可能なビジネスコード:特定のフレームワークの基本クラスを拡張することなく、既存のビジネスオブジェクトをコマンドまたはフォームオブジェクトとして使用できます。
(5)カスタマイズ可能なバインディングと検証:たとえば、タイプの不一致はアプリケーションレベルの検証エラーと見なされ、間違った値を保証する可能性があります。もう1つの例は、ローカライズされた日付と番号のバインドなどです。他のいくつかのフレームワークでは、文字列フォームオブジェクトのみを使用でき、手動で解析してビジネスオブジェクトに変換する必要があります。
(6)カスタマイズ可能なハンドラーマッピングとビュー解決: Springは、最も単純なURLマッピングから、複雑で専用のカスタマイズされた戦略までを提供します。開発者に単一の特定のテクノロジーの使用を強制するいくつかのWebMVCフレームワークと比較して、Springはより柔軟性があります。
(7)柔軟なモデル変換: Springwebフレームワークでは、マップベースのキーと値のペアを使用して、さまざまなビューテクノロジーとの統合を容易にします。
(8)カスタマイズ可能なローカリゼーションとテーマ(テーマ)分析: JSPでのSpringタグライブラリのオプション使用のサポート、JSTLのサポート、Velocityのサポート(追加の中間層は不要)など。
(9)シンプルで強力なJSPタグライブラリ(Springタグライブラリ):サポートには、データバインディングやテーマなどの多くの機能が含まれます。彼はマーキングに最大限の柔軟性を提供します。
(10)JSPフォームタグライブラリ: Spring 2.0で導入されたフォームタグライブラリにより、JSPでのフォームの記述が容易になります。
(11)Spring Beanのライフサイクル:現在のHTTPリクエストまたはHTTPセッションに制限できます。正確には、これはSpring MVCフレームワーク自体の機能ではありませんが、SpringMVCで使用されるWebApplicationContextコンテナーに属している必要があります。
2、SpringMVCエントリーケース
1.helloWorldプログラムのデモンストレーション
(1)Mavenプロジェクトを作成し、jarパッケージをpom.xmlにインポートします。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
(2)web.xmlファイルで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_4_0.xsd"
version="4.0">
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- 指定Spring MVC配置文件的位置 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--
Servlet一般都是在第一次访问时才加载,此配置表明容器在启动时就立即加载Servlet
load-on-startup:服务器启动时创建对象,值越小优先级越高,越先创建对象
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!--
/*和/都是拦截所有请求
/*:拦截到所有的请求,包括jsp,如果不写,默认值
/:拦截除*.jsp之外的所有请求
-->
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
(3)index.jspにハイパーリンクジャンプを追加し、WEB-INFの下にpagesディレクトリを作成してhelloPage.jspを確立します。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首页</title>
</head>
<body>
<%--SpringMVCStudy_war/--%>
<a href="${pageContext.request.contextPath}/hello">你好</a>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>helloPage</title>
</head>
<body>
<h3>我是helloPage,你好</h3>
</body>
</html>
(4)HelloControllerクラスを作成します
@Controller
public class HelloController {
@RequestMapping("/hello")
public String sayHello(){
System.out.println("我是控制台输出");
return "helloPage";
}
}
(5)resourcesディレクトリに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:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
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.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 配置注解扫描的包 -->
<context:component-scan base-package="com.yht.example1"></context:component-scan>
<!-- 配置视图解析器 :拼接页面地址 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 访问路径的前缀 -->
<property name="prefix" value="/WEB-INF/pages/"></property>
<!-- 文件后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
説明:ビューパーサーはSpringMVCの重要な部分です。prefix= / WEB-INF / pages /、suffix = .jspは、ビューパーサーを構成することにより、上記の構成ファイルで定義されます。index.jspのジャンプをクリックして、コントロールレイヤーに送信されるhelloリクエストをリクエストし、sayHello()を介してターゲットページの名前を返します。ここで、プレフィックスとサフィックスはスペル操作を形成するために使用されます(/ WEB-INF / pages / helloPage .jsp)そしてクライアントに戻ります。
(6)Tomcatサーバーを構成し、プロジェクトを開始します。
起動後、インデックスインターフェイスが表示されたら、ハイパーリンクをクリックします。
2.問題の要約
(1)springmvc.xml構成ファイルの説明。
web.xmlでサーブレットを構成するときにspringmvc.xmlのパスを指定しない場合、dispatcherServlet-servlet.xmlという名前の構成ファイルがデフォルトでWEB-INFディレクトリにあります。エラーメッセージは次のとおりです。
org.springframework.beans.factory.BeanDefinitionStoreException:ServletContextリソースからXMLドキュメントを解析するIOException [/WEB-INF/dispatcherServlet-servlet.xml]; ネストされた例外はjava.io.FileNotFoundExceptionです:
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:344)でServletContextリソース[/WEB-INF/dispatcherServlet-servlet.xml]を開くことができませんでした
解決策1:init-paramでspringmvc.xmlのパスを指定します。
解決策2:WEB-INFディレクトリにdispatcherServlet-servlet.xmlを作成します
(2)解析エラー:$%7BpageContext.request.contextPath%7D。
以下に示すように、pageContextは$%7BpageContext.request.contextPath%7Dとして解析されます。
理由:archetype-webappによって生成されたWebプロジェクト。作成されたデフォルトのWebバージョンは2.3ですが、これは低すぎます。
解決策:バージョンを次のような上位バージョンに変更します:4.0
<?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_4_0.xsd"
version="4.0">
</web-app>
(3)出出问题:「dispatcherServlet」という名前のDispatcherServletにURI [/ SpringMVCStudy_war /]のHTTPリクエストのマッピングが見つかりません
理由:web.xmlのdispatcherServlet構成が正しくありません。/ *はすべてに一致することを意味するため、すべての着信パスが一致してからDispatcherServletに渡されて処理されます。「/」は、DispatcherServletがデフォルトのサーブレットとして使用され、他のすべてのパスマッピングが一致せずに渡されることを意味します。処理用です。
間違った構成:
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern></url-pattern>
</servlet-mapping>
正しい構成:
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3、SpringMVCワークフローの理解
1.一般的なコンポーネント
(1)DispatcherServlet:プロセス制御全体の中心であるフロントコントローラーとして、他のコンポーネントの実行、統一されたスケジューリングを制御し、コンポーネント間の結合を減らし、各コンポーネントのスケーラビリティを向上させます。ユーザーの要求がフロントコントローラーに到達すると、dispatcherServletは他のコンポーネントを呼び出してユーザーの要求を処理し、次の操作を決定します。
(2)ViewResolver:ビューの解決を実行し、論理ビュー名に基づいて実際のビューに解決します。ViewResolverは、処理結果からビュービューを生成する役割を果たします。最初に、論理ビュー名に従って物理ビュー名(つまり、ページの特定のアドレス)を解決し、次にビュービューオブジェクトを生成し、最後にビューを次のようにレンダリングします。ページを介してユーザーに処理結果を表示します。
(3)HandlerMapping:HandlerMappingは、ユーザーの要求に応じてHandlerプロセッサーを見つける役割を果たします。SpringMVCは、構成ファイル・モード、実装インターフェース・モード、注釈モードなど、さまざまなマッピング方法を実装するためのさまざまなマッパーを提供します。
(4)HandlAdapter:特定のルールに従ってHandlerを実行します。ここではアダプターモードを具体化しており、アダプターを拡張することでより多くのタイプのプロセッサーを実行できます。
2.ワークフロー
SpringMVCの動作原理図は次のとおりです。
上の図からわかるように、SpringMVC作業の具体的な手順は次のとおりです。
(1)ユーザーはフロントコントローラーDispatcherServletにリクエストを送信します。(index.jspのハイパーリンクをクリックして、/ helloのリクエストを開始します)
(2)DispatcherServletは、HandlerMappingプロセッサマッパーを呼び出す要求を受け取ります。(web.xmlで構成されたdispatcherServlet)
(3)プロセッサマッパーは特定のプロセッサを見つけ(xml構成とアノテーションに従って見つけることができます)、プロセッサオブジェクトとプロセッサインターセプター(存在する場合)を生成し、それをDispatcherServletに返します。
(4)DispatcherServletは、HandlerAdapterプロセッサアダプタを呼び出します。
(5)HandlerAdapterは、アダプテーションを通じて特定のプロセッサー(コントローラー、バックエンドコントローラーとも呼ばれます)を呼び出します。(HelloControllerに移動して、/ hello要求を処理できるかどうかを確認してください)
(6)コントローラーの実行が完了し、ModelAndViewに戻ります。(WEB-INF / pages / helloPage.jspを返します)
(7)HandlerAdapterは、コントローラーの実行結果ModelAndViewをDispatcherServletに返します。
(8)DispatcherServletはModelAndViewをViewResloverビューリゾルバーに渡します。
(9)ViewResloverは、解析後に特定のビューに戻ります。
(10)DispatcherServletは、ビューに従ってビューをレンダリングします(つまり、モデルデータをビューに入力します)。
(11)DispatcherServletはユーザーに応答します。