(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の対応