⇧ amazing...
JSP + JSTL(JSP Standard Tag Library)+ Spring Web MVCをTomcatで実行
フロントエンドとサーバーサイドが密結合するので、JSPやThymeleafを使いたくないのですが、参画したプロジェクトで利用してるので致し方ない。
⇧ 上記サイト様を参考に学習していきます。
Eclipseで「ファイル(F)」>「新規(N)」>「Maven プロジェクト」を選択。
「シンプルなプロジェクトの作成(S)(アーキタイプ選択のスキップ)」にチェックを入れて「次へ(N)>」を押下。
「グループId:」「アーティファクトId:」を適当に入力し、「パッケージング:」は「war」を指定。
プロジェクトが作成されます。
ちなみに、Eclipseに同梱されてるMavenの情報を確認するには、
⇧ 上記サイト様が参考になるかと。
話が脱線しましたが、プロジェクトが作成されたら、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に指定してるんだが、TomcatのJavaのバージョン17でも動くんか?
とりあえず、「次へ(N)>」を押下。
動かしたいMavenプロジェクト(Web動的プロジェクトに変換してるけど)を「構成済み(C):」に追加し、「完了(F)」を押下。
サーバーが起動したら、ブラウザから、「http://localhost:8080/[プロジェクト名]/Controllerクラスのメソッドで設定したエンドポイント」にアクセスし、
⇧ ページが表示されればOK。
Spring Boot使わないと設定が面倒くさいことこの上ないですね...
どうやら、
⇧ web.xmlでServletのバージョンを指定しているらしく、Tomcatの公式のサイトで、
⇧ ServletとTomcatのバージョンの対応表が載ってました。それぞれのバージョンの組み合わせを合わせる必要があるってことみたいですね...
pom.xmlでもjavax.servlet-apiのバージョン4.0.1の依存関係を追加してるんだけども、web.xmlのServletのバージョンと合わした方が良いんかね?
ちなみに、Eclipseの「サーバー」タブで、今回使用しているEclipse内蔵のTomcatをダブルクリックして、
開いたファイルで「起動構成を開く」のリンクをクリックし、
「クラスパス」を確認したところ、Java 17使ってるっぽい。
JavaアプリケーションのJavaはバージョン8で、Tomcatで動いてるJavaはバージョン17ってことになると思うんだけど、バージョン合わせなくても良いのか謎ですな...
Javaアプリケーションが動いてるのが摩訶不思議なほどのブラックボックスぶりですわね...
毎度モヤモヤ感が半端ない...
今回はこのへんで。