2025年3月15日土曜日

Maven で Servlet 開発する

新人研修で JSP&Servlet をやるっぽいので素振りをした。

前提

  • Docker: Docker version 27.4.0, build bde2b89
  • 使用コンテナ: maven:3, tomcat:11

compose.yaml の作成

services:
  app:
    image: maven:3
    volumes:
      - .:/workspaces
      # tomcat11 との共有ディレクトリ
      # ビルドした war ファイルをここに格納する
      - firststep-webapps:/tomcat-webapps
    command: "sleep infinity"
  tomcat:
    image: tomcat:11
    volumes:
      - firststep-webapps:/usr/local/tomcat/webapps
    ports:
      - 8080:8080
volumes:
  firststep-webapps:
    driver: local

開発環境の起動

docker compose up -d

開発環境へ接続

docker compose exec app bash

Maven プロジェクトの作成

ひな形の作成

mvn archetype:generate -DgroupId=dev.mikoto2000.study.servlet -DartifactId=firststep -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

ただし、このプロジェクトは依存が足りなかったり Servlet が jakarta になる前のものだったりするので、 pom.xmlweb.xml を修正する。

pom.xml の修正

${PROJECT_ROOT}/pom.xml に以下依存を追加する。

    <!-- https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api -->
    <dependency>
      <groupId>jakarta.servlet</groupId>
      <artifactId>jakarta.servlet-api</artifactId>
      <version>6.1.0</version>
      <scope>provided</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/jakarta.servlet.jsp.jstl/jakarta.servlet.jsp.jstl-api -->
    <dependency>
      <groupId>jakarta.servlet.jsp.jstl</groupId>
      <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
      <version>3.0.2</version>
    </dependency>

web.xml の修正

${PROJECT_ROOT}/src/main/webapp/WEB-INF/web.xml を修正。

before:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
</web-app>

after:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
    <display-name>MyApp</display-name>
</web-app>

開発

実装

${PROJECT_ROOT}/src/main/java/dev/mikoto2000/study/servlet/firststep/HelloServlet.java に Servlet を実装する。

package dev.mikoto2000.study.servlet.firststep;

import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      response.setContentType("text/html;charset=UTF-8");
      response.getWriter().println("<h1>Hello, Servlet!</h1>");
  }
}

ビルド

mvn package

${PROJECT_ROOT}/target/firststep.war が作成される。

デプロイ

/tomcat-webapps が tomcat のアプリデプロイディレクトリと共有されているので、 war ファイルをそこにコピーする。

cp target/firststep.war /tomcat-webapps/

動作確認

http://localhost:8080/firststep/hello へアクセスすると、 Hello, Servlet! が表示される。

以上。