1. 概要

すべてのMVCフレームワークは、ビューを操作する方法を提供します。

Springは、ビューリゾルバーを介してこれを実行します。これにより、実装を特定のビューテクノロジーに結び付けることなく、ブラウザーでモデルをレンダリングできます。

ViewResolver は、ビュー名を実際のビューにマップします。

そして、Springフレームワークにはかなりの数のビューリゾルバーが付属しています。 InternalResourceViewResolver BeanNameViewResolver、およびその他いくつか。

これは、最も一般的なビューリゾルバーを設定する方法と同じ構成で複数のViewResolverを使用する方法を示す簡単なチュートリアルです。

2. SpringWeb構成

Web構成から始めましょう。 @EnableWebMvc @Configuration @ComponentScanで注釈を付けます。

@EnableWebMvc
@Configuration
@ComponentScan("com.baeldung.web")
public class WebConfig implements WebMvcConfigurer {
    // All web configuration will go here
}

ここで、構成にビューリゾルバーを設定します。

3. InternalResourceViewResolverを追加します

このViewResolverを使用すると、ビュー名のプレフィックスやサフィックスなどのプロパティを設定して、最終的なビューページのURLを生成できます。

@Bean
public ViewResolver internalResourceViewResolver() {
    InternalResourceViewResolver bean = new InternalResourceViewResolver();
    bean.setViewClass(JstlView.class);
    bean.setPrefix("/WEB-INF/view/");
    bean.setSuffix(".jsp");
    return bean;
}

このような単純さの例では、リクエストを処理するためのコントローラーは必要ありません。

構成で定義されているように、 / WEB-INF /viewフォルダーに配置された単純なjspページのみが必要です。

<html>
    <head></head>
    <body>
        <h1>This is the body of the sample view</h1>
    </body>
</html>

4. BeanNameViewResolverを追加します

これは、ビュー名を現在のアプリケーションコンテキストのBean名として解釈するViewResovlerの実装です。 そのようなそれぞれ View XMLまたはJava構成のBeanとして定義できます。

まず、BeanNameViewResolverを前の構成に追加します。

@Bean
public BeanNameViewResolver beanNameViewResolver(){
    return new BeanNameViewResolver();
}

ViewResolverを定義したら、 View タイプのBeanを定義して、DispatcherServletで実行してビューをレンダリングできるようにする必要があります。

@Bean
public View sample() {
    return new JstlView("/WEB-INF/view/sample.jsp");
}

コントローラクラスの対応するハンドラメソッドは次のとおりです。

@GetMapping("/sample")
public String showForm() {
    return "sample";
}

コントローラメソッドから、ビュー名は「 sample」として返されます。これは、このハンドラメソッドからのビューが次のようにJstlViewクラスに解決されることを意味します。 /WEB-INF/view/sample.jsp URL。

5. ViewResolversを連鎖させて注文優先度を定義する

Spring MVCは、マルチビューリゾルバーもサポートしています。

これにより、状況によっては特定のビューをオーバーライドできます。 構成に複数のリゾルバーを追加することで、ビューリゾルバーを単純にチェーンできます。

それが終わったら、これらのリゾルバーの順序を定義する必要があります。 orderプロパティは、チェーン内の呼び出しの順序を定義するために使用されます。 注文プロパティ(最大注文番号)が高いほど、ビューリゾルバーはチェーン内で遅く配置されます。

順序を定義するために、ビューリゾルバーの構成に次のコード行を追加できます。

bean.setOrder(0);

InternalResourceViewResolver は非常に明示的なマッピングを表すことを目的としているため、順序を高くする必要があるため、順序の優先順位に注意してください。 また、他のリゾルバーの順序が高い場合は、InternalResourceViewResolverが呼び出されない可能性があります。

6. スプリングブートの使用

Spring Bootを使用する場合、 WebMvcAutoConfiguration 自動的に構成します InternalResourceViewResolver BeanNameViewResolver アプリケーションコンテキストのBean 。 

また、テンプレートエンジンに対応するスターターを追加すると、他の方法で行う必要のある手動構成の多くが不要になります。

たとえば、pom.xmlに spring-boot-starter-thymeleaf 依存関係を追加すると、Thymeleafが有効になり、追加の構成は必要ありません。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <version>${spring-boot-starter-thymeleaf.version}</version>
</dependency>

このスターター依存関係は、アプリケーションコンテキストでThymeleafViewResolverBeanをthymeleafViewResolverという名前で構成します。 同じ名前のBeanを提供することで、自動構成されたThymeleafViewResolverをオーバーライドできます。

Thymeleafビューリゾルバーは、ビュー名をプレフィックスとサフィックスで囲むことで機能します。 プレフィックスとサフィックスのデフォルト値は、それぞれ「classpath:/templates/」と「.html」です。

Spring Bootには、設定によってプレフィックスとサフィックスのデフォルト値を変更するオプションもあります。 spring.thymeleaf.prefixspring.thymeleaf.suffix それぞれプロパティ。

同様に、 groovy-templates freemarker 、および mustache テンプレートエンジンのスターター依存関係があり、Springを使用して対応するビューリゾルバーを自動構成するために使用できます。ブート。

DispatcherServlet は、アプリケーションコンテキストで検出したすべてのビューリゾルバーを使用し、結果が得られるまでそれぞれを試行します。したがって、独自のビューリゾルバーを追加する場合は、これらのビューリゾルバーの順序が非常に重要になります。

7. 結論

このチュートリアルでは、Java構成を使用してビューリゾルバーのチェーンを構成しました。 順序の優先順位を操作することで、呼び出しの順序を設定できます。

この簡単なチュートリアルの実装は、githubプロジェクトにあります。