Java Intellij+Gradle+GrettyでWeb Applicationを作成する

code programming hacking html web 820275

Intellij IDEAでWeb Applicationを作成します。ビルドツールにはGradleを使用します。書籍やWebの情報は古くなっているところもあるので、2023年時点で動作確認した内容を記載します。

目次

プロジェクトの新規作成

Intellij IDEAで、New Project → Java Application Gradleで新規作成します。

package: org.example

build.gradleの修正

HttpServletはGrettyプラグインに依存を設定すれば使用できるため、javax.servlet-apiの追加は不要です。

maven repository searchで javax.servlet を検索します。

https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api/4.0.1

build.gradle に以下を追記します。

apply plugin: 'war'
apply from: 'https://raw.github.com/gretty-gradle-plugin/gretty/master/pluginScripts/gretty.plugin'

[Getting started](https://gretty-gradle-plugin.github.io/gretty-doc/Getting-started.html)

web.xmlの作成

src/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8" ?>
<web-app
        xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
        http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
        version="3.1">

    <display-name>Web Application</display-name>

    <servlet>
        <servlet-name>serv</servlet-name>
        <servlet-class>org.example.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>serv</servlet-name>
        <url-pattern>/serv</url-pattern>
    </servlet-mapping>

</web-app>

サーブレットクラスとjspの作成

src/main/java/org/example/MyServlet

package org.example;

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

@WebServlet("/sample")
public class MyServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request,
                         HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<html><head></head>");
        out.println("<body><h1>Hello, World!</h1>");
        out.println("<p>this is a sample servlet page</p>");
        out.println("</body></html>");
    }
}

src/main/webapp/index.jsp

<html>
<head>
    <title>Sample Index</title>
</head>
<body>
<h1>Hello World!</h1>
<%= new java.util.Date().toString() %>
</body>
</html>

Web Applicationの実行

gradle appRunで実行します。

% gradle appRun
22:24:53 INFO  Jetty 11.0.11 started and listening on port 8080
22:24:53 INFO  Web Application runs at:
22:24:53 INFO    http://localhost:8080/gradle-web-app

動作確認

index.jspの動作確認

http://localhost:8080/gradle-web-app

servletの動作確認

http://localhost:8080/gradle-web-app/serv
http://localhost:8080/gradle-web-app/sample

is not a jakarta.servlet.Servletエラーが出た場合

gradle appRun を実行して以下のエラーが出る場合があります。

jakarta.servlet.UnavailableException: Servlet class org.example.MyServlet is not a jakarta.servlet.Servlet

この場合は、 HttpServlet  クラスのパッケージを javax.servlet から jakarta.servlet.http に変更することでエラーが解消されます。他の名前空間も同様に変更します。

javax.servlet.Servlet.HttpServlet
→
jakarta.servlet.http.HttpServlet

[【Java】「Jetty」で「Servlet」を実行するときの注意事項 – fumidzuki](https://fumidzuki.com/knowledge/4639/)

「Jetty」では、対応している「Servlet」のバージョンに違いがあります。使用する場合は、対応している「Servlet」のバージョンを使用する必要があります。

特に「Servlet」のバージョン「5.0」からは、名前空間が「javax.servlet」から「jakarta.servlet」に変更となりました。公式サイトの情報をまとめると、次のような対応表になります。

【Java】「Jetty」で「Servlet」を実行するときの注意事項 – fumidzuki
Jetty VersionServlet VersionNamespaceJava Version
Jetty 9.4.x3.1JavaEE 8/javax.servlet.*Java 8
Jetty 10.0.x4.0JakartaEE 8/javax.servlet.*Java 11+
Jetty 11.0.x5.0JakartaEE 9/jakarta.servlet.*   Java 11+
よかったらシェアしてね!
目次