(1) 仕様について
(2) ソースコード
 (2-1) AccessCounter2.java
  (2-1-1) サンプルPG
  (2-1-2) サンプルPG解説
 (2-2) DbConnectUtil.java
  (2-2-1) サンプルPG
  (2-2-2) サンプルPG解説  (2-3) [画面ID].jsp
  (2-3-1) サンプルPG
  (2-3-2) サンプルPG解説
(3) エラー対応
 (3-1) Java.sql.SQLRecoverableException: Closed Connection
(1) 仕様について
別記事「JSP/Servletで画面毎のアクセスカウンターを作成してみた(パート1:仕様説明編)」をご参照下さい。
(2) ソースコード
(2-1) AccessCounter2.java
(2-1-1) サンプルPG
package login;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletConfig;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import utility.DbConnectUtil;
@WebServlet("/AccessCounter2")
public class AccessCounter2 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public void init(ServletConfig config) throws ServletException {
    	super.init(config);
        System.out.println("init() was executed");
    }
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet() was executed");
	}
	public void GetAccessCount2(HttpServletRequest request, HttpServletResponse response, String function) throws ServletException, IOException 
	{
		int access_count=0;
		DbConnectUtil db = new DbConnectUtil();
		Connection conn1 = null;
		Statement stmt1 = null;
		ResultSet rs1 = null; String sql_sel = "SELECT * FROM ACCESS_COUNTER WHERE FUNCTION_ID='"+function+"'";
		ResultSet rs2 = null; String sql_upd ="";
		ResultSet rs3 = null;
		
		conn1 = db.DbConnect(request, response);
		stmt1 = db.DbStatement(request, response, conn1);
		rs1 = db.DbQuery(request, response, stmt1, sql_sel);
		try {
			while(rs1.next()) {
				sql_upd = "UPDATE ACCESS_COUNTER SET ACCESS_COUNT="+(rs1.getInt("ACCESS_COUNT")+1)+" "+
						  "WHERE COUNTER_ID='"+rs1.getString("COUNTER_ID")+"'";	
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		rs2 = db.DbQuery(request, response, stmt1, sql_upd);
		rs3 = db.DbQuery(request, response, stmt1, sql_sel);
		try {
			while(rs3.next()) {
				access_count = rs3.getInt("ACCESS_COUNT");
				System.out.println("accesscount="+access_count+" getInt-ACCESS_COUNT="+rs3.getInt("ACCESS_COUNT"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		db.DbClose(request,response,conn1,stmt1,rs1);
		db.DbClose(request,response,conn1,stmt1,rs2);
		db.DbClose(request,response,conn1,stmt1,rs3);
		request.setAttribute(function, access_count);
	}
}
(2-1-2) サンプルPG解説
| 行数 | 処理概要 | 
| 19行~22行目 | 特になし | 
| 24行~26行目 | 特になし | 
| 28行~64行目 | GetAccessCount2メソッドの中で、DB接続やステートメント作成やSQL発行等を行っており、それらを使って指定したアクセスカウンタの値を取得・更新して、更新後の値をセッション内の変数としてセットしています。 | 
| 30行~40行目 | DBアクセスやSQL発行に必要なクラスのインスタンス化や変数の初期化及び1回目のSQL発行(カウンタ取得)を行っています。 ・30行目 access_countはアクセスカウンタ用の変数です ・31行目 DbConnectUtilクラスをインスタンス化してDBアクセスに必要なメソッド等を呼べるようにします。 ・32行~36行目 Connection型、Statement型、ResultSet型の変数を初期化しています。ResutSetのrs1はカウンタ更新前の値取得用、rs2はUPDATE用、rs3はカウンタ更新後の値取得用です。 ・38行~39行目 DbConnectUtilのメソッドを使い、初期化したDB接続系の変数をインスタンス化しています。 ・40行目 DbConnectUtilのDbQueryメソッドを用いて、指定した画面の「現在のアクセスカウンタ値」を取得しています。これが次のUPDATE文のWHERE句に使われます。 | 
| 41行~49行目 | ここの区間でアクセスカウンタのUPDATE文を組み立てて、2回目のSQL文の発行(カウンタ更新)を行っています。 ・42行~45行目 ・49行目 | 
| 50行~62行目 | この区間では3回目のSQL発行(カウンタ再取得)とDBオブジェクトのクローズを行っています。 ・50行~55行目 ・59行~61行目 ・62行目 | 
(2-2) DbConnectUtil.java
(2-2-1) サンプルPG
Connectionクラスをインスタンス化する「DbConnect」メソッド、Statementクラスをインスタンス化する「DbStatement」メソッド、SQL発行してResultSetを返却する「DbQuery」等、こちらの記事の「DbConnectTest2」クラスと同等の内容のため、本記事での説明は割愛。
DBアクセス部品のクラスの解説 
(2-2-2) サンプルPG解説
こちらの記事の「DbConnectTest2」クラスと同等の内容のため、本記事での説明は割愛。
DBアクセス部品のクラスの解説 
(2-3) [画面ID].jsp
(2-3-1) サンプルPG
ユーザーから見える画面JSPのサンプルを紹介します。
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="login.AccessCounter2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
	<center>
		<h2 id="title">[Screen ID]</h2>
		<h3 id="subtitle">[Name of Screen]</h3>
		<%
		AccessCounter2 ac2 = new AccessCounter2();
		ac2.GetAccessCount2(request, response, "EGDLDNPG");
		%>
		[ Access counter for EGDLDNPG : <b><%=request.getAttribute("EGDLDNPG")%></b> ]
		<br /><br />
	</center>
</head>
<body>
Test
</body>
</html>
(図)

(2-3-2) サンプルPG解説
上記JSPのポイントとなる部分を解説します。
| 行数 | 処理概要 | 
| 11行~14行目 | 12行目でAccessCounter2クラスをインスタンス化し、13行目でその中のGetAccessCount2メソッドを呼び出しています。ポイントとして、引数に「画面ID」を指定する事により指定した画面のIDをピンポイントで更新します。 | 
| 15行目 | 行前半と末尾の『[ Access counter for EGDLDNPG :』と『]』は画面に直接表示するテキストで、その間の『<%=request.getAttribute(“EGDLDNPG”)%>』で指定した画面の「更新後のアクセスカウンタ値」を取得しています。 | 
(3) エラー対応
(3-1) Java.sql.SQLRecoverableException: Closed Connection
このエラーが発生した際の対応については、下記の記事にて解説しているため割愛。
Java.sql.SQLRecoverableException: Closed Connectionの対応 
 
											 
											 
											 
											