web-dev-qa-db-ja.com

Spring Bootはwebappフォルダの代わりにJSPテンプレートでリソーステンプレートフォルダを使用しますか?

Spring Boot MVCプロジェクトを開始し、resources内に2つのフォルダーがあることに気付きました。 1つはtemplatesと呼ばれ、もう1つはstaticと呼ばれます。私はこのフォルダのセットアップが本当に好きです。

問題は、ビューにJSPテンプレートを使用していることです。 .jspテンプレートをtemplatesフォルダー内に配置できず、動作するようになりました。 webappおよびsrcと同じレベルにresourcesフォルダーを作成する必要がありました。 JSPテンプレートをそこに配置すると、ビューが見つかります。

templates内にあるresourcesフォルダー内のJSPテンプレートを実際に使用するために再構成する必要があるのは何ですか?

17
xetra11

Mavenドキュメントsrc/main/resourcesによると、WARでWEB-INF/classesになります。

これはapplication.propertiesでSpring Bootのトリックを行います:

spring.mvc.view.prefix = /WEB-INF/classes/templates
spring.mvc.view.suffix = .jsp

Java構成を希望する場合、これは行く方法です:

@EnableWebMvc
@Configuration
public class ApplicationConfiguration extends WebMvcConfigurerAdapter {

    @Bean
    public ViewResolver jspViewResolver() {
        InternalResourceViewResolver bean = new InternalResourceViewResolver();
        bean.setPrefix("/WEB-INF/classes/templates/");
        bean.setSuffix(".jsp");
        return bean;
    }
}

完全な例で更新

この例は、 Springの初期化子 (「Web」依存関係のあるGradleプロジェクト)に基づいています。 apply plugin: 'war'build.gradleに追加し、以下のファイルを追加/変更し、gradle warでプロジェクトをビルドし、アプリケーションサーバーにデプロイしました(Tomcat 8)。

これは、このサンプルプロジェクトのディレクトリツリーです。

\---src
    +---main
        +---Java
        |   \---com
        |       \---example
        |           \---demo
        |                   ApplicationConfiguration.Java
        |                   DemoApplication.Java
        |                   DemoController.Java
        |
        \---resources
            +---static
            \---templates
                    index.jsp

ApplicationConfiguration.Java:上記を参照

DemoApplication.Java:

@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(DemoApplication.class);
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(DemoApplication.class, args);
    }

}

DemoController.Java:

@Controller
public class DemoController {

    @RequestMapping("/")
    public String index() {
        return "index";
    }
}

index.jsp:

<html>
    <body>
        <h1>Hello World</h1>
    </body>
</html>
14
Franz Fellner

公式情報:

リソース処理:

リソースへのリンクは、ThymeleafおよびFreeMarker用に自動構成されたResourceUrlEncodingFilterのおかげで、実行時にテンプレート内で書き換えられます。 JSPを使用する場合は、このフィルターを手動で宣言する必要があります。 ソース

サポートされているテンプレートエンジン

REST Webサービスと同様に、Spring MVCを使用して動的HTMLコンテンツを提供することもできます。SpringMVCは、Thymeleaf、FreeMarker、JSPなどのさまざまなテンプレートテクノロジーをサポートします。

[...]

JSPは可能な限り回避する必要があります。JSPを埋め込みサーブレットコンテナで使用する場合、いくつかの既知の制限があります。

[..]

これらのテンプレートエンジンのいずれかをデフォルト構成で使用している場合、テンプレートはsrc/main/resources/templatesから自動的に選択されます。

ソース

Spring Boot JSPの制限

  • Tomcatでは、warパッケージを使用すれば機能するはずです。つまり、実行可能なwarが機能し、標準にデプロイ可能です。
    コンテナ(Tomcatを含むがこれに限定されない)。
  • Tomcatのハードコードされたファイルパターンのため、実行可能jarは機能しません。
  • Jettyでは、warパッケージを使用すれば機能するはずです。つまり、実行可能なwarが機能し、標準のコンテナーにもデプロイできます。
  • UndertowはJSPをサポートしていません。
  • カスタムerror.jspページを作成しても、エラー処理のデフォルトビューは上書きされません。代わりに、カスタムエラーページを使用する必要があります。

ソース

技術的な変更

スプリングブートにJSP filesapplication.propertiesセット

spring.mvc.view.prefix: /WEB-INF/views/
spring.mvc.view.suffix: .jsp

ソース

JSPを使用したサンプルスプリングブート

スプリングブートでJSPを使用したい場合の例を2つ示します。

https://github.com/spring-projects/spring-boot/tree/v1.5.9.RELEASE/spring-boot-samples/spring-boot-sample-web-jsp

https://github.com/joakime/spring-boot-jsp-demo

6
oak

要約すると、これまでのところ、提案された回答のnoneが機能しました。空のSpringブートスタータープロジェクトを使用します。

何らかの理由で、Springまたはサーブレット内で何かがハードワイヤーされているため、JSPmustが_/webapp_(またはサブフォルダー)にある必要があります。_/resources/templates_で検索されるデフォルトのthymeleafテンプレートとは異なります。

あらゆる種類の変更、実際にはさまざまな構成を試みましたが、その動作を変更することはできませんでした。複雑さを生み出しただけで、JSPにサービスを提供できなくなりました。要するに、JSPを使用している場合は、_/webapp_に配置するだけです。また、次のようなコントローラーを使用してzero構成を追加することでも機能します。

@GetMapping("/foo") public String serveFoo() { return "relative-path-inside-webapp/foo.jsp"; }

別の注意として、デフォルトでは、_/webapp_フォルダーもSpring Toolsuiteで非表示になるため、「ソースフォルダー」として手動で構成する必要があります。

2
dagnelies