※当サイトの記事には、広告・プロモーションが含まれます。

JSP + JSTL(JSP Standard Tag Library)+ Spring Web MVCをTomcatで実行

scienceportal.jst.go.jp

⇧ amazing...

JSP + JSTLJSP Standard Tag Library)+ Spring Web MVCTomcatで実行

フロントエンドとサーバーサイドが密結合するので、JSPやThymeleafを使いたくないのですが、参画したプロジェクトで利用してるので致し方ない。

www.shookuro.com

www.code-magagine.com

www.wantanblog.com

tokkan.net

qiita.com

⇧ 上記サイト様を参考に学習していきます。

Eclipseで「ファイル(F)」>「新規(N)」>「Maven プロジェクト」を選択。

「シンプルなプロジェクトの作成(S)(アーキタイプ選択のスキップ)」にチェックを入れて「次へ(N)>」を押下。

「グループId:」「アーティファクトId:」を適当に入力し、「パッケージング:」は「war」を指定。

プロジェクトが作成されます。

ちなみに、Eclipseに同梱されてるMavenの情報を確認するには、

qiita.com

⇧ 上記サイト様が参考になるかと。

話が脱線しましたが、プロジェクトが作成されたら、pom.xmlに依存関係を追加で。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com</groupId>
	<artifactId>spring-mvc-jsp</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<maven.compiler.target>${java.version}</maven.compiler.target>
		<maven.compiler.source>${java.version}</maven.compiler.source>
		<org.springframework-version>5.3.24</org.springframework-version>
	</properties>
	<dependencies>
		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<!-- Servlet -->
		<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>4.0.1</version>
			<scope>provided</scope>
		</dependency>
		<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>javax.servlet.jsp-api</artifactId>
			<version>2.3.3</version>
			<scope>provided</scope>
		</dependency>
		<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-war-plugin</artifactId>
				<version>3.3.2</version>
			</plugin>
		</plugins>
	</build>
</project>

そしたらば、動的Webプロジェクトにする必要があるようです、Spring Bootとかなら煩わしい設定は必要ないのにな。

プロジェクトを右クリックし、「プロパティー(R)」を選択。

「プロジェクト・ファセット」で「ファセット・フォームへ変換...」のリンクを押下。

「動的 Web モジュール」にチェックを入れ、「より詳しい構成が使用可能…」のリンクを押下。

「web.xmlデプロイメント記述子の生成(G)」のチェックを入れ「OK」ボタンを押下。

設定が追加されます。

Spring MVCのDispatcherServletの設定をweb.xmlに追記。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
	id="WebApp_ID" version="4.0">
	<display-name>spring-mvc-jsp</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.jsp</welcome-file>
		<welcome-file>default.htm</welcome-file>
	</welcome-file-list>

	<servlet>
		<servlet-name>spring-dispatcher</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>spring-dispatcher</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
</web-app>

web.xmlと同じ階層にspring-dispatcher-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:p="http://www.springframework.org/schema/p"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.0.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

    <context:component-scan base-package="com" />

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
        <property name="prefix">
            <value>/WEB-INF/views/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>

    <mvc:resources mapping="/resources/**" location="/resources/" />
    <mvc:annotation-driven />
</beans>    

⇧ context:component-scan base-packagの値は、src/main/java配下のパッケージを指定する感じになるので、ご自分の環境に合わせてください。

そしたらば、Java側でControllerクラスを作成。

    
package com.controller;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

	@GetMapping("home")
	public String index(Model model) {
		List<String> list = new ArrayList<>();
		list.add("リスト1");
		list.add("リスト2");
		list.add("リスト3");
		model.addAttribute("strList", list);
		return "home/index";
	}
}    

画面側のjspファイルを作成。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Home</title>
</head>
<body>
	<c:forEach var="str" items="${strList}">
		<p>${str}</p>
	</c:forEach>
</body>
</html>    

最終的なプロジェクトの構成。

そしたらば、プロジェクトを右クリックし、「プロパティー」を選択し、「デプロイメント・アセンブリー」を「追加(D)...」で。

Java ビルド・パス・エントリー」を選択し、「次へ(N)>」を押下。

Maven 依存関係」を選択し、「完了(F)」を押下。

「適用して閉じる」を押下。

準備ができたので、サーバーで実行します。

Servletのバージョンのせいなのか、Tomcat9_Java17以外だとエラーになってしまう、というかMavenプロジェクトでJavaのバージョンを8に指定してるんだが、TomcatJavaのバージョン17でも動くんか?

とりあえず、「次へ(N)>」を押下。

動かしたいMavenプロジェクト(Web動的プロジェクトに変換してるけど)を「構成済み(C):」に追加し、「完了(F)」を押下。

サーバーが起動したら、ブラウザから、「http://localhost:8080/[プロジェクト名]/Controllerクラスのメソッドで設定したエンドポイント」にアクセスし、

⇧ ページが表示されればOK。

Spring Boot使わないと設定が面倒くさいことこの上ないですね...

どうやら、

qiita.com

⇧ web.xmlServletのバージョンを指定しているらしく、Tomcatの公式のサイトで、

tomcat.apache.org

ServletTomcatのバージョンの対応表が載ってました。それぞれのバージョンの組み合わせを合わせる必要があるってことみたいですね...

pom.xmlでもjavax.servlet-apiのバージョン4.0.1の依存関係を追加してるんだけども、web.xmlServletのバージョンと合わした方が良いんかね?

ちなみに、Eclipseの「サーバー」タブで、今回使用しているEclipse内蔵のTomcatをダブルクリックして、

開いたファイルで「起動構成を開く」のリンクをクリックし、

「クラスパス」を確認したところ、Java 17使ってるっぽい。

JavaアプリケーションのJavaはバージョン8で、Tomcatで動いてるJavaはバージョン17ってことになると思うんだけど、バージョン合わせなくても良いのか謎ですな...

Javaアプリケーションが動いてるのが摩訶不思議なほどのブラックボックスぶりですわね...

毎度モヤモヤ感が半端ない...

今回はこのへんで。