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 Version | Servlet Version | Namespace | Java Version |
---|---|---|---|
Jetty 9.4.x | 3.1 | JavaEE 8/javax.servlet.* | Java 8 |
Jetty 10.0.x | 4.0 | JakartaEE 8/javax.servlet.* | Java 11+ |
Jetty 11.0.x | 5.0 | JakartaEE 9/jakarta.servlet.* | Java 11+ |