はじめに
このプロジェクトでは、Java Servlet と JSP を使って簡単な IP 訪問者追跡アプリケーションを構築する方法を学びます。このアプリケーションは、ウェブサイトにアクセスする訪問者の IP アドレスと、各 IP アドレスの訪問回数を追跡します。
プレビュー

🎯 タスク
このプロジェクトでは、以下のことを学びます。
index.jspファイルを実装して、IP アドレスとその訪問回数を表示する方法。MyListenerクラスを実装して、ServletContextにipVisitMapを作成して保存する方法。MyFilterクラスを実装して、各 IP アドレスの訪問回数をカウントしてipVisitMapを更新する方法。
🏆 成果
このプロジェクトを完了すると、以下のことができるようになります。
- Java Servlet と JSP を使って簡単なウェブアプリケーションを構築する。
ServletContextを使ってアプリケーションレベルのデータを保存および取得する。Filterを使って着信要求をインターセプトして処理する。- 共有リソースへのスレッドセーフなアクセスを保証するために同期を使う。
index.jsp ファイルを実装する
このステップでは、IP アドレスとその訪問回数を表示するためにindex.jspファイルをどのように実装するか学びます。
/home/labex/project/IpProject/src/main/webappディレクトリにあるindex.jspファイルを開きます。以下のコードを
index.jspファイルに追加します。
<%@ page import="java.util.Map" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>IP Visitor Tracker</title>
</head>
<body>
<h1>IP Visitor Tracker</h1>
<table border="1">
<tr>
<th>IP Address</th>
<th>Visit Count</th>
</tr>
<%
Map<String, Integer> ipVisitMap = (Map<String, Integer>) getServletContext().getAttribute("ipVisitMap");
if (ipVisitMap!= null) {
for (String ip : ipVisitMap.keySet()) {
%>
<tr>
<td><%= ip %></td>
<td><%= ipVisitMap.get(ip) %></td>
</tr>
<%
}
}
%>
</table>
</body>
</html>
このコードは、ServletContextからipVisitMapを取得し、IP アドレスとその訪問回数を表形式で表示します。
MyListener クラスを実装する
このステップでは、MyListenerクラスをどのように実装するか学びます。このクラスは、ipVisitMapを作成してServletContextに保存します。
/home/labex/project/IpProject/src/main/java/org/labex/listenerディレクトリにあるMyListener.javaファイルを開きます。以下のコードを
MyListenerクラスに追加します。
package org.labex.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import java.util.HashMap;
import java.util.Map;
@WebListener
public class MyListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
ServletContext servletContext = sce.getServletContext();
Map<String, Integer> ipVisitMap = new HashMap<>();
servletContext.setAttribute("ipVisitMap", ipVisitMap);
}
public void contextDestroyed(ServletContextEvent sce) {
// 必要に応じてクリーンアップコードを記述する
}
}
このコードは、IP アドレスとその訪問回数を保存するための新しいHashMapを作成し、それをServletContextの属性として設定します。
MyFilter クラスを実装する
このステップでは、各 IP アドレスの訪問回数をカウントしてipVisitMapを更新するためにMyFilterクラスをどのように実装するか学びます。
/home/labex/project/IpProject/src/main/java/org/labex/filterディレクトリにあるMyFilter.javaファイルを開きます。以下のコードを
MyFilterクラスに追加します。
package org.labex.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Map;
@WebFilter("/*")
public class MyFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
// 必要に応じて初期化コードを記述する
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String ipAddress = httpRequest.getRemoteAddr();
ServletContext servletContext = httpRequest.getServletContext();
Map<String, Integer> ipVisitMap = (Map<String, Integer>) servletContext.getAttribute("ipVisitMap");
synchronized (ipVisitMap) {
if (ipVisitMap.containsKey(ipAddress)) {
ipVisitMap.put(ipAddress, ipVisitMap.get(ipAddress) + 1);
} else {
ipVisitMap.put(ipAddress, 1);
}
}
chain.doFilter(request, response);
}
public void destroy() {
// 必要に応じてクリーンアップコードを記述する
}
}
このコードは、ServletContextからipVisitMapを取得し、現在のクライアントの IP アドレスを取得してから、それに応じてipVisitMapを更新します。synchronizedブロックは、ipVisitMapへの更新がスレッドセーフであることを保証します。
アプリケーションをテストする
ターミナルを開き、
/home/labex/project/IpProjectディレクトリに移動します。以下のコマンドを実行して Tomcat サーバーを起動します。
mvn tomcat7:run
ウェブブラウザを開き、
http://127.0.0.1:8080に移動します。IP アドレスとその訪問回数が表示された IP 訪問者トラッカーページが表示されるはずです。ページを何度か更新して、訪問回数が増えることを確認します。

まとめ
おめでとうございます!このプロジェクトを完了しました。実力を向上させるために、LabEx でさらに多くの実験を行って練習してください。



