リンクがどのように作成されているかはわかりませんが、サーブレットに対して GET リクエストを行うようです。これを認識して、各サーブレットはページのカウンター ヒットを管理する必要があります。この値はすべてのユーザーに知られている必要があるため、要求やセッションではなくアプリケーション スコープに保存するのが最善です。詳細はこちらおよびサーブレットはどのように機能しますか? インスタンス化、セッション、共有変数、マルチスレッド。
単一リンクのカウンターを処理する jsp とサーブレットのサンプルを投稿します。リンクの処理にも使用できるはずです。
index.jsp (<head>
やのような他の要素<html>
は、この例では価値がありません)
<body>
Hit the button to add a value to the application counter
<br />
<form action="HitCounterServlet" method="GET">
<input type="submit" value="Add counter hit" />
</form>
<br />
Total hits: ${applicationScope['counter']}
</body>
HitCounterサーブレット
@WebServlet(name = "HitCounterServlet", urlPatterns = {"/HitCounterServlet"})
public class HitCounterServlet extends HttpServlet {
private static final Object counterLock = new Object();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext context = request.getServletContext();
updateHitCounter(context);
String originalURL = "index.jsp";
//in case you want to use forwarding
//request.getRequestDispatcher(originalURL).forward(request, response);
//in case you want to use redirect
response.sendRedirect(response.encodeRedirectURL(request.getContextPath() + "/" + originalURL));
}
private void updateHitCounter(ServletContext context) {
//since more than a request can try to update the counter
//you should protect the update using a synchronized block code
synchronized(counterLock) {
Integer counter = (Integer)context.getAttribute("counter");
if (counter == null) {
counter = 0;
}
counter++;
context.setAttribute("counter", counter);
}
}
}
さまざまなブラウザーでこれを試してみると、カウンターがどのように同じ状態を維持しているかがわかります。
カウンター ヒットをデータベースに保存するには、データベースにupdateHitCounter
接続するコードの関数内のコードを変更し、データベース フィールドに対して update ステートメントを実行するだけです。