Spring Boot MVCプロジェクトを開始し、resources
内に2つのフォルダーがあることに気付きました。 1つはtemplates
と呼ばれ、もう1つはstatic
と呼ばれます。私はこのフォルダのセットアップが本当に好きです。
問題は、ビューにJSPテンプレートを使用していることです。 .jsp
テンプレートをtemplates
フォルダー内に配置できず、動作するようになりました。 webapp
およびsrc
と同じレベルにresources
フォルダーを作成する必要がありました。 JSPテンプレートをそこに配置すると、ビューが見つかります。
templates
内にあるresources
フォルダー内のJSPテンプレートを実際に使用するために再構成する必要があるのは何ですか?
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>
リソースへのリンクは、ThymeleafおよびFreeMarker用に自動構成されたResourceUrlEncodingFilterのおかげで、実行時にテンプレート内で書き換えられます。 JSPを使用する場合は、このフィルターを手動で宣言する必要があります。 ソース
REST Webサービスと同様に、Spring MVCを使用して動的HTMLコンテンツを提供することもできます。SpringMVCは、Thymeleaf、FreeMarker、JSPなどのさまざまなテンプレートテクノロジーをサポートします。
[...]
JSPは可能な限り回避する必要があります。JSPを埋め込みサーブレットコンテナで使用する場合、いくつかの既知の制限があります。
[..]
これらのテンプレートエンジンのいずれかをデフォルト構成で使用している場合、テンプレートはsrc/main/resources/templatesから自動的に選択されます。
- Tomcatでは、warパッケージを使用すれば機能するはずです。つまり、実行可能なwarが機能し、標準にデプロイ可能です。
コンテナ(Tomcatを含むがこれに限定されない)。- Tomcatのハードコードされたファイルパターンのため、実行可能jarは機能しません。
- Jettyでは、warパッケージを使用すれば機能するはずです。つまり、実行可能なwarが機能し、標準のコンテナーにもデプロイできます。
- UndertowはJSPをサポートしていません。
- カスタムerror.jspページを作成しても、エラー処理のデフォルトビューは上書きされません。代わりに、カスタムエラーページを使用する必要があります。
スプリングブートにJSP files
。 application.properties
セット
spring.mvc.view.prefix: /WEB-INF/views/
spring.mvc.view.suffix: .jsp
スプリングブートでJSP
を使用したい場合の例を2つ示します。
要約すると、これまでのところ、提案された回答の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で非表示になるため、「ソースフォルダー」として手動で構成する必要があります。