SpringMVCの詳細解説(超徹底)

目次

1. SpringMvc の概要

1. MVC パターンを確認する

1.1 コンセプト

MVC デザイン パターンは一般に MVC フレームワークを指し、M (モデル) はデータ モデル層を指し、V (ビュー) はビュー層を指し、C (コントローラー) はコントロール層を指します。MVCを使用する目的は、MとVの実装コードを分離し、同じプログラムでも異なる表現ができるようにすることです。その中でも、View の定義は比較的明確であり、ユーザー インターフェイスです。

Web プロジェクトの開発では、ユーザーのリクエストにタイムリーかつ正確に対応できることが非常に重要です。ユーザーが Web ページ上の URL パスをクリックすることは、ユーザーが Web サーバーにリクエストを送信することと同じです。リクエストを取得した後、ユーザーの入力を解析し、関連する処理ロジックを実行し、最終的に正しいページにジャンプしてフィードバック結果を表示する方法は、多くの場合、制御層 (コントローラー) によって実行されます。

リクエスト プロセス中に、ユーザーの情報は、Web プロジェクトのデータ モデル レイヤー (モデル) に属する User エンティティ クラスにカプセル化されます。

リクエスト表示ステージでは、リダイレクトされた結果Webページはビュー層(View)に属します。

このように、コントロール層は前景と背景の間の相互作用を担当し、データモデル層はユーザーの入出力データをカプセル化し、ビュー層は最終的な実行結果を表示するために適切なビューを選択します。開発・処理の流れをMVCパターンと呼びます。

サーブレットやJSPの開発を学ぶ場合、JavaBeanはModel、サーブレットはController、JSPはViewに相当します。

要約すると次のようになります。

  • ビュー層 (View): データの表示、ユーザー操作、データ検証、インターフェイス設計、その他の機能を含む、データのフォーマットとユーザーへの表示を担当します。
  • 制御層 (コントローラー): リクエストの処理後、リクエストの受信と転送、ビューの指定、および応答結果のクライアントへの送信を担当します。
  • データ モデル層 (モデル): モデル オブジェクトには最も多くの処理タスクがあり、アプリケーションの主要部分であり、データ ロジック (ビジネス ルール) の処理とデータ操作の実現 (つまり、データ モデル内のデータへのアクセス) を担当します。データベース)。

1.2 メリットとデメリット

どのようなものにも長所と短所があります。MVC の長所と短所を見てみましょう。

1.2.1 利点

  • 複数のビューがモデルを共有し、コードの再利用性が大幅に向上します
  • MVC の 3 つのモジュールは互いに独立しており、疎結合アーキテクチャです。
  • コントローラーによりアプリケーションの柔軟性と構成可能性が向上します
  • ソフトウェアエンジニアリング管理に役立つ

つまり、MVC 設計パターンを通じて、疎結合 + 高い再利用性 + 高い適用性の完璧なアーキテクチャを最終的に作成することができます。

1.2.2 欠点

  • 原理は複雑です
  • システムの構造と実装の複雑さの増加
  • ビューからモデル データへのアクセスが非効率的になる

2. Spring MVCの概念

1.コンセプト

  • Spring MVC は、Spring が提供する MVC 設計パターンに基づく軽量の Web 開発フレームワークであり、本質的にはサーブレットと同等です。
  • Spring MVC は、Servlet+JSP+JavaBean の最も明確に構造化された実装です。
  • Spring MVC 自体は Spring フレームワークの一部であるため、Spring フレームワークとシームレスに統合されていると言えます。これはパフォーマンスの面で固有の利点があり、現在業界で最も主流の Web 開発フレームワークであり、最も人気のある開発スキルです。
  • Spring MVCフレームワークでは、Servletの代わりにControllerがリクエストを受け取り、対応するModelを呼び出して処理し、プロセッサが業務処理を完了した後に処理結果を返す役割を担う。Controller は対応する View を呼び出して処理結果をレンダリングし、最終的にクライアントは応答情報を取得します。
  • Spring MVC のアノテーション駆動型および RESTful サポート。

2. 利点

  • 明確な役割分担、Spring MVC はモデル、ビュー、コントローラーに関して非常に明確な役割分担を提供しており、これら 3 つの側面が実際にその役割を果たし、それぞれに対して責任を負います。
  • 柔軟な設定機能により、クラスをXML経由でBeanとして設定できます。
  • コントローラインタフェースと実装クラスが多数提供されており、開発者はSpringが提供するコントローラ実装クラスを利用することも、開発者が独自にコントローラインタフェースを実装することも可能である。
  • 実際には、ビュー層の実装とは何の関係もありません。開発者に JSP の使用を強制するわけではありませんが、プロジェクトの要件に応じて Velocity や FreeMarker などのテクノロジを使用できます。
  • 国際化のサポート
  • インターフェースへのプログラミング
  • Springフレームワークとのシームレスな統合

3. 最初の Spring MVC プログラム

3.1 使用手順

3.1.1 Web アプリケーションの作成と依存関係のインポート

<properties>
    <!-- spring版本号 -->
    <spring.version>4.0.2.RELEASE</spring.version>
    <!-- log4j日志文件管理包版本 -->
    <slf4j.version>1.7.7</slf4j.version>
    <log4j.version>1.2.17</log4j.version>
  </properties>
  <!--依赖-->
  <dependencies>
    <!-- junit -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>
    <!-- JSTL标签类 -->
    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    <!-- servlet依赖的jar包start -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.1</version>
    </dependency>
    <!-- 映入JSON -->
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-core-asl</artifactId>
      <version>1.9.4</version>
    </dependency>
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-asl</artifactId>
      <version>1.9.4</version>
    </dependency>
    <!-- spring核心包 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</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-oxm</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-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!-- 日志 -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>${log4j.version}</version>
    </dependency>
    <!-- 格式化对象,方便输出日志 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.1.41</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
    <!--lombok-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.12</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.4</version>
    </dependency>
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.2.2</version>
    </dependency>
  </dependencies>
  <build>
    <!--resources配置解决mybatis的mapperXml配置在java路径不被扫描的问题 -->
    <resources>
      <resource>
        <directory>src/main/java</directory>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      <!-- 跳过测试 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <skipTests>true</skipTests>
        </configuration>
      </plugin>
    </plugins>
  </build>

3.1.2 Spring MVC の設定

Spring MVC はサーブレットに基づいており、DispatcherServlet は Spring MVC フレームワーク全体の中核であり、主にリクエストをインターセプトし、リクエストを処理のために対応するプロセッサにディスパッチする役割を果たします。したがって、Spring MVC を構成するには、まず DispatcherServlet を定義する必要があります。すべてのサーブレットと同様に、ユーザーは web.xml で設定する必要があります。

メインディレクトリの下にjavaディレクトリとリソースディレクトリを作成します。

3.1.2.1 DispatcherServlet (web.xml) の定義
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
  <!-- 部署 DispatcherServlet -->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:config/springmvc-servlet.xml</param-value>
    </init-param>
    <!-- 表示容器再启动时立即加载servlet -->
    <load-on-startup>1</load-on-startup>
    <!--支持异步处理-->
    <async-supported>true</async-supported>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!-- 处理所有URL -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

予防:

  1. Spring MVC が初期化されると、アプリケーションの WEB-INF ディレクトリで設定ファイルが検索され、設定ファイルの命名規則は "servletName-servlet.xml" (springmvc-servlet.xml など) になります。
  2. Spring MVC 設定ファイルをアプリケーション ディレクトリ内の任意の場所に保存することもできますが、サーブレットの init-param 要素を使用して設定ファイルをロードし、contextConfigLocation パラメータを通じて Spring MVC 設定ファイルの場所を指定する必要があります。
<!-- 部署 DispatcherServlet -->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:config/springmvc-servlet.xml</param-value>
    </init-param>
    <!-- 表示容器再启动时立即加载servlet -->
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
3.1.2.2 コントローラの作成

src ディレクトリに com.hqyj.cl.controller パッケージを作成し、パッケージ内に 2 つの従来型のコントローラ クラス (Controller インターフェイスを実装)、RegisterController と LoginController を作成して、ホームページからそれぞれリクエストしてください。Controller はコントローラー インターフェイスであり、インターフェイスにはメソッド handleRequest が 1 つだけあり、リクエストを処理して ModelAndView を返すために使用されます。

  1. ログインコントローラー
public class LoginController implements Controller {
    
    
    public ModelAndView handleRequest(HttpServletRequest arg0,
                                      HttpServletResponse arg1) throws Exception {
    
    
        return new ModelAndView("/WEB-INF/jsp/login.jsp");   //注意文件路径是否在WEB-INF文件夹中
    }
}
  1. レジスタコントローラ
public class RegisterController implements Controller {
    
    
    public ModelAndView handleRequest(HttpServletRequest arg0,
                                      HttpServletResponse arg1) throws Exception {
    
    
        return new ModelAndView("/WEB-INF/jsp/register.jsp");
    }
}
3.1.2.3 Spring MVC設定ファイルの作成

springmvc-servlet.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"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- LoginController控制器类,映射到"/login" -->
    <bean name="/login"
          class="com.hqyj.cl.controller.LoginController"/>
    <!-- LoginController控制器类,映射到"/register" -->
    <bean name="/register"
          class="com.hqyj.cl.controller.RegisterController"/>
</beans>
3.1.2.4 ページの作成
  1. インデックス.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h2>Hello World!</h2>
未注册的用户,请
<a href="${pageContext.request.contextPath}/register"> 注册</a>!
<br /> 已注册的用户,去
<a href="${pageContext.request.contextPath}/login"> 登录</a>!
</body>
</html>
  1. ログイン.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>login</title>
</head>
<body>
login
</body>
</html>
  1. register.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>register</title>
</head>
<body>
register
</body>
</html>
3.1.2.5 Tomcat サーバーの構成

わずかに

3.1.2.6 テスト

わずかに

2. Spring MVC ビューリゾルバー (ViewResolver)

ビュー・リゾルバー (ViewResolver) は Spring MVC の重要な部分であり、論理ビュー名を特定のビュー・オブジェクトに解決する役割を果たします。

1. よく使用されるビュー分析クラス

1.1 URLBasedViewResolver

1.1.1 概要

UrlBasedViewResolver は ViewResolver の単純な実装であり、主に URL を結合してビューを解決する方法を提供します。

1.1.2 原則

UrlBasedViewResolver は prefix 属性を通じてプレフィックスを指定し、suffix 属性はサフィックスを指定します。ModelAndView オブジェクトが特定のビュー名を返すと、プレフィックス接頭辞と接尾辞サフィックスを特定のビュー名と連結してビュー リソース ファイルの特定のロード パスを取得し、それによって実際のビュー ファイルをロードしてユーザーにフィードバックします。

1.1.3 構成

UrlBasedViewResolver を使用するには、プレフィックス属性とサフィックス属性の構成に加えて、解決するビューを示す「viewClass」も構成する必要があります。サンプルコードは次のとおりです

<!--配置视图解析器之URLBasedViewResolver-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <!--不能省略-->
    <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView"/>
    <!--前缀-->
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <!--后缀-->
    <property name="suffix" value=".jsp"/>
</bean>
1.1.3.1 説明
  • 上記のビュー リゾルバーは、ビュー パスを短縮する 2 つの属性、プレフィックスとサフィックスで構成されています。最初の Spring MVC プログラムの RegisterController コントローラー クラスと LoginController コントローラー クラスのビュー パスは、登録とログインを提供するだけで済みます。ビュー リゾルバーによってプレフィックスとサフィックスが自動的に追加され、ここでは /WEB-INF/jsp/register として解決されます。 jsp および /WEB-INF/jsp/login.jsp。
  • UrlBasedViewResolver を使用する場合は、解決するビューを示す属性 viewClass を指定する必要があります。一般に、jsp を表示するには InternalResourceView がよく使用されますが、JSTL を使用する場合は、JstlView を使用する必要があります。
  • /WEB-INF/ ディレクトリに格納されているコンテンツは、リクエストリクエストを通じて直接取得できないため、セキュリティ上の理由から、通常、jsp ファイルは WEB-INF ディレクトリに配置されます。

1.2 InternalResourceViewResolver

1.2.1 概要

InternalResourceViewResolver は「内部リソース ビュー リゾルバー」であり、日常の開発で最も一般的に使用されるビュー リゾルバー タイプです。これは URLBasedViewResolver のサブクラスであり、URLBasedViewResolver のすべての機能を備えています。

1.2.2 原則

UrlBasedViewResolver は prefix 属性を通じてプレフィックスを指定し、suffix 属性はサフィックスを指定します。ModelAndView オブジェクトが特定のビュー名を返すと、プレフィックス接頭辞と接尾辞サフィックスを特定のビュー名と連結してビュー リソース ファイルの特定のロード パスを取得し、それによって実際のビュー ファイルをロードしてユーザーにフィードバックします。

1.2.3 構成

UrlBasedViewResolver を使用する プレフィックス属性とサフィックス属性の構成に加えて、解決するビューを示すために「viewClass」を構成する必要もあります。サンプルコードは次のとおりです

<!--配置视图解析器之InternalResourceViewResolver-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--可以省略-->
    <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView"/>
    <!--前缀-->
    <property name="prefix" value="/WEB-INF/jsp/"/>    <!--注意路径-->
    <!--后缀-->
    <property name="suffix" value=".jsp"/>
</bean>
1.2.3.1 説明
  • InternalResourceViewResolver は、返されたビュー名を InternalResourceView 型のオブジェクトに自動的に解決できます。
  • InternalResourceView は、コントローラー プロセッサ メソッドによって返されたモデル属性を対応するリクエスト属性に格納し、RequestDispatcher を通じてリクエスト フォワードをサーバー側のターゲット URL にリダイレクトします。つまり、InternalResourceViewResolver を使用してビューを解決する場合、viewClass 属性を個別に指定する必要はありません。

3. Spring MVCの実行処理

1. 実行フローチャート

[外部リンク画像の転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-UPAiYIZX-1682512822611) (G:\Desktop\Lesson Preparation\Class\ssm\)コースウェア マップ\Spring MVC 実行フローチャート .png)]

2. 実行プロセスの概要

SpringMVCの実行フローは以下の通り

  1. ユーザーはリクエスト パスをクリックして HTTP リクエスト リクエストを開始します。このリクエストは DispatcherServlet (フロント コントローラ) に送信されます。
  2. DispatcherServlet は 1 つ以上の HandlerMapping (プロセッサ マッパー) を要求し、実行チェーン (HandlerExecutionChain) を返します。
  3. DispatcherServlet は、実行チェーンによって返されたハンドラー情報を HandlerAdapter (プロセッサーアダプター) に送信します。
  4. HandlerAdapter は、ハンドラー情報に従って、対応するハンドラー (コントローラーと呼ばれることが多い) を見つけて実行します。
  5. Handler が実行されると、ModelAndView オブジェクトが HandlerAdapter (Model データ モデルと View ビュー情報を含む Spring MVC の基礎となるオブジェクト) に返されます。
  6. HandlerAdapter は ModelAndView オブジェクトを受信した後、それを DispatcherServlet に返します。
  7. DispatcherServlet が ModelAndView オブジェクトを受信すると、ViewResolver (ビュー リゾルバー) にビューを解決するよう要求します。
  8. ViewResolver は、View 情報に従って、対応するビュー結果を照合し、それを DispatcherServlet に返します。
  9. 特定の View ビューを受信した後、DispatcherServlet はビューをレンダリングし、Model 内のモデル データを View ビューのリクエスト フィールドに入力し、最終的な View (ビュー) を生成します。
  10. ビューは、結果をブラウザ (クライアント) に表示する役割を果たします。

3. Spring MVCインターフェイス

Spring MVC に関係するコンポーネントは、DispatcherServlet (フロント コントローラー)、HandlerMapping (プロセッサ マッパー)、HandlerAdapter (プロセッサ アダプター)、Handler (プロセッサ)、ViewResolver (ビュー リゾルバー)、および View (ビュー) です。各コンポーネントの機能説明は次のとおりです

3.1 Dispatcherサーブレット

DispatcherServlet はフロント コントローラーであり、図 1 からわかるように、Spring MVC のすべてのリクエストは DispatcherServlet を通じて均一に分散される必要があります。

DispatcherServlet はフォワーダーまたは中央処理装置に相当し、プロセス全体の実行を制御し、各コンポーネントを均一にスケジュールして、コンポーネント間の結合を減らし、コンポーネント間の拡張を容易にします。

3.2 ハンドラーのマッピング

HandlerMapping はプロセッサ マッパーであり、その機能は、リクエストの URL パスに従って、アノテーションまたは XML 構成を通じて一致するハンドラー (Handler) を見つけることです。

3.3 ハンドラーアダプター

HandlerAdapter はプロセッサ アダプタであり、その機能はマッパーによって検出されたプロセッサ (Handler) に従って、特定の規則に従って関連するプロセッサ (Handler) を実行することです。

サーブレット段階では、サーブレットに対応するリクエストを解決するために、2つの方法があります

1. メソッドがパラメータを渡すときに、もう 1 つ渡して、対応するサーブレット メソッドを見つけます。

2. httpsservlet の継承に使用されるbaseServlet をカプセル化し、動作中にリフレクションを通じて呼び出します。後で定義されるサーブレットは、baseServlet を継承します。

3.4 ハンドラー

ハンドラーは、Java サーブレットが果たす役割と一致するプロセッサーであり、コントローラーとも呼ばれます。その機能は、関連するリクエスト処理ロジックを実行し、対応するデータと表示情報を返し、それを ModelAndView オブジェクトにカプセル化することです。

3.5 ビューリゾルバー

ビュー リゾルバーはビュー リゾルバーであり、その役割は解析操作を実行し、ModelAndView オブジェクト内のビュー情報を通じて論理ビュー名を実際のビュー ビューに解決することです (JSP パスを通じて実際の JSP ページを返すなど)。

3.6 ビュー

View はビューであり、それ自体がインターフェイスであり、実装クラスはさまざまな View タイプ (JSP、FreeMarker、Thymeleaf など) をサポートします。

四、@Controller、@RequestMapping

Spring バージョン 2.5 では、従来の XML ベースの Spring MVC 構成を置き換える Spring MVC アノテーション機能が追加されています。

1. アノテーションを使用するメリット

  • アノテーションベースのコントローラクラスには複数の処理メソッドを記述でき、複数のリクエスト(アクション)を処理できるため、関連する操作を同じコントローラクラスに記述することができるため、コントローラクラスの数が減り、後のメンテナンスが容易になります。 。
  • 注釈ベースのコントローラーでは、構成ファイルにマッピングをデプロイする必要はありませんが、 @RequestMapping を使用してリクエスト処理のメソッドに注釈を付けるだけで済みます。

2、@コントローラー

@Controller アノテーションは、クラスのインスタンスがコントローラーであることを宣言するために使用されます。

2.1 使用手順

  1. コントローラークラスにアノテーションを追加する
package com.hqyj.cl.controller;

import org.springframework.stereotype.Controller;

@Controller
public class AnnotationTest {
    
    
    // 方法代码
}
  1. springmvc-servlet.xml 構成パッケージのスキャン

Spring MVC はスキャン メカニズムを使用して、アプリケーション内のすべてのアノテーション ベースのコントローラー クラスを検索します。したがって、コントローラー クラスが Spring MVC フレームワークによってスキャンされるようにするには、設定ファイルで spring-context を宣言し、要素を使用する必要があります。コントローラー<context:component-scan/>クラスの基本パッケージを指定します (すべてのコントローラー クラスが基本パッケージとそのサブパッケージの下にあることを確認してください)。

<!-- 使用扫描机制扫描控制器类,控制器类都在com.hqyj.controller包及其子包下 -->
<context:component-scan base-package="com.hqyj.controller" />

3、@RequestMapping

  • UserControllerではユーザーの追加、ユーザー情報の変更、指定したユーザーの削除、条件に応じたユーザー一覧の取得など、コントローラーでのリクエストの処理方法は複数あります。各メソッドはさまざまなリクエスト操作を担当し、@RequestMapping はリクエストを対応するコントローラー メソッドにマッピングします。
  • @RequestMapping アノテーションはクラスまたはメソッドで使用できます。クラスで使用すると、リクエストに応答するクラス内のすべてのメソッドがこのアドレスを親パスとして使用することを意味します。

3.1 共通の属性

3.1.1 値属性

value 属性は @RequestMapping アノテーションのデフォルトの属性であるため、value 属性のみの場合は属性名を省略できますが、他の属性がある場合は value 属性名を記述する必要があります。

3.1.1.1 サンプルコード
@RequestMapping(value="user")
@RequestMapping("user")

3.1.2 パス属性

value 属性と同じ使用法

3.1.3 名前属性

name 属性はメソッドのコメントに相当し、メソッドを理解しやすくします。

3.1.3.1 コード例
@RequestMapping(value = "user",name = "用户操作")

3.1.4 メソッド属性

Method 属性は、メソッドによってどの HTTP リクエストがサポートされているかを示すために使用されます。Method 属性を省略した場合、メソッドはすべての HTTP リクエストをサポートします。

3.1.4.1 サンプルコード
// 只支持 GET 请求
@RequestMapping(value = "selectAllUser",method = RequestMethod.GET)
// 指定支持多个 HTTP 请求,该方法同时支持 GET 和 POST 请求。
@RequestMapping(value = "checkUser",method = {
    
    RequestMethod.GET,RequestMethod.POST})

3.1.5 params プロパティ

params 属性は、リクエストで指定されたパラメータを指定するために使用されます。

3.1.5.1 サンプルコード
// 请求中必须包含 type 参数时才能执行该请求
@RequestMapping(value = "selectAllUser",params = "type")
public String toUser() {
    
    
    return "userList";
}
// 请求中必须包含 type 参数,且 type 参数值为 1 时才能够执行该请求
@RequestMapping(value = "selectAllUser",params = "type=1")
public String toUser() {
    
    
    return "userList";
}

3.2 リクエストURLによるマッピング

3.2.1 メソッドレベルのアノテーション

@Controller
public class UserController {
    
    
    @RequestMapping(value = "/user/login")
    public String login() {
    
    
        return "login";
    }
    @RequestMapping(value = "/user/register")
    public String register() {
    
    
        return "register";
    }
}

3.2.2 クラスレベルのアノテーション

@Controller
@RequestMapping("/user")
public class UserController {
    
    
    @RequestMapping("/login")
    public String login() {
    
    
        return "login";
    }
    @RequestMapping("/register")
    public String register() {
    
    
        return "register";
    }
}

3.3 リクエストパラメータまたはメソッドによるマッピング

@RequestMappingの値はリクエストのURLを示し、methodはリクエストメソッドを示し、ここではGETリクエストとして設定していますが、POSTリクエストの場合はselectUserByUsernameの処理メソッドを入力することはできません。params はリクエスト パラメータを示します。パラメータ名はユーザー名です。

@Controller
public class UserController {
    
    
    @RequestMapping(value = "/user/userList" method=RequestMethod.GET, params="username")
    public String selectUserByUsername(String username) {
    
    
        return "userList";
        
    @RequestMapping(value = "/user/userList2" method=RequestMethod.GET)
    public String selectUserByUsername2(@RequestParam("username") String username) {
    
    
        return "userList";
}

3.4 パラメータの種類

org.springframework.ui.Model タイプ。Map を含む Spring MVC タイプです。Spring MVC は、リクエスト処理メソッドが呼び出されるたびに org.springframework.ui.Model オブジェクトを作成します。

3.4.1 モデルの種類

@Controller
@RequestMapping("/user")
public class UserController {
    
    
    @RequestMapping("/register")
    public String register(Model model) {
    
    
        /*在视图中可以使用EL表达式${success}取出model中的值*/
        model.addAttribute("success", "注册成功");
        return "register";
    }
}

3.4.1 ケース

  1. コントローラ
@Controller
@RequestMapping(value = "user",name = "用户操作")
public class UserController {
    
    
    // 登录
    @RequestMapping("/login")
    public String login(Model model){
    
    
        /*在视图中可以使用EL表达式${info}取出model中的值*/
        model.addAttribute("info", "登录成功");
        return "index";
    }
}
  1. インデックスページ
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>index</title>
</head>
<body>
    ${info},系统首页!
</body>
</html>

5、Spring MVC にパラメータを渡す

Spring MVC コントローラーがリクエスト パラメーターを受信するには多くの方法があり、get リクエスト メソッドに適したもの、post request メソッドに適したもの、両方に適したものもあります。主に以下のような方法があります。

  • エンティティ Bean を介してリクエスト パラメータを受信する
  • リクエストパラメータを処理メソッドの仮パラメータで受け取る
  • HttpServletRequest を通じてリクエスト パラメータを受信します
  • @PathVariable を通じて URL 内のリクエスト パラメーターを受け取ります
  • @RequestParam を通じてリクエストパラメータを受信します

1. エンティティ Bean を介してリクエスト パラメータを受信する

リクエストパラメータを受信するEntity Beanは、リクエストを送信するgetおよびpostメソッドに適用できます。Beanのプロパティ名はリクエストパラメータの名前と同じである必要があることに注意してください。サンプルコードは次のとおりです

@RequestMapping("/login")
public String login(User user, Model model) {
    
    
    if ("admin".equals(user.getUsername())
            && "112112".equals(user.getPassword())) {
    
    
        model.addAttribute("message", "登录成功");
        return "index"; // 登录成功,跳转到 index.jsp
    } else {
    
    
        model.addAttribute("message", "用户名或密码错误");
        return "login";
    }
}

URL取得リクエストバックグラウンドメソッドスプライシングパラメータ

2. リクエストパラメータを処理メソッドの仮パラメータで受け取る

処理メソッドの仮パラメータを介してリクエストパラメータを受け取るとは、コントローラクラスの対応するメソッドの仮パラメータにフォームパラメータを直接記述することです。つまり、仮パラメータ名はリクエストパラメータ名とまったく同じです。パラメーターを受信するこの方法は、送信リクエストの取得および送信に適用できます。サンプルコードは次のとおりです

@RequestMapping("/login")
public String login(String username, String password, Model model) {
    
    
    if ("admin".equals(username)
            && "112112".equals(password)) {
    
    
        model.addAttribute("message", "登录成功");
        return "index"; // 登录成功,跳转到 index.jsp
    } else {
    
    
        model.addAttribute("message", "用户名或密码错误");
        return "login";
    }
}

3. HttpServletRequest を通じてリクエスト パラメータを受信します

サーブレットフェーズでの取得メソッドと同様に、コントローラー層のメソッドパラメータにはHttpServletRequestパラメータが含まれており、リクエスト内のパラメータを取得することができます。

4. @PathVariable を通じて URL 内のリクエスト パラメーターを受け取ります

@RequestMapping(value = "/login/{username}/{password}")
public String login(@PathVariable("username") String username, @PathVariable("password") String password) {
    
    
    System.out.println(username);
    System.out.println(password);
    return "index";
}

http://localhost:8080/user/login/admin/123456パスにアクセスすると、上記のコードは、URL 内のテンプレート変数 {username} と {password} を、@PathVariable で注釈が付けられた同じ名前のパラメータ、つまり username=admin、password=123456 に自動的にバインドします

5. @RequestParam を通じてリクエストパラメータを受信します

メソッドパラメータで @RequestParam アノテーションを使用して、対応するリクエストパラメータを指定します。@RequestParam には次の 3 つのパラメータがあります。

  • 値: パラメータ名;
  • required: このパラメータを含めるかどうか。デフォルトは true で、リクエスト パスにこのパラメータが含まれている必要があることを示します。含まれていない場合はエラーが報告されます。
  • defaultValue: デフォルトのパラメータ値。この値が設定されている場合、required=true は無効になり、自動的に false になります。このパラメータが渡されない場合は、デフォルト値が使用されます。

@RequestParam を介したリクエスト パラメーターの受信は、送信リクエスト メソッドの取得および送信に適用できます。サンプル コードは次のとおりです。

  1. ユーザーコントローラー
@RequestMapping("/goRequestParam")
private String goRequestParam(){
    
    
    return "requestParam";
}
@RequestMapping("/requestParam")
public String requestParam(
    @RequestParam(value = "username",required = true) String username, 
    @RequestParam(value = "password",required = false,defaultValue = "111") String password){
    
    
    System.out.println(username + " " + password);
    return "index";
}
  1. requestParam.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>RequestParam</title>
</head>
<body>
<form action="/user/requestParam" method="get">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    <input type="submit" value="submit">
</form>
</body>
</html>
  1. インデックス.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>index</title>
</head>
<body>
<a href="../user/login">登录</a><br>
<a href="../user/register">注册</a><br>
<a href="../user/goRequestParam">RequestParam</a><br>
</body>
</html>

本メソッドと「処理メソッドの仮パラメータでリクエストパラメータを受け取る」の違いは以下の通りです。 リクエストパラメータと受け取ったパラメータ名が一致しない場合、「処理メソッドの仮パラメータでリクエストパラメータを受け取る」は、 「By @ RequestParam "receive requestparameters"」は 400 エラーを報告しません。

6、Spring MVCのリダイレクトと転送

  • Spring MVC のリクエスト メソッドは、フォワーディングとリダイレクトの 2 つのタイプに分けられ、それぞれ forward キーワードと redirect キーワードを使用してコントローラー層で処理されます。
  • Spring MVCフレームワークでは、デフォルトではコントローラクラスの処理メソッドのreturn文が転送されますが、ビューにも転送されます。
  • リダイレクトとは、ユーザーを現在の処理リクエストから別のビュー (JSP など) または処理リクエストに誘導することで、以前のリクエスト (リクエスト) に格納されていた情報はすべて無効になり、新しいリクエスト スコープに入ります。
  • 転送とは、ユーザーの現在の処理要求を別のビューまたは処理要求に転送することであり、前の要求に格納された情報は無効になりません。
  • 転送はサーバーの動作であり、リダイレクトはクライアントの動作です。

1. 転送プロセス

  • クライアント ブラウザは http リクエストを送信し、Web サーバーはリクエストを受け入れ、内部メソッドを呼び出してリクエストの処理とコンテナ内での転送アクションを完了し、ターゲット リソースをクライアントに送信します。ここでの転送パスは、次の URL である必要があります。同じ Web コンテナの場合、他の Web パスにリダイレクトすることはできず、独自のコンテナ内のリクエストは途中で渡されます。
  • クライアントのブラウザのアドレス バーに表示されるものは、依然として最初の訪問時のパスです。つまり、クライアントはサーバーが転送を行ったとは感じません。転送動作では、ブラウザはアクセス要求を 1 回だけ行います。

2. リダイレクト処理

  • クライアント ブラウザは http リクエストを送信し、Web サーバーはそれを受け入れた後、302 ステータス コード応答と対応する新しい場所をクライアント ブラウザに送信します。クライアント ブラウザは、それが 302 応答であることを認識すると、新しい http リクエストを自動的に送信します。 、リクエスト URL が新しい場所のアドレスである場合、サーバーはこのリクエストに基づいてリソースを見つけてクライアントに送信します。
  • ここの場所は任意の URL にリダイレクトできますが、ブラウザがリクエストを再発行するため、リクエスト配信の概念はありません。リダイレクト パスはクライアントのブラウザのアドレス バーに表示され、クライアントはアドレスの変更を確認できます。リダイレクト動作では、ブラウザは少なくとも 2 つのアクセス要求を行います。

3. ケース

@RequestMapping("/login")
public String login() {
    
    
    //转发到一个请求方法(同一个控制器类可以省略/index/)
    return "forward:/user/isLogin";
}
@RequestMapping("/isLogin")
public String isLogin() {
    
    
    //重定向到一个请求方法
    return "redirect:/user/isRegister";
}
@RequestMapping("/isRegister")
public String isRegister() {
    
    
    //转发到一个视图
    return "register";
}

4. 注意すべき事項

Spring MVCフレームワークでは、リダイレクトであってもフォワーディングであっても、ビューリゾルバーの設定に準拠する必要があり、例えばDispatcherServletを必要としないリソースに直接転送する場合は、

return "forward:/html/my.html";

springmvc-servlet.xmlで設定する必要があります

<mvc:resources location="/html/" mapping="/html/**" />

7. @Autowired と @Service

Spring MVC コントローラーに依存関係を注入するには、@Autowired および @Service アノテーションが必要です。

1 はじめに

@Autowired アノテーションは org.springframework.beans.factory.annotation パッケージに属しており、クラス メンバー変数、メソッド、コンストラクターにアノテーションを付けて自動アセンブリの作業を完了できます。

@Service アノテーションは org.springframework.stereotype パッケージに属し、アノテーション クラスを Spring コンテナに自動的に登録します。

2.ケース

  1. springmvc-servlet.xml

<component-scan/>依存する基本パッケージをスキャンするには、構成ファイル springmvc-servlet.xml に要素を追加する必要があります

<context:component-scan base-package="com.hqyj.cl.service"/>
  1. エンティティクラス
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    
    
    private String name;
    private String pwd;
}
  1. UserServiceインターフェースを作成する
public interface UserService {
    
    
    boolean login(User user);
    boolean register(User user);
}
  1. UserServiceImpl クラスを作成して UserService インターフェイスを実装する
@Service
public class UserServiceImpl implements UserService {
    
    
    @Override
    public boolean login(User user) {
    
    
        if ("admin".equals(user.getName()) && "111".equals(user.getPwd())) {
    
    
            return true;
        }
        return false;
    }
    @Override
    public boolean register(User user) {
    
    
        if ("admin".equals(user.getName()) && "111".equals(user.getPwd())) {
    
    
            return true;
        }
        return false;
    }
}

注: @Service アノテーションを追加する機能は、クラスを Spring でスキャンできるようにすることです。

  1. UserControllerクラスを作成する
@Controller
@RequestMapping("/user")
public class UserController {
    
    
    @Autowired
    private UserService userService;
    @RequestMapping("/login")
    public String getLogin(Model model) {
    
    
        User user = new User();
        user.setName("admin");
        user.setPwd("111");
        userService.login(user);
        model.addAttribute("user", user);
        return "login";
    }
    @RequestMapping("/register")
    public String getRegister(Model model) {
    
    
        User user = new User();
        user.setName("admin");
        user.setPwd("111");
        userService.login(user);
        model.addAttribute("user", user);
        return "register";
    }
}

注: UserService に @Autowired アノテーションを追加すると、UserService のインスタンスが UserController インスタンスに挿入されます。

  1. springmvc-servlet.xml
<!-- 配置包扫描路径,作用自动检测标注Bean -->
<context:component-scan base-package="com.hqyj.cl" />
<mvc:annotation-driven />
<bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceView">
    <!--前缀 -->
    <property name="prefix" value="/WEB-INF/jsp/" />
    <!--后缀 -->
    <property name="suffix" value=".jsp" />
</bean>
  1. web.xml
<!-- 部署 DispatcherServlet -->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 表示容器再启动时立即加载servlet -->
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!-- 处理所有URL -->
    <url-pattern>/</url-pattern>
</servlet-mapping>

  1. インデックス.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head lang="en">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title></title>
</head>
<body>
<h2>Hello World!</h2>
未注册的用户,请
<a href="${pageContext.request.contextPath}/user/register"> 注册</a>!
<br /> 已注册的用户,去
<a href="${pageContext.request.contextPath}/user/login"> 登录</a>!
</body>
</html>
  1. ログイン.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
    登录页面! 欢迎 ${user.name} 登录
</body>
</html>
  1. register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title></title>
</head>
<body>
    注册页面!
    注册账号成功,用户名为: ${user.name }
</body>
</html>

8、@ModelAttribute (理解)

Spring MVC の非常に重要なアノテーション @ModelAttribute は、リクエストパラメータを Model オブジェクトにバインドするために使用されます。モデル オブジェクトはコントローラー メソッドの前に作成されるため、@ModelAttribute アノテーションが付けられたメソッドはコントローラーの各メソッドが実行される前に実行されます。できるだけ使用しないでください

1。目的

  • メソッドに適用される
  • メソッドパラメータに適用される
  • メソッドに適用され、メソッドでも @RequestMapping が使用されます

1.1 メソッドへの適用

1.1.1 戻り値のないメソッドに適用される

  1. モデル属性コントローラー
@Controller
@RequestMapping("/model")
public class ModelAttributeController {
    
    
    // 方法无返回值
    @ModelAttribute
    public void myModel(@RequestParam(required = false) String name, Model model) {
    
    
        model.addAttribute("name", name);
    }
    @RequestMapping("/index")
    public String model() {
    
    
        return "index";
    }
    
    // 上述代码合二为一
    /*    @RequestMapping("/index")
    public String model(@RequestParam(required = false) String name, Model model) {
        model.addAttribute("name", name);
        return "index";
    }*/
}
  1. インデックス.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>index</title>
</head>
<body>
    ${name}
</body>
</html>

アクセス:

アクセスを使用するとhttp://localhost:8080/model/index?name=%E5%BC%A0%E4%B8%89、ページに名前に対応する値が表示されます。ヒント: 名前の後の文字列は文字化けではなく、文字列変換の問題です。ここでの意味は Zhang San です。

1.1.2 戻り値のあるメソッドに適用される

このメソッドを使用すると、デフォルトで戻り値オブジェクト名が暗黙のモデルに配置されます。モデルでは、キーは戻り値の型の小文字の頭文字、値は戻り値になります。に相当model.addAttribute("string", name);

  1. モデル属性コントローラー
@Controller
@RequestMapping("/model")
public class ModelAttributeController {
    
    
     // 方法有返回值
    @ModelAttribute()
    public String myModel(@RequestParam(required = false) String name) {
    
    
        return name;
    }
    @RequestMapping("/index")
    public String model() {
    
    
        return "index";
    }
}
  1. インデックス.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>index</title>
</head>
<body>
    ${string}
</body>
</html>

通常の状況では、プログラム内で string、int、float などのデータ型の値を返さないようにしてください。@ModelAttribute を使用して value 属性に注釈を付け、キーをカスタマイズします。サンプル コード

@ModelAttribute("name")
public String myModel(@RequestParam(required = false) String name) {
    
    
    return name;
}

に相当

model.addAttribute("name", name);

1.2 メソッドのパラメータに適用される

@ModelAttribute はメソッドのパラメータにアノテーションが付けられており、メソッドが呼び出されるときにモデルの値が注入されます。これは実際には非常に簡単で、フォーム属性を **モデル オブジェクトにマップするためによく使用されます。**

  1. モデル属性コントローラー
@Controller
@RequestMapping("/model")
public class ModelAttributeController {
    
    
    @RequestMapping("/register")
    public String register(@ModelAttribute("user") User user) {
    
    
        if ("admin".equals(user.getName()) && "111".equals(user.getPwd())) {
    
    
            return "login";
        } else {
    
    
            return "register";
        }
    }
}
  1. ログイン.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title></title>
</head>
<body>
登录页面! 欢迎 ${user.name} 登录
</body>
</html>
  1. インデックス.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title></title>
</head>
<body>
注册页面!
注册账号成功,用户名为: ${user.name }
</body>
</html>

1.2.1 説明

@ModelAttribute("user") User user ステートメントには 2 つの機能があります。

  • リクエストパラメータの入力をユーザーオブジェクトにカプセル化します。
  • ユーザーインスタンスを作成する

これは、「user」をキー値として Model オブジェクトに格納され、「model.addAttribute("user",user)」ステートメントと同じ機能を持ちます。キー値が指定されていない場合、つまり「@ModelAttribute User user」の場合、User インスタンスの作成時に、「user」がキー値として Model オブジェクトに格納されます。これは「model.addAtttribute( "user", user)" ステートメント。

1.3 モデル属性+リクエストマッピング

  1. モデル属性コントローラー
@Controller
public class ModelAttributeController {
    
    
    // @ModelAttribute和@RequestMapping同时放在方法上 方法直接返回页面名称 会把类路径拼接到url中
    @RequestMapping("/index")
    @ModelAttribute("name")
    public String model(@RequestParam(required = false) String name) {
    
    
        return name;
    }
}
  1. インデックス.jsp

    リクエストのパスは http://localhost:8080/j230101SpringMVC_war_exploded/index?name=admin です。 name パラメータには値があります。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>index</title>
</head>
<body>
    ${name}
</body>
</html

1.3.1 説明

@ModelAttribute アノテーションと @RequestMapping アノテーションを同時にメソッドに適用すると、次のような影響があります。

  1. メソッドの戻り値は Model オブジェクトに格納され、キーは ModelAttribute の value 属性値です。
  2. メソッドの戻り値はメソッドのアクセス パスではなくなり、アクセス パスは @RequestMapping の値になります。例: @RequestMapping(value = “/index”) リダイレクトされたページは、index.jsp です。ページ;
  3. このメソッドを使用する場合は、クラスパスを追加しないでください。追加すると、パスエラーが発生する可能性があります。

1.4 Model と ModelAndView の違い

  • モデル: 各リクエストに存在するデフォルト パラメータとその addAttribute() メソッドを使用して、サーバーの値をクライアント ページに渡すことができます。
  • ModelAndView: モデルとビューの 2 つの部分が含まれています。使用する場合は、自分でインスタンスを作成し、値を渡すために Model を使用する必要があり、ビューの名前も設定できます。

1.5 演習

@ModelAttribute アノテーションが付けられたメソッドは、コントローラー クラスの各リクエスト処理メソッドの前に呼び出されます。この機能を使用して、ログイン許可を制御できます。

  1. ベースコントローラー
public class BaseController {
    
    
    @ModelAttribute
    public void isLogin(HttpSession session) throws Exception {
    
    
        if (session.getAttribute("user") == null) {
    
    
            throw new Exception("没有权限");
        }
    }
}
  1. ユーザーコントローラー
@RequestMapping("/user")
public class UserController extends BaseController {
    
    
    @RequestMapping("/selectAllUser")
    public String selectAllUser() {
    
    
        return "userList";
    }
}

9、Spring MVC JSON データ対話

Spring MVCはデータバインディングの過程で送信するデータの形式や型を変換する必要があり、String型などのデータ型とJSONなどのその他の型のデータを変換することができます。Alibaba の FastJson テクノロジーを使用して Spring MVC を実装し、JSON 形式でデータを処理します。ページには jquery を導入する必要があります。リソースのフィルタリング (最初の方法) に注意してください。Spring バージョン 4.0.2 (他のパッケージ バージョン 4.3.13 は低すぎますが、4.0 は requestmaping の name 属性をサポートしていません)

1.ケース

  1. pom.xml ファイルに依存関係をインポートします (前にインポート済み)
<!-- 格式化对象,方便输出日志 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.1.41</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${slf4j.version}</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>${slf4j.version}</version>
</dependency>
<!-- jackson -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.6</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.9.6</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.6</version>
</dependency>
  1. JSONControllerメソッドの戻り値をMapコレクションとして設定可能
@Controller
@RequestMapping("/json")
public class JSONController {
    
    
    @RequestMapping("/index")
    public String index() {
    
    
        return "index";
    }
    @RequestMapping("/testJson")
    @ResponseBody
    public User testJson(User user) {
    
    
        // 打印接收的 JSON数据
        System.out.println("username=" + user.getUsername() + ",password=" + user.getPassword());
        // 返回JSON格式的响应
        return user;
    }
}
  1. インデックス.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>测试JSON交互</title>
    <script type="text/javaScript" src="../static/js/jquery-2.1.1.min.js"></script>
</head>
<body>
<form>
    用户名:<input type="text" name="username" id="username"/>
    <br>
    密码:<input type="password" name="password" id="password"/>
    <br>
    <input type="button" value="login" οnclick="login()"/>
</form>
</body>
<script type="text/javaScript">
    function login() {
        $.ajax({
            //请求路径
            url: "../json/testJson",
            //请求类型
            type: "post",
            //定义回调响应的数据格式为JSON字符串,该属性可以省略
            dataType: "json",
            //data表示发送的数据
            data: {
                username: $("#username").val(),
                password: $("#password").val(),
            },
            contentType: "application/x-www-form-urlencoded", //设置请求参数的格式
            processData: true, //设置ajax内部是否自动处理请求参数,默认为true,可省略,如果data给的是个js对象,要么不设置,要么设为true
            //成功响应的结果
            success: function (data) {
                if (data != null) {
                    alert("输入的用户名:" + data.username + ",密码:" + data.password);
                }
            },error:function () {
                alert("服务器错误");
            }
        });
    }
</script>
</html>

2、コンテンツタイプ

contentType には次の 3 つの一般的なタイプがあります。

// 普通表单提交的数据的格式为application/x-www-form-urlencoded
application/x-www-form-urlencoded
// 发送以ContentType为application/json格式的请求参数,需要把data的内容转为json格式,使用JSON.stringify(param)
application/json
// 上传文件时,请求消息将以multipart/form-data格式封装请求参数
multipart/form-data


// ContentType を application/json 形式としてリクエスト パラメータを送信するには、JSON.stringify(param) application/jsonを使用して、データのコンテンツを json 形式に変換する必要があります

ajaxで変数を定義できる

let user = JSON.stringify({

ユーザー名:$(“ユーザー名”).val(),

パスワード:$(“パスワード”).val(),

});

次のデータは次のように変更できます。

data:user; バックエンドに渡すには、バックエンド メソッドのパラメーターで @requestBody アノテーションを使用して public void login(@requestBodyUser user) を取得する必要があります。

10. Spring MVC インターセプター (インターセプター)

Spring MVCのInterceptorはJava Servletのフィルタに似ており、主にユーザーのリクエストをインターセプトし、それに応じた処理を行うために使用され、通常は権限の検証、リクエスト情報のロギング、ユーザーがログインしているかどうかの判断に使用されます。その他の機能。

1. インターセプタを定義する

インターセプターを定義します。HandlerInterceptor インターフェースを実装することで実装します。

1.1 事例

  1. HandlerInterceptor インターフェースを実装する
public class MyInterceptor implements HandlerInterceptor {
    
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
    
    
        // 获取请求的URL
        String url = request.getRequestURI();
        // login.jsp或登录请求放行,不拦截
        if (url.indexOf("/goLogin") >= 0 || url.indexOf("/login") >= 0) {
    
    
            return true;
        }
        // 获取 session
        HttpSession session = request.getSession();
        Object obj = session.getAttribute("user");
        if (obj != null)
            return true;
        // 没有登录且不是登录页面,转发到登录页面,并给出提示错误信息
        request.setAttribute("msg", "还没登录,请先登录!");
        request.getRequestDispatcher("login").forward(request, response);
        return false;
    }
    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception {
    
    
    }
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception {
    
    
    }
}

インターセプタの定義は HandlerInterceptor インターフェイスを実装し、そのインターフェイスに次の 3 つのメソッドを実装します。

  • preHandle(): コントローラの処理要求メソッドの前に実行されるメソッドで、戻り値は後続の動作を中断するかどうかを示し、true が下方向に実行を継続することを示し、false が後続の動作を中断することを示します。
  • postHandle( ): このメソッドは、コントローラーの処理リクエスト メソッドが呼び出された後、ビューを解析する前に実行されます。このメソッドは、リクエスト ドメイン内のモデルとビューをさらに変更するために使用できます。
  • afterCompletion(): コントローラの処理要求メソッド実行後、つまりビューの描画完了後に実行されるメソッドで、リソースのクリーニングやログ情報の記録などの一部のタスクを実現できます。
  1. springmvc-servlet.xml 構成インターセプター
<!-- 配置拦截器 -->
<mvc:interceptors>
    <mvc:interceptor>
        <!-- 配置拦截器作用的路径 -->
        <mvc:mapping path="/**" />
        <bean class="com.hqyj.cl.utils.MyInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>
  1. ユーザーコントローラー
@Controller
@RequestMapping("/user")
public class UserController {
    
    
    // 登录页面初始化
    @RequestMapping("/goLogin")
    public String initLogin() {
    
    
        return "login";
    }

    // 处理登录功能
    @RequestMapping("/login")
    public String login(User user, HttpSession session) {
    
    
        if ("admin".equals(user.getUsername()) && "111".equals(user.getPassword())) {
    
    
            // 登录成功,将用户信息保存到session对象中
            session.setAttribute("user", user);
            // 重定向到主页面的跳转方法
            return "redirect:main";
        }
        return "login";
    }

    // 跳转到主页面
    @RequestMapping("/main")
    public String goMain() {
    
    
        return "main";
    }
    
    // 退出登录
    @RequestMapping("/logout")
    public String logout(HttpSession session) {
    
    
        // 清除 session
        session.invalidate();
        return "login";
    }
}
  1. ログイン.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title></title>
</head>
<body>
${ msg }
<form action="../user/login" method="post">
    用户名:<input type="text" name="username" /><br>
    密码:<input type="password" name="password" /><br>
    <input type="submit" value="登录" />
</form>
</body>
</html>
  1. main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title></title>
</head>
<body>
欢迎 ${ sessionScope.get("user").username },登录!<br />
<a href="../user/logout">退出</a>
</body>
</html>

11. ファイルのアップロードとダウンロード

1. ファイルのアップロード

  1. 次の依存関係を pom.xml ファイルに追加します。
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.2.2</version>
</dependency>
  1. springmvc-servlet.xml
<!-- 配置MultipartResolver,用于上传文件,使用spring的CommonsMultipartResolver -->
<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="5000000" />
    <property name="defaultEncoding" value="UTF-8" />
</bean>
  • defaultEncoding: リクエストのエンコード形式。デフォルトは ISO-8859-1 ですが、ここでは UTF-8 に設定されています (注: フォームのコンテンツを正しく読み取るために、defaultEncoding は JSP の pageEncoding と一致している必要があります)。
  • maxUploadSize: アップロードされるファイル サイズの上限 (バイト単位)。
  1. fileUpload.jsp フォーム送信
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件上传</title>
</head>
<body>
    <form action="${pageContext.request.contextPath }/file/upload"
        method="post" enctype="multipart/form-data">
        选择文件:<input type="file" name="file"><br> 
        <input type="submit" value="提交">	
    </form>
</body>
</html>
  1. ファイルコントローラー
@Controller
@RequestMapping("/file")
public class FileController {
    
    
    @RequestMapping("/upload")
    @ResponseBody
    public String upload(MultipartFile file, HttpServletRequest request) throws IOException {
    
    
        // 获取上传文件名
        String originalFileName = file.getOriginalFilename();
        // 得到当前的classpath的绝对路径的URI表示法
        String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
        int index = rootPath.indexOf("target");
        String path = rootPath.substring(1,index) + "src/main/webapp/static/images/book";
        // 新文件
        File newFile = new File(path,originalFileName);
        // 判断目标文件所在目录是否存在
        if( !newFile.getParentFile().exists()) {
    
    
            // 如果目标文件所在的目录不存在,则创建父目录
            newFile.getParentFile().mkdirs();
        }
        // 将内存中的数据写入磁盘
        file.transferTo(newFile);
        return  "success";
    }
}

1.1 拡張機能

ajaxを使用したファイルアップロード

    <form id="uploadForm">
        <input type="file" name="file">
        <br>
        <input type="button" value="button" οnclick="upload()">
    </form>
    <script>
        function upload() {
            var formData = new FormData($("#uploadForm")[0]);
            // 发送ajax请求
            $.ajax({
                url:'/file/upload',
                type:"post",
                data:formData,
                processData : false,  //必须false才会避开jQuery对 formdata 的默认处理
                contentType : false,  //必须false才会自动加上正确的Content-Type
                success:function (data) {
                    console.log(data);
                },error:function () {
                    alert("服务器错误");
                }
            })
        }
    </script>

2. ファイルのダウンロード

  1. ファイルダウン.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件下载</title>
</head>
<body>
<form action="/file/down" method="get">
    <input type="submit" value="下载">
</form>
</body>
</html>
  1. ファイルコントローラー
@RequestMapping("/down")
@ResponseBody
public String down(HttpServletResponse response) throws Exception{
    
    
    // 下载文件的路径
    String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
	// 截取到需要的文件存放路径
    int index = rootPath.indexOf("target");
    String path = rootPath.substring(1,index) + "src/main/webapp/static/images/book";
    // 下载文件的名字,假设为banner_1.jpg
    String fileName = "banner_1.jpg";
    //获取输入流
    InputStream is = new BufferedInputStream(new FileInputStream(new File(path,fileName)));
    //转码,免得文件名中文乱码
    String filename = URLEncoder.encode(fileName,"UTF-8");
    //设置文件下载头
    response.addHeader("Content-Disposition", "attachment;filename=" + filename);
    //1.设置文件ContentType类型,这样设置,会自动判断下载文件类型
    response.setContentType("multipart/form-data");
    BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
    int len = 0;
    while((len = is.read()) != -1){
    
    
        out.write(len);
        out.flush();
    }
    out.close();
    return "success";
}

12. SpringMVCリソースフィルタリングの問題

**問題の説明:** web.xml ファイルで次のコードを構成すると、js、css、その他の静的リソースを含むすべてのリクエスト URL がインターセプトされるため、これらの静的リソースを使用できなくなります。

<!-- 部署 DispatcherServlet -->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 表示容器再启动时立即加载servlet -->
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!-- 处理所有URL -->
    <url-pattern>/</url-pattern>
</servlet-mapping>

** 解決策の 1 つ: ** springmvc-servlet.xml ファイルに、次のコードを追加します。

<!-- 默认的注解映射,必须加,不然没办法兼顾二者 -->
<mvc:annotation-driven />
<!--配置静态资源放行 如果web.xml中servlet-name定义为default,则default-servlet-name="default"可以不写-->
<mvc:default-servlet-handler default-servlet-name="default"/>

web.xml ファイルに次のコードを追加します。

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <!-- 处理所有URL -->
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>

**解決策 2: **springmvc-servlet.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.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!-- 包扫描-->
    <context:component-scan base-package="com.hqyj.cl.controller"/>
    <!-- 默认的注解映射,必须加,不然没办法兼顾二者 -->
    <mvc:annotation-driven />
    <mvc:resources mapping="/static/**" location="/static/"/>
	<!-- interceptors -->  
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <!-- 不拦截的请求 -->
            <mvc:exclude-mapping path="/static/**"/>
            <bean class="com.hqyj.cl.utils.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
    <!--配置视图解析器之InternalResourceViewResolver-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--指定viewclass 必须指定-->
        <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView"/>
        <!--前缀-->
        <property name="prefix" value="/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>
  • location: location で指定されたディレクトリが傍受されず、直接リクエストされるべきではないことを意味します。ここでは、ルート ディレクトリのリソース ファイルの下にあるすべてのファイルを指します。
  • マッピング: リソース ファイルの下のすべてのファイルを参照します (** はすべてのファイルを表します)

おすすめ

転載: blog.csdn.net/ailaohuyou211/article/details/130394223