2019年現在、オワコン風潮の強いJSPですが使っているプロジェクトもまだまだあり、枯れた技術を好む官公庁系のプロジェクトでは根強いシェアを誇っています。実装検証をする為に環境を作る機会があったりするのでSpring BootでJSPを使う手順を備忘しておきます。
目次
環境
- pleiades-2019-03-java-win-64bit-jre_20190508
- Win10
手順
SpringBootプロジェクトを作成
Eclipseの「ファイル」→「新規」→「その他」。
「Spring スターター・プロジェクト」を選択して次へ。
「名前」に適当なものを入れて次へ。
依存するJarを選択します。左側のツリーから「Web」を開き「Spring Web Starter」にチェックを入れておきます。これにチェックを入れると
org.springframework.boot.spring-boot-starter-web
がdependencyに追加されて@RequestMappingなどのWebで使用するクラスにclasspathが通るようになります。
忘れても後からpom.xmlで「spring-boot-starter」を「spring-boot-starter-web」に変更すればオッケーです。
何故かmaven-jar-plugin最新の3.1.2はEclipse上のpom.xmlエディタでエラーを吐くので、パッチバージョンを一つ下げておきます。
<properties>
<java.version>1.8</java.version>
<!-- 追加 -->
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
</properties>
src/main/java/パッケージには「プロジェクト名Application.java」が作られていてこれを実行するとWebサーバ起動する状態です。このクラスはSpringBootアプリ起動を行うものなので今回は弄りません。
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootJspApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootJspApplication.class, args);
}
}
コンテキストルートをハンドルするコントローラを作成
コンテキストルートにアクセスされるとlogin.jspを返却するコントローラを作っておきます。
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class DemoController {
@RequestMapping(path = "/", method = { RequestMethod.GET })
public String input(Model model) {
return "login";
}
}
コントローラからフォワードされるテスト用JSPを作成
JSP表示確認用にsrc/main/webapp/WEB-INF/view/login.jspを作っておきます。
JSPが正常に表示されるかどうか確かめるだけなので単純なものにしておきます。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SpringBoot + JSP</title>
</head>
<body>
<% out.println(new java.util.Date()); %>
</body>
</html>
SpringBootのフォワード設定にJSPを追加
SpringBoot設定ファイルのsrc/main/resources/application.propertiesに以下を追加して、フォワード表示するJSPの在りかを教えておきます。これを書いておくことでSpringのDispatcherServletは、
/WEB-INF/view/{@RequestMappingメソッドが返却した文字列} + .jsp
にHTTPリクエストをフォワードしてくれるようになります。
spring.mvc.view.prefix= /WEB-INF/view/
spring.mvc.view.suffix= .jsp
SpringBoot環境でJSPコンパイル出来るようにしておく
SpringBootはThymeleaf推しのせいかデフォルトでJSPコンパイルが出来ません。サーバ起動してアクセスしても以下のようなエラーが発生してlogin.jspを表示してくれません。
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Thu Jun 27 18:27:29 JST 2019
There was an unexpected error (type=Not Found, status=404).
No message available
JSPをコンパイルしてHTML返却出来るように組み込みTomcatのJasper(JSPコンパイラ)をpom.xmlのdependencyに追加します。
Maven Repositoryで探すと9.0.21が現時点(2019/06)の最新のようです。
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>9.0.21</version>
</dependency>
動作確認
プロジェクトを右クリック → 実行 → Spring Boot アプリケーションでHTTPサーバを起動して、ブラウザからhttp://localhost:8080にアクセスします。
<% out.println(new java.util.Date()); %>
がコンパイルされて現在時刻が表示されていればSpring + JSP環境構築完了です。
まとめ
SpringBootは面倒なSpringの依存関係を纏めて親POMで提供してくれて雛型を作る際に便利ですね。
作った雛型はwarにしてSpringBootで起動せずにAPサーバにデプロイすることも出来ます。