令和から始めるJavaServletアプリケーション

この記事について

  • Servletって大学のときに聞いたことあるけど、実際よくわかってない
    • そもそもJavaとか触ったことがない
    • が、突如Javaでアプリケーションを作るチームに入ったのでお勉強
  • とりあえず簡単なものを動かしてみて、裏側の実装とかまで覗けたらいいなという気持ち
  • たぶん今回は動かすだけ

まずは動かしてみる

環境

  • macOS Catalina 10.15.4
  • adoptopenjdk-8
  • maven 3.6.3
  • tomcat 9.0.35 (dockerを使用)

プロジェクトの作成

  • mvn コマンドで一発
$ mvn archetype:generate -DgroupId=com.github.nkiri -DartifactId=servletapp -DarchetypeArtifactId=maven-archetype-webapp
$ # インタラクションは全部デフォルト
  • こんな感じに作られる
$ cd servletapp
$ tree .
.
├── pom.xml
└── src
    └── main
        ├── resources
        └── webapp
            ├── WEB-INF
            │   └── web.xml
            └── index.jsp

Servletクラスの実装

  • javax.servelt.http.HttpServletを継承したクラスを作成する
    • src/main/java/com/github/nkiri/servletapp/HelloServlet.java として保存
    • doGetはHTTPのGETメソッドの処理をするためのメソッドで、他のHTTPメソッドはdoPostとかdoDeleteとかを作るらしい
      • 今回は割愛
    • writerにprintlnで文字列を書き込むとクライアントに返される
      • 今回はシンプルなhtml
package com.github.nkiri.servletapp;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class HelloServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter writer = response.getWriter();
        writer.println("<html><head></head><body>hello<body></html>");
    }
}

web.xmlを作成

  • Webアプリケーションの設定を記載する
  • プロジェクト作成時に作られたものを編集
  • /hi にマッチするリクエストはHelloServletが処理するように設定
@@ -3,5 +3,12 @@
  "http://java.sun.com/dtd/web-app_2_3.dtd" >

 <web-app>
-  <display-name>Archetype Created Web Application</display-name>
-</web-app>
+    <servlet>
+        <servlet-name>Hello</servlet-name>
+        <servlet-class>com.github.nkiri.servletapp.HelloServlet</servlet-class>
+    </servlet>
+    <servlet-mapping>
+        <servlet-name>Hello</servlet-name>
+        <url-pattern>/hi</url-pattern>
+    </servlet-mapping>
+</web-app>

ビルド

  • 今回はwarファイルとして生成する
  • pom.xmlを以下のように編集
@@ -9,6 +9,11 @@
   <url>http://maven.apache.org</url>
   <dependencies>
     <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>javax.servlet-api</artifactId>
+      <version>4.0.1</version>
+    </dependency>
+    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>3.8.1</version>
@@ -17,5 +22,12 @@
   </dependencies>
   <build>
     <finalName>servletapp</finalName>
+    <plugins>
+      <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-war-plugin</artifactId>
+          <version>3.2.3</version>
+      </plugin>
+    </plugins>
   </build>
 </project>
  • mvnコマンドでビルド
    • target/servletapp.warが作られる
mvn clean package

tomcatにデプロイ

  • dockerでtomcatを起動
    • warファイルは-vコマンドで渡してあげる
docker run -it --name servletapp -v `pwd`/target/servletapp.war:/usr/local/tomcat/webapps/servletapp.war -p 8080:8080 --rm tomcat:9.0.35-jdk8-openjdk