Top > ゴルフスコア管理

準備

ゴルフスコア管理システム

はじめに

これまで闇雲に情報を収集して断片的な技術をまとめてきたが、とりあえずきちんと使えるアプリケーションを作ってみることを目的とする。実務経験が乏しいので何が業界のスタンダードかわかっていないが、少なくとも比較できるための対象となるアプリケーションができればと思う。

システム化とは、必ず何かしらの目的の元に作成される。資材所要量計画による適正な自動発注や所要に基づく支供給予定生成、倉庫管理による在庫の最適化や倉庫業務の単純化による人件費や業務レスポンスの改善など企業内の業務改善の陰には必ずシステムの存在がある。システム先行型の業務改革のニーズはこれから益々高まってくると思う。というわけで、いっこうにゴルフの腕が上達しない自分のためにゴルフスコアを管理するアプリケーションを作成してみる。

処理概要

ゴルフスコアをデータベースに登録しデータ管理を行う。

当システムでは以下の機能を有する。

  • ユーザーマスタ管理による承認機能
  • 自動ログイン機能
  • ユーザーの新規登録
  • ユーザーデーの編集
  • ユーザーデータの削除
  • ゴルフスコアの登録
  • ゴルフスコアの照会
  • ゴルフスコアの修正
  • (天候や季節ごとのスコアの傾向の照会)
  • (OUT/INスコアのアベレージや各賞の獲得率の照会)
  • etc...

システム構成

OS : Windows XP Home Edition
開発言語:Java JDK5 version 1.6.0_03

データベース:MySQL 5.0

サーブレットコンテナ:Tomcat 5.5

エディタ:TeraPad
※上記の表現が正しいか現時点ではわかりません

データベースコネクションプーリングの設定

Tomcatには、一度取得したコネクションを保持しユーザーからの要求に対して保持したコネクションを割り当てるプーリング機能がある。この設定を行うことでページごとにコネクションを取得する必要がなくなり、CPUにかける負担を減らすことができる。

コンテキストの設定

作成したコンテキストの設定ファイルは、Tomcatをインストールした以下のフォルダに置く。

C:\Program Files\Apache Software Foundation\Tomcat 5.5\conf\Catalina\localhost
fileGOLF.xml
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
<?xml version='1.0' encoding='utf-8'?>
<Context docBase="C:/produst/GOLF" path="/GOLF">
	<Resource name="jdbc/golf"
		removeAbandoned="true"
		removeAbandonedTimeout="60"
		logAbandoned="true"
		auth="Container"
		type="javax.sql.DataSource"
		maxActive="20"
		maxIdle="60"
		maxWait="1000"
		username="USER1"
		password="INIT"
		driverClassName="com.mysql.jdbc.Driver"
		url="jdbc:mysql://localhost/golf?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=cp932"
	/>
</Context>
 

参考:Tomcat5 サーブレット/JSP コンテナ

web.xmlの設定

web.xmlでは、golf.xmlに設定したコンテキストのリソースを参照する設定を行う。
作成したweb.xmlファイルはコンテキストの[WEB-INF]フォルダにセットする。

fileweb.xml
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
	<resource-ref>
		<description>DB Connection</description>
		<res-ref-name>jdbc/golf</res-ref-name>
		<res-type>javax.sql.DataSource</res-type>
		<res-auth>Container</res-auth>
	</resource-ref>
</web-app>

テーブル設計

登録されたユーザーがアプリケーションにログインしてスコアを登録すためのマスターテーブルとトランザクションテーブルを登録する。MySQLのデータ型について詳しく調べていないので適切な型を使用しているか心配。。。タイムスタンプについても用途が明確になっていないので省略。

ユーザーマスタ

管理者が他のユーザーのパスワードの初期化やデータの削除が行えるよう[権限](priv)を設ける。毎回ログインを行うのは使い勝手が悪いので[自動ログイン用キー](auto_key)もユーザーマスタに持たせる。

fileuser.sql
  0
  1
  2
  3
  4
  5
  6
  7
CREATE TABLE user(
  id         INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,    #ユーザーID
  user_name    VARCHAR(20) UNIQUE, #ユーザー名
  password     CHAR(41),             #パスワード
  real_name VARCHAR(40),        #ユーザー名称
  priv      INT DEFAULT 0,      #権限
  auto_key     VARCHAR(255)        #自動ログイン用キー
);

コースマスタ

ゴルフコースのデータを保持するためのマスタ。本当は所在地や予約ための電話番号などを持たせたほうが拡張性があるが、今回は単純に名称を定義するだけのテーブルを登録。

filecourse.sql
  0
  1
  2
  3
CREATE TABLE course(
  cid             INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,    #コースID
  course_name    VARCHAR(100) UNIQUE, #コース名
);

天候マスタ

天候に応じてたスコアの傾向などを照会する機能のため、天候についてもマスタ化しておく。どれだけの種類の天候を登録するかは後回し。

fileweather.sql
  0
  1
  2
  3
CREATE TABLE weather(
  wid             INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,    #天候ID
  weather_name    VARCHAR(40) UNIQUE,                         #天候
);

スコアデータ

award1〜4は、ニアピン賞/ドラコン賞を獲得した場合のフラグ。

  • award1・・・ニアピン賞(OUT)
  • award2・・・ニアピン賞(IN)
  • award3・・・ドラコン賞(OUT)
  • award4・・・ドラコン賞(IN)

それぞれ該当する賞を獲得した場合は、'X'をセットする。獲得できなかった場合は空白とし、賞を設けていないラウンドの場合は、'-'をセットする。

filescore.sql
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
CREATE TABLE score(
  id         INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,    #ID
  uid        INT UNSIGNED,        #ユーザーID
  pdate        DATE,                #ラウンド日
  cid        INT UNSIGNED,        #コースID
  outscore    INT UNSIGNED,        #アウトスコア
  inscore    INT UNSIGNED,        #インスコア
  score        INT UNSIGNED,        #ラウンドスコア
  award1    CHAR(1),            #ニアピン(OUT)
  award2    CHAR(1),            #ニアピン(IN)
  award3    CHAR(1),            #ドラコン(OUT)
  awrd4        CHAR(1),            #ドラコン(IN)
  wid        INT UNSIGNED,        #天候
);

スクリプトファイル

スクリプトファイルを作成しておく。

filegolf.sql
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
#既存のデータベース領域の削除
DROP DATABASE golf;
 
#データベース領域の作成
CREATE DATABASE golf;
 
#データベース領域の選択
USE golf;
 
 
#ユーザーマスタテーブル作成
CREATE TABLE user(
  id         INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,    #ユーザーID
  user_name    VARCHAR(20) UNIQUE, #ユーザー名
  password     CHAR(41),             #パスワード
  real_name VARCHAR(40),        #ユーザー名称
  priv      INT DEFAULT 0,      #権限
  auto_key     VARCHAR(255)        #自動ログイン用キー
);
 
#コースマスタテーブル作成
CREATE TABLE course(
  cid             INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,    #コースID
  course_name    VARCHAR(100) UNIQUE     #コース名
);
 
#天候マスタテーブル作成
CREATE TABLE weather(
  wid             INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,    #天候ID
  weather_name    VARCHAR(40) UNIQUE                          #天候
);
 
#スコアデータテーブル作成
CREATE TABLE score(
  id         INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,    #ID
  uid        INT UNSIGNED,        #ユーザーID
  pdate        DATE,                #ラウンド日
  cid        INT UNSIGNED,        #コースID
  outscore    INT UNSIGNED,        #アウトスコア
  inscore    INT UNSIGNED,        #インスコア
  score        INT UNSIGNED,        #ラウンドスコア
  award1    CHAR(1),            #ニアピン(OUT)
  award2    CHAR(1),            #ニアピン(IN)
  award3    CHAR(1),            #ドラコン(OUT)
  awrd4        CHAR(1),            #ドラコン(IN)
  wid        INT UNSIGNED        #天候
);
 
 
#ユーザーマスタデータ登録
INSERT INTO user SET
  user_name    = 'admin',
  password     = password('init'),
  real_name = '管理者',
  priv      = '1'
;
 
INSERT INTO user SET
  user_name    = 'test',
  password     = password('test'),
  real_name = 'テストユーザー';
 
#コースマスタデータ登録
INSERT INTO course SET course_name = '鹿島南蓼科ゴルフコース';
INSERT INTO course SET course_name = 'サニーカントリークラブ';
INSERT INTO course SET course_name = '塩嶺カントリークラブ';
INSERT INTO course SET course_name = '三井の森蓼科ゴルフ倶楽部';
INSERT INTO course SET course_name = '富士見高原ゴルフコース';
INSERT INTO course SET course_name = '斑尾高原カントリー倶楽部';
INSERT INTO course SET course_name = '松本浅間カントリークラブ';
INSERT INTO course SET course_name = '蓼科高原カントリークラブ';
 
#天候マスタデータ登録
INSERT INTO weather SET weather_name = '晴れ';
INSERT INTO weather SET weather_name = '曇り';
INSERT INTO weather SET weather_name = '雨';
INSERT INTO weather SET weather_name = 'その他';

クラス

Model View Controller(モデル・ビュー・コントローラ)モデルがよくわかっていない・・・

Userクラス

Userクラスはuserテーブルにユーザーの登録があるか照合するためのメソッド、新規登録、変更データ削除などの機能を有する。アプリケーションに登録されたユーザーだけがこのシステムにログインし、ゴルフスコアを登録できる仕組みにする。

※コンパイル方法

>javac -d . User.java
fileUser.java
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
/*
プログラム名:User.java
作成者:
*/
package produst.golf;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
 
public class User {
 
    /** フィールド定義 */
    public static String[] aryPrivName = {"無効なアカウント", "一般ユーザー", "管理者"};
    private int intId=0;
    private int intPriv=0;
    private String strUserName="";
    private String strRealName="";
    private String strUrl=null;
    
    /** ゲッター&セッター */
    public int getId() {
        return this.intId;
    }
    public int getPriv() {
        return this.intPriv;
    }
    public String getUserName() {
        return this.strUserName;
    }
    public String getUserRealName() {
        return this.strRealName;
    }
    public String getUrl() {
        return this.strUrl;
    }
    
    public void setRealName(String strRealNameArg) {
        this.strRealName = strRealNameArg;
    }
    public void setPriv(int intPrivArg) {
        this.intPriv = intPrivArg;
    }
    public void setUrl(String strUrlArg) {
        this.strUrl = strUrlArg;
    }
    
    /** loginメソッド */
    public boolean login(String strUserName, String strPassword) throws Exception{
        boolean blResult=false;
        Context ctx = new InitialContext();
        DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/golf");
        Connection conn = ds.getConnection();
        
        // ユーザーマスタ存在チェック
        String strSql = "SELECT * FROM user " 
                       + "WHERE user_name = ? "
                         + "AND password  = password(?) "
                         + "AND priv != 0 ";
        PreparedStatement pstmt = conn.prepareStatement(strSql);
        pstmt.setString(1, strUserName);
        pstmt.setString(2, strPassword);
        ResultSet rs = pstmt.executeQuery();
        if (rs.next()) {
            this.intId = rs.getInt("id");
            this.strRealName = rs.getString("real_name");
            this.intPriv = rs.getInt("priv");
            blResult = true;
        }
        
        // クローズ処理
        pstmt.close();
        conn.close();
        
        // 結果を返す
        return blResult;
    }
    
    /** autoLoginメソッド */
    // クッキーによる自動ログインのためのメソッド
    // ユーザー名とパスワードの変わりにidとauto_keyを使用する
    // JPSにおいてクッキーから読み取り、このメソッドに渡す
    public boolean autoLogin(String strIdArg, String strAutoKeyArg) throws Exception {
        boolean blResult=false;
        Context ctx = new InitialContext();
        DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/golf");
        Connection conn = ds.getConnection();
 
        // ユーザーマスタ存在チェック
        String strSql = "SELECT * FROM user " 
                       + "WHERE id = ? "
                         + "AND auto_key = ? "
                         + "AND priv != 0 ";
        PreparedStatement pstmt = conn.prepareStatement(strSql);
        pstmt.setString(1, strIdArg);
        pstmt.setString(2, strAutoKeyArg);
        ResultSet rs = pstmt.executeQuery();
        if (rs.next()) {
            this.intId = rs.getInt("id");
            this.strUserName = rs.getString("user_name");
            this.strRealName = rs.getString("real_name");
            this.intPriv = rs.getInt("priv");
            blResult = true;
        }
 
        // クローズ処理
        pstmt.close();
        conn.close();
        
        // 結果を返す
        return blResult;
    }
    
    //** addメソッド */
    // setRealNameメソッドとsetPrivメソッドで設定してからこのメソッドを使用する
    public void add(String strUserNameArg, String strPasswordArg) throws Exception {
        Connection conn=null;
        PreparedStatement pstmt=null;
        
        try {
            Context ctx = new InitialContext();
            DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/golf");
            conn = ds.getConnection();
            
            // SQL文の生成 real_name/privはsetRealNameメソッドと
            // setPrivメソッドを使用する想定
            String strSql = "INSERT INTO user SET "
                           + "user_name = ?, "
                           + "password  = password(?), "
                           + "real_name = ?, "
                           + "priv      = ? ";
            pstmt = conn.prepareStatement(strSql);
            pstmt.setString(1, strUserNameArg);
            pstmt.setString(2, strPasswordArg);
            pstmt.setString(3, this.strRealName);
            pstmt.setInt(4, this.intPriv);
            pstmt.executeUpdate();
        } catch (SQLException e) {
            // データベースのカラムより長いデータが指定された場合のエラー
            if (e.getSQLState().equals(01004)) {
                throw new Exception("文字列が長すぎます");
            // データの重複エラー
            } else if (e.getErrorCode() == 1062) {
                throw new Exception("既に使用されているユーザーです");
            } else {
                throw e;
            }
        } finally {
            // クロース処理
            pstmt.close();
            conn.close();
        }
    }
    
    //** loadメソッド */
    // ユーザー管理のために使用
    public void load(int intIdArg) throws Exception {
        Context ctx = new InitialContext();
        DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/golf");
        Connection conn = ds.getConnection();
        
        // SQL文の生成
        String strSql = "SELECT * FROM user "
                       + "WHERE id = ?";
        PreparedStatement pstmt = conn.prepareStatement(strSql);
        pstmt.setInt(1, intIdArg);
        ResultSet rs = pstmt.executeQuery();
        if (rs.next()) {
            this.intId = rs.getInt("id");
            this.strUserName=rs.getString("user_name");
            this.strRealName = rs.getString("real_name");
            this.intPriv = rs.getInt("priv");
        } else {
            throw new Exception("ユーザーが登録されていません");
        }
        // クロース処理
        pstmt.close();
        conn.close();
    }
    
    //** updateメソッド */
    // パスワードはChangePasswordメソッドで更新する
    public void update() throws Exception {
        Connection conn=null;
        PreparedStatement pstmt=null;
        
        try {
            Context ctx = new InitialContext();
            DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/golf");
            conn = ds.getConnection();
            
            // UPDATE文の生成 
            String strSql = "UPDATE user SET "
                                 + "real_name = ?,"
                                 + "priv      = ? "
                           + "WHERE id = ?";
            pstmt = conn.prepareStatement(strSql);
            pstmt.setString(1, strRealName);
            pstmt.setInt(2, intPriv);
            pstmt.setInt(3, intId);
 
            int intResult = pstmt.executeUpdate();
            if (intResult != 1) {
                throw new Exception("更新処理に失敗しました");
            }
        } catch (SQLException e) {
            // データベースのカラムより長いデータが指定された場合のエラー
            if (e.getSQLState().equals(01004)) {
                throw new Exception("文字列が長すぎます");
            } else {
                throw e;
            }
        } finally {
            // クロース処理
            pstmt.close();
            conn.close();
        }
    }
    
    //** setAutoKeyメソッド */
    // auto_keyをuserテーブルにセットする
    // JSPでは同じ情報をクッキーに保存する
    public void setAutoKey(String strAutoKeyArg) throws Exception {
        Context ctx = new InitialContext();
        DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/golf");
        Connection conn = ds.getConnection();
        
        // UPDATE文の生成
        String strSql = "UPDATE user SET "
                             + "auto_key = ? "
                      + "WHERE id = ?";
        PreparedStatement pstmt = conn.prepareStatement(strSql);
        pstmt.setString(1, strAutoKeyArg);
        pstmt.setInt(2, this.intId);
        int intResult = pstmt.executeUpdate();
        if (intResult != 1) {
            throw new Exception("auto_keyの更新処理に失敗しました");
        }
        // クロース処理
        pstmt.close();
        conn.close();
    }
    
    //** deleteメソッド */
    public void delete() throws Exception {
        Context ctx = new InitialContext();
        DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/golf");
        Connection conn = ds.getConnection();
        
        // DELETE文の生成
        String strSql = "DELETE FROM user "
                      + "WHERE id = ?";
        PreparedStatement pstmt = conn.prepareStatement(strSql);
        pstmt.setInt(1, this.intId);
        int intResult = pstmt.executeUpdate();
        if (intResult != 1) {
            throw new Exception("削除処理に失敗しました");
        }
        // クロース処理
        pstmt.close();
        conn.close();
    }
    
    //** clearメソッド */
    public void clear() {
        // フィールド値のクリア
        this.intId = 0;
        this.strUserName = "";
        this.strRealName = "";
        this.intPriv = 0;
    }
    
    //** changePasswordメソッド */
    // ユーザー自身でパスワードを変更する場合に使用する
    public boolean changePassword(String strOldPasswordArg, String strNewPasswordArg)
                                throws Exception {
        boolean blResult=false;
        
        Context ctx = new InitialContext();
        DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/golf");
        Connection conn = ds.getConnection();
        
        // UPDATE文の生成
        String strSql = "UPDATE user SET "
                             + "password = password(?) "
                      + "WHERE id = ? "
                      + "AND password = password(?)";
        PreparedStatement pstmt = conn.prepareStatement(strSql);
        pstmt.setString(1, strNewPasswordArg);
        pstmt.setInt(2, this.intId);
        pstmt.setString(3, strOldPasswordArg);
        int intResult = pstmt.executeUpdate();
        if (intResult == 1) {
            blResult= true;
        }
        // クロース処理
        pstmt.close();
        conn.close();
        return blResult;
    }
    
    //** changePasswordByAdminメソッド */
    // ユーザーがパスワードを忘れてしまった場合に管理者が変更するためのメソッド
    public boolean changePasswordByAdmin(String strNewPasswordArg) 
                                    throws Exception {
        boolean blResult=false;
        
        Context ctx = new InitialContext();
        DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/golf");
        Connection conn = ds.getConnection();
        
        // UPDATE文の生成
        String strSql = "UPDATE user SET "
                             + "password = password(?) "
                      + "WHERE id = ? ";
        PreparedStatement pstmt = conn.prepareStatement(strSql);
        pstmt.setString(1, strNewPasswordArg);
        pstmt.setInt(2, this.intId);
        int intResult = pstmt.executeUpdate();
        if (intResult == 1) {
            blResult= true;
        }
        // クロース処理
        pstmt.close();
        conn.close();
        return blResult;
    }
 
}
  • パッケージの設定

    パッケージ名の一般的な命名のルールがわかっていないため、とりあえず[produst.golf]としておく。
  • フィールド定義

    ayrPrivNameは権限の名称をセットしておく。無効なアカウントは一時的に使用できない状態を想定。
  • ゲッター&セッター
    strUserNameのセッターは更新想定がないことから不要。
  • loginメソッド
    ユーザー名とパスワードを照合する。
  • autoLoginメソッド
    auto_keyによってユーザーを照合する。
  • addメソッド
    ユーザーの新規登録。このメソッドを呼ぶ出す前に、setRealNameメソッドとsetPrivメソッドを実行し名前と権限の設定を行っておく必要がある。
  • loadメソッド
    idから登録ユーザーの情報を読み込む。
  • updateメソッド
    ユーザー情報の更新を行う。パスワードについてはパスワード変更専用のメソッドを使用する。
  • deleteメソッド
    ユーザー情報の削除を行う。
  • clearメソッド
    フィールドの初期化。
  • changePasswordメソッド
    ユーザーが自分のパスワードを変更するためのメソッド。現行のパスワードが更新の条件となっている。
  • changePasswordByAdminメソッド
    管理者が他のユーザーのパスワードを変更(初期化)するためのメソッド。パスワードは更新の条件となっていない。

UserListクラス

userテーブルの内容を1件ずつ取得するクラスを作成する。データベース連携関連のオブジェクトをクラスフィールドに宣言することで、next()メソッドを呼び出して次々に値を取得することができるようになる。

fileUserList.java
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
/*
プログラム名:UserList.java
作成者:
*/
package produst.golf;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
 
public class UserList {
 
    /** フィールド定義 */
    public static String[] aryPrivName = {"無効なアカウント", "一般ユーザー", "管理者"};
    private int intId=0;
    private int intPriv=0;
    private String strUserName="";
    private String strRealName="";
    //データベース関連オブジェクト
    private Context ctx=null;
    private DataSource ds=null;
    private Connection conn=null;
    private Statement stmt=null;
    private ResultSet rs=null;
    
    
    /** ゲッター */
    public int getId() {
        return this.intId;
    }
    public String getUserName() {
        return this.strUserName;
    }
    public String getRealName() {
        return this.strRealName;
    }
    public String getPrivName() {
        return this.aryPrivName[this.intPriv];
    }
    
    //** loadUserメソッド */
    public void loadUser() throws Exception {
        this.ctx = new InitialContext();
        this.ds = (DataSource)ctx.lookup("java:comp/env/jdbc/golf");
        this.conn = this.ds.getConnection();
        this.stmt = this.conn.createStatement();
        String strSql = "SELECT * FROM user";
        this.rs = this.stmt.executeQuery(strSql);
    }
    
    //** readNextメソッド */
    public boolean readNext() throws Exception {
        boolean blResult=false;
        if (rs.next()) {
            this.intId = this.rs.getInt("id");
            this.strUserName = this.rs.getString("user_name");
            this.strRealName = this.rs.getString("real_name");
            this.intPriv = this.rs.getInt("priv");
            blResult = true;
        }
        return blResult;
    }
    
    //** closeメソッド */
    public void close() throws Exception {
        this.stmt.close();
        this.conn.close();
        this.ctx.close();
    }
}

Scoreクラス

Scoreクラスはscoreテーブルにゴルフスコアを登録したり編集、削除する機能を有する。

ソースコードについては動作確認前のため保障できません。。。 (^^;

fileScore.java
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
/*
プログラム名:Score.java
作成者:
*/
package produst.golf;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
import java.util.Date;
 
public class Score {
 
    /** フィールド定義 */
    private int intId=0;
    private int intUid=0;
    private String strPdate="";
    private int intCid=0;
    private int intInScore=0;
    private int intOutScore=0;
    private int intScore=0;
    private String strAward1="";
    private String strAward2="";
    private String strAward3="";
    private String strAward4="";
    private int intWid=0;
    
    
    /** ゲッター&セッター */
    public int getId() { return this.intId; }
    public int getUid() { return this.intUid; }
    public int getCid() { return this.intCid; }
    public int getInScore() { return this.intInScore; }
    public int getOutScore() { return this.intOutScore; }
    public int getScore() { return this.intScore; }
    public int getWid() { return this.intWid;}
    public String getPdate() {    return this.strPdate; }
    public String getAward1() {    return this.strAward1; }
    public String getAward2() {    return this.strAward2; }
    public String getAward3() {    return this.strAward3; }
    public String getAward4() {    return this.strAward4; }
 
 
    public void setId(int intIdArg) {    this.intId = intIdArg; }
    public void setUid(int intUidArg) {    this.intUid = intUidArg; }
    public void setCid(int intCidArg) { this.intCid = intCidArg; }
    public void setInScore(int intInScoreArg) { this.intInScore = intInScoreArg; }
    public void setOutScore(int intOutScoreArg) { this.intOutScore = intOutScoreArg; }
    public void setScore(int intScoreArg) { this.intScore = intScoreArg; }
    public void setWid(int intWidArg) { this.intWid = intWidArg; }
    public void setPdate(String strPdateArg) {this.strPdate = strPdateArg; }
    public void setAward1(String strAward1Arg) {this.strAward1 = strAward1Arg; }
    public void setAward2(String strAward2Arg) {this.strAward2 = strAward2Arg; }
    public void setAward3(String strAward3Arg) {this.strAward3 = strAward3Arg; }
    public void setAward4(String strAward4Arg) {this.strAward4 = strAward4Arg; }
 
    /** addメソッド */
    public void add(int intUidArg, 
                    String strPdateArg,
                    int intCidArg,
                    int intOutScoreArg,
                    int intInScoreArg,
                    int intScoreArg,
                    String strAward1Arg,
                    String strAward2Arg,
                    String strAward3Arg,
                    String strAward4Arg,
                    int intWidArg
                    ) throws Exception {
        Connection conn=null;
         PreparedStatement pstmt=null;
 
        try {
            Context ctx = new InitialContext();
            DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/golf");
            conn = ds.getConnection();
            
            String strSql = "INSERT INTO score SET "
                           + "uid = ?, "
                           + "pdate = ?, "
                           + "cid = ?, "
                           + "outscore = ?, "
                           + "inscore = ?, "
                           + "score = ?, "
                           + "award1 = ?, "
                           + "award2 = ?, "
                           + "award3 = ?, "
                           + "award4 = ?, "
                           + "wid = ? ";
            pstmt = conn.prepareStatement(strSql);
            pstmt.setInt(1, intUidArg);
            pstmt.setString(2, strPdateArg);
            pstmt.setInt(3, intCidArg);
            pstmt.setInt(4, intOutScoreArg);
            pstmt.setInt(5, intInScoreArg);
            pstmt.setInt(6, intScoreArg);
            pstmt.setString(7, strAward1Arg);
            pstmt.setString(8, strAward2Arg);
            pstmt.setString(9, strAward3Arg);
            pstmt.setString(10, strAward4Arg);
            pstmt.setInt(11, intWidArg);
            pstmt.executeUpdate();
        } catch (SQLException e) {
            // データベースのカラムより長いデータが指定された場合のエラー
            if (e.getSQLState().equals(01004)) {
                throw new Exception("文字列が長すぎます");
            } else {
                throw e;
            }
        } finally {
            // クロース処理
            pstmt.close();
            conn.close();
        }
 
    }
 
    /** updateメソッド */
    public void update() throws Exception {
        Connection conn=null;
        PreparedStatement pstmt=null;
 
        try {
            Context ctx = new InitialContext();
            DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/golf");
            conn = ds.getConnection();
            
            String strSql = "UPDATE score SET "
                           + "uid = ?, "
                           + "pdate = ?, "
                           + "cid = ?, "
                           + "outscore = ?, "
                           + "inscore = ?, "
                           + "score = ?, "
                           + "award1 = ?, "
                           + "award2 = ?, "
                           + "award3 = ?, "
                           + "award4 = ?, "
                           + "wid = ? "
                           + "WHERE id = ? ";
            pstmt = conn.prepareStatement(strSql);
            pstmt.setInt(1, this.intUid);
            pstmt.setString(2, this.strPdate);
            pstmt.setInt(3, this.intCid);
            pstmt.setInt(4, this.intOutScore);
            pstmt.setInt(5, this.intInScore);
            pstmt.setInt(6, this.intScore);
            pstmt.setString(7, this.strAward1);
            pstmt.setString(8, this.strAward2);
            pstmt.setString(9, this.strAward3);
            pstmt.setString(10, this.strAward4);
            pstmt.setInt(11, this.intWid);
            pstmt.setInt(12, this.intId);
            int intResult = pstmt.executeUpdate();
            if (intResult!=1) {
                throw new Exception("更新処理に失敗しました");
            }
        } catch (SQLException e) {
            // データベースのカラムより長いデータが指定された場合のエラー
            if (e.getSQLState().equals(01004)) {
                throw new Exception("文字列が長すぎます");
            } else {
                throw e;
            }
        } finally {
            // クロース処理
            pstmt.close();
            conn.close();
        }
 
    }
 
    //** deleteメソッド */
    public void delete() throws Exception {
        Context ctx = new InitialContext();
        DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/golf");
        Connection conn = ds.getConnection();
        
        // DELETE文の生成
        String strSql = "DELETE FROM score "
                      + "WHERE id = ?";
        PreparedStatement pstmt = conn.prepareStatement(strSql);
        pstmt.setInt(1, this.intId);
        int intResult = pstmt.executeUpdate();
        if (intResult != 1) {
            throw new Exception("削除処理に失敗しました");
        }
        // クロース処理
        pstmt.close();
        conn.close();
    }
    
    //** loadメソッド */
    public void load(int intIdArg) throws Exception {
        Context ctx = new InitialContext();
        DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/golf");
        Connection conn = ds.getConnection();
 
        String strSql = "SELECT * FROM score "
                      + "WHERE id = ?";
        PreparedStatement pstmt = conn.prepareStatement(strSql);
        pstmt.setInt(1, intIdArg);
        ResultSet rs = pstmt.executeQuery();
        if (rs.next()) {
            this.intId = intIdArg;
            this.intUid = rs.getInt("uid");
            this.strPdate = rs.getString("pdate"); 
            this.intCid = rs.getInt("cid");
            this.intOutScore = rs.getInt("outscore");
            this.intInScore = rs.getInt("inscore");
            this.intScore = rs.getInt("score");
            this.strAward1 = rs.getString("award1");
            this.strAward2 = rs.getString("award2");
            this.strAward3 = rs.getString("award3");
            this.strAward4 = rs.getString("award4");
            this.intWid = rs.getInt("wid");
        } else {
            throw new Exception("指定されたスコアデータが存在しません");
        }
        
        pstmt.close();
        conn.close();    
    }
    
    
    //** clear */
    public void clear() {
        this.intId = 0;
        this.intUid = 0;
        this.strPdate = ""; 
        this.intCid = 0;
        this.intOutScore = 0;
        this.intInScore = 0;
        this.intScore = 0;
        this.strAward1 = "";
        this.strAward2 = "";
        this.strAward3 = "";
        this.strAward4 = "";
        this.intWid = 0;
    }
 
}

[2008.2.27]

scoreクラスにコースコードをプレー日を返すゲッターを追加

public int getCid() { return this.intCid; }
public String getPdate() {	return this.strPdate; }

[2008.3.2]

  • データセット用メソッドの追加
  • SQL文のバグを修正
  • UPDATEメソッドのUPDATE文にWHERE句追加

ScoreListクラス

ScoreListクラスはゴルフスコアデータを一覧表示するためのクラス。とはってもコンパイルがとおっただけでスコアデータの絞込み条件などの機能がないので実装しながら修正していく必要あり。ということで現時点では限りなく未完成 (^^;

fileScoreList.java
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/*
プログラム名:ScoreList.java
作成者:
*/
package produst.golf;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
import java.util.Date;
import java.text.*;
 
public class ScoreList{
    /** フィールド定義 */
    private int intId=0;
    private int intUid=0;
    private String strPdate="";
    private int intCid=0;
    private int intOutScore=0;
    private int intInScore=0;
    private int intScore=0;
    private String strAward1="";
    private String strAward2="";
    private String strAward3="";
    private String strAward4="";
    private int intWid=0;
    private String strUserName="";
    private String strCourseName="";
    private String strWeatherName="";
    private String strRealName="";
    
    Context ctx;
    DataSource ds;
    Connection conn;
    PreparedStatement pstmt;
    ResultSet rs;
 
    // コンストラクタ
    public ScoreList() throws Exception{
        this.ctx = new InitialContext();
        this.ds = (DataSource)ctx.lookup("java:comp/env/jdbc/golf");
        this.conn = ds.getConnection();
    }
    
    public int getId() { 
        return this.intId; 
    }
    public int getUid() {
        return this.intUid;
    }
    public int getCid() {
        return this.intCid;
    }
    public int getOutScore() {
        return this.intOutScore;
    }
    public int getInScore() {
        return this.intInScore;
    }
    public int getScore() {
        return this.intOutScore + this.intInScore;
    }
    public String getAward1() {
        return this.strAward1;
    }
    public String getAward2() {
        return this.strAward2;
    }
    public String getAward3() {
        return this.strAward3;
    }
    public String getAward4() {
        return this.strAward4;
    }
    public int getWid() {
        return this.intWid;
    }
    public String getUserName() {
        return this.strUserName;
    }
    public String getCourseName() {
        return this.strCourseName;
    }
    public String getWeaterName() {
        return this.strWeatherName;
    }
    public String getRealName() {
        return this.strRealName;
    }
 
    public void loadScores(int intBegin, int intSize)
    throws Exception{
        String strSql = "SELECT *user.user_name,user.real_name,"
            +"course.course_name,weather.weather_name FROM score"
            +" LEFT JOIN user ON score.uid = user.id"
            +" LEFT JOIN course ON score.cid = course.cid"
            +" LEFT JOIN weather ON score.wid = weather.wid"
//			+" WHERE "
            +" ORDER BY score.id DESC LIMIT ?,?";
        this.pstmt = conn.prepareStatement(strSql);
        this.pstmt.setInt(1,intBegin);
        this.pstmt.setInt(2,intSize);
        this.rs = pstmt.executeQuery();
    }
 
    public boolean next()
    throws Exception{
        boolean blResult=false;
        if(this.rs.next()){
            this.intId = this.rs.getInt("id");
            this.intUid = this.rs.getInt("uid");
            this.strPdate = this.rs.getString("pdate");
            this.intCid = this.rs.getInt("cid");
            this.intOutScore = this.rs.getInt("outscore");
            this.intInScore = this.rs.getInt("inscore");
            this.intScore = this.rs.getInt("score");
            this.strAward1 = this.rs.getString("award1");
            this.strAward2 = this.rs.getString("award2");
            this.strAward3 = this.rs.getString("award3");
            this.strAward4 = this.rs.getString("award4");
            this.intWid = this.rs.getInt("wid");
            this.strAward4 = this.rs.getString("award4");
            this.strUserName = this.rs.getString("user.user_name");
            this.strCourseName = this.rs.getString("course.course_name");
            this.strWeatherName = this.rs.getString("weather.weather_name");
            this.strRealName = this.rs.getString("user.real_name");
            blResult=true;
        }
        return blResult;
    }
 
    public void close()
    throws Exception {
        if (this.pstmt!=null) {
            try {
                this.pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (this.conn!=null) {
            try {
                this.conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (this.ctx!=null) {
            try {
                this.ctx.close();
            } catch (NamingException e) {
                e.printStackTrace();
            }
        }
    }
}

CourseListクラス

ゴルフスコア編集画面用にコースマスタからデータをロードするためのクラス。

fileCourseList.java
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
/*
プログラム名:CourseList.java
作成者:
*/
package produst.golf;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
import java.util.Date;
import java.text.*;
 
public class CourseList{
    /** フィールド定義 */
    private int intCid=0;
    private String strCourseName="";
    
    Context ctx;
    DataSource ds;
    Connection conn;
    PreparedStatement pstmt;
    ResultSet rs;
 
    // コンストラクタ
    public CourseList() throws Exception{
        this.ctx = new InitialContext();
        this.ds = (DataSource)ctx.lookup("java:comp/env/jdbc/golf");
        this.conn = ds.getConnection();
    }
    
    public int getCid() { 
        return this.intCid; 
    }
    public String getCourseName() {
        return this.strCourseName;
    }
 
    public void loadCourses() throws Exception{
        String strSql = "SELECT * FROM course "
            +" ORDER BY cid ";
        this.pstmt = conn.prepareStatement(strSql);
        this.rs = pstmt.executeQuery();
    }
 
    public boolean next()
    throws Exception{
        boolean blResult=false;
        if(this.rs.next()){
            this.intCid = this.rs.getInt("cid");
            this.strCourseName = this.rs.getString("course_name");
            blResult=true;
        }
        return blResult;
    }
 
    public void close()
    throws Exception {
        if (this.pstmt!=null) {
            try {
                this.pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (this.conn!=null) {
            try {
                this.conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (this.ctx!=null) {
            try {
                this.ctx.close();
            } catch (NamingException e) {
                e.printStackTrace();
            }
        }
    }
}

WeatherListクラス

ゴルフスコア編集画面用に天候マスタからデータをロードするためのクラス。

fileWeatherList.java
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
/*
プログラム名:WeatherList.java
作成者:
*/
package produst.golf;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
import java.util.Date;
import java.text.*;
 
public class WeatherList{
    /** フィールド定義 */
    private int intWid=0;
    private String strWeatherName="";
    
    Context ctx;
    DataSource ds;
    Connection conn;
    PreparedStatement pstmt;
    ResultSet rs;
 
    // コンストラクタ
    public WeatherList() throws Exception{
        this.ctx = new InitialContext();
        this.ds = (DataSource)ctx.lookup("java:comp/env/jdbc/golf");
        this.conn = ds.getConnection();
    }
    
    public int getWid() { 
        return this.intWid; 
    }
    public String getWeatherName() {
        return this.strWeatherName;
    }
 
    public void loadWeathers() throws Exception{
        String strSql = "SELECT * FROM weather "
            +" ORDER BY wid ";
        this.pstmt = conn.prepareStatement(strSql);
        this.rs = pstmt.executeQuery();
    }
 
    public boolean next()
    throws Exception{
        boolean blResult=false;
        if(this.rs.next()){
            this.intWid = this.rs.getInt("wid");
            this.strWeatherName = this.rs.getString("weather_name");
            blResult=true;
        }
        return blResult;
    }
 
    public void close()
    throws Exception {
        if (this.pstmt!=null) {
            try {
                this.pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (this.conn!=null) {
            try {
                this.conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (this.ctx!=null) {
            try {
                this.ctx.close();
            } catch (NamingException e) {
                e.printStackTrace();
            }
        }
    }
}

ログイン画面

fileLoginForm.jsp
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
<%@ page contentType="text/html; charset=Windows-31J"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>ゴルフスコア管理ログイン画面</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="../style.css">
</HEAD><BODY>
<H1>ログイン</H1>
<FORM ACTION="LoginProcess.jsp" METHOD="post">
    <DIV CLASS="section">
        ユーザ名:    <INPUT TYPE="text" NAME="user_name" SIZE="20" MAXLENGTH="20">
    </DIV>
    <DIV CLASS="section">
        パスワード:<INPUT TYPE="password" NAME="password" SIZE="20" MAXLENGTH="20">
        <INPUT TYPE="checkbox" NAME="auto_login">次回から自動的にログインする
    </DIV>
    <DIV CLASS="section">
        <INPUT TYPE="submit" VALUE="ログイン">
    </DIV>
</FORM>
</BODY></HTML>
fileLoginProcess.jsp
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
<%@ page contentType="text/html; charset=Windows-31J"%>
<jsp:useBean class="produst.golf.User" id="user" scope="session"/>
<%
String strUserName=request.getParameter("user_name");
String strPassword=request.getParameter("password");
String strAutoLogin = request.getParameter("auto_login");
String strMessage=null;
 
try{
    boolean blResult = user.login(strUserName,strPassword);
    if(blResult){
        if(strAutoLogin!=null){
            Cookie coo1=new Cookie("uid",Integer.toString(user.getId()));
            coo1.setMaxAge(60*60*24*31);
            coo1.setPath("/GOLF");
            response.addCookie(coo1);
            Cookie coo2=new Cookie("auto_key",session.getId());
            coo2.setMaxAge(60*60*24*31);
            coo2.setPath("/GOLF");
            response.addCookie(coo2);
            user.setAutoKey(session.getId());
        }else{
            Cookie coo1=new Cookie("uid","");
            coo1.setMaxAge(0);
            coo1.setPath("/GOLF");
            response.addCookie(coo1);
            Cookie coo2=new Cookie("auto_key","");
            coo2.setMaxAge(0);
            coo2.setPath("/GOLF");
            response.addCookie(coo2);
        }
        if(user.getUrl()!=null && user.getUrl()!=""){
            response.sendRedirect(user.getUrl());
            return;
        }else{
            strMessage="ログインしました。";
        }
    }else{
        strMessage="ユーザ名またはパスワードが違います。"
        +"<A HREF=\"javascript:history.back()\">&nbsp;戻る&nbsp;</A>";
    }
}catch(Exception e){
    strMessage=e.getMessage();
}
 
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>ゴルフスコア管理</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="../style.css">
</HEAD><BODY>
<H1>ログイン</H1>
<DIV CLASS="section">
<%=strMessage%>
</DIV>
</FORM>
</BODY></HTML>
GOLFLoginForm.PNG

とりあえず画面までは作成したが、以下のエラーによりかなりハマってる・・・


org.apache.jasper.JasperException: /Login/LoginProcess.jsp(2,0) useBeanのクラス属性 produst.golf.User の値が無効です

	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

xmlファイルの設定かclassファイルのパスの問題?

[2008.1.28]

なんとなく解決。。。はじめにUserクラスのパッケージの階層を1階層(golf.User)に変更したらJSPのコンパイルがとおった。それからパッケージの階層を2階層(produst.golf.User)に再度変更してTomcatの再起動を行ったら今度は問題が解消された。Tomcatの再起動が必要な場合はweb.xmlの変更をした場合だけどいう認識だったが、どうもそうでないパターンがあるらしい。今回の件はブラウザの再起動なども行ったりしているので、最終的に何が原因だったか把握できず・・・useBeanアクションを含むJPSコードの変更を行った場合に再コンパイルされる条件を明確にする必要がある。課題として残しておく。

ログイン後画面

ログインが成功したらゴルフスコア管理のメニュー画面を表示する。(といってもかなりシンプル)メニュー画面には以下の(ボタン)機能を定義する。

  • 一般ユーザーの場合
  1. パスワードの変更
  2. ゴルフスコア一覧へ
  • 管理者の場合
  1. パスワードの変更
  2. ゴルフスコア一覧へ
  3. ユーザー管理へ

[LoginProcess.jspの変更]

ログインに成功した際に使用できるメニューを表示するために以下の内容をLoginProcess.jspに追加する。

strMessage+="<A HREF=\"../User/PasswordUserEdit.jsp\">"+"パスワードの変更</A>";
strMessage+="<A HREF=\"../Score/ScoreList.jsp\">"+"ゴルフスコア一覧へ</A>";
if (user.getPriv()==2) {
  strMessage+="<A HREF=\"../User/UserList.jsp\">"+"ユーザー管理へ</A>";
}

[style.css]
メニュー画面のリンクをボタンらしく見せるためにstyle.cssに以下のコードを追記する。

A{
	font-size:11pt;
	margin:2px;
	padding:2px;
	color:#000000;
	text-decoration:none;
	background-color:#CCCCCC;
	border-style:solid;
	border-width:2px;
	border-color:#DDDDDD #BBBBBB #BBBBBB #DDDDDD;
}

以下、ログイン後の画面イメージ。

上から一般ユーザーのログイン成功、管理者のログイン成功、ログイン失敗

LoginUserOK.PNG
LoginAdminOK.PNG
LoginNG.PNG

パスワード変更画面の実装

ユーザー自身によるパスワードの変更画面を実装する。現行のパスワードを入力し、新しいパスワードを確認も含めて2回入力する。WEBに限らず一般的なフォームだ。

PasswordUserEdit.PNG
filePasswordUserEdit.jsp
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
<%@ page contentType="text/html; charset=Windows-31J"%>
<jsp:useBean class="produst.golf.User" id="user" scope="session"/>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>ゴルフスコア管理</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="../style.css">
 
<SCRIPT TYPE="text/javascript"><!--
function funcCheck(){
    if(document.form1.new_password.value!=document.form1.new_password2.value){
        alert("確認用のパスワードが違います");
        return false;
    }
}
 
 
//--></SCRIPT>
</HEAD><BODY>
<H1>パスワードの変更</H1>
<FORM NAME="form1" ACTION="PasswordUserUpdate.jsp" METHOD="post" ONSUBMIT="return funcCheck()">
<DIV CLASS="section">
    現在のパスワード:
    <INPUT TYPE="password" NAME="old_password" SIZE="40" MAXLENGTH="20">
</DIV>
<DIV CLASS="section">
    新しいパスワード:
    <INPUT TYPE="password" NAME="new_password" SIZE="40" MAXLENGTH="20">
</DIV>
<DIV CLASS="section">
    新しいパスワード:
    <INPUT TYPE="password" NAME="new_password2" SIZE="40" MAXLENGTH="20">(確認用)
</DIV>
<DIV CLASS="section">
    <INPUT TYPE="submit" VALUE="登録">
    <INPUT TYPE="button" VALUE="戻る" ONCLICK="history.back()">
</DIV>
</FORM>
</BODY></HTML>
filePasswordUserUpdate.jsp
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
<%@ page contentType="text/html; charset=Windows-31J"%>
<jsp:useBean class="produst.golf.User" id="editUser" scope="session"/>
<jsp:useBean class="produst.golf.User" id="user" scope="session"/>
<%
String strOldPassword=request.getParameter("old_password");
String strNewPassword=request.getParameter("new_password");
String strMessage=null;
boolean blResult = user.changePassword(strOldPassword,strNewPassword);
if(blResult){
    strMessage="更新完了";
}else{
    strMessage="更新に失敗しました";
}
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>ゴルフスコア管理</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="../style.css">
</HEAD><BODY>
<H1>パスワードの変更</H1>
<DIV CLASS="section">
<%=strMessage%>
</DIV>
<DIV CLASS="section">
<A HREF="../Login/LoginProcess.jsp">メニューに戻る</A>
</DIV>
</BODY></HTML>

パスワードの変更が正常に行われたらPasswordUserUpdate.jspにより以下の画面が表示される。

PasswordUserUpdate.PNG

入力した新しいパスワードと確認用のパスワードが違う場合は、JavaScriptによりってダイアログボックスにエラーメッセージを出力する。

PasswordUserEditError.PNG

ログアウト画面

ログアウト機能を実装するのを忘れていたので追加する。ログインした後の画面にログアウトボタンを表示するために以下の1行をLoginProcess.jspの42行目あたりに追加する。

strMessage+="<A HREF=\"../Login/Logout.jsp\">"+"ログアウト</A>";

画面はこんな感じ

LoginProcess.PNG

JPSはこんな感じ

fileLogout.jsp
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
<%@ page contentType="text/html; charset=Windows-31J"%>
<jsp:useBean class="produst.golf.User" id="user" scope="session"/>
<%
//クッキーを削除
Cookie coo1=new Cookie("uid","");
coo1.setMaxAge(0);
coo1.setPath("/produst");
response.addCookie(coo1);
Cookie coo2=new Cookie("auto_key","");
coo2.setMaxAge(0);
coo2.setPath("/produst");
response.addCookie(coo2);
 
session.invalidate();
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<LINK REL="stylesheet" TYPE="text/css" HREF="../style.css">
<TITLE>ログアウト</TITLE></HEAD>
<H1>ログアウト</H1>
<DIV CLASS="section">
ログアウトしました。
<A HREF="../Login/LoginForm.jsp">&nbsp;ログイン画面へ&nbsp;</A>
</DIV>
</BODY></HTML>

ログアウトした後の画面はこんな感じ

Logout.PNG

ユーザー一覧画面

[2008.2.1]

悪戦苦闘中 (..;

[2008.2.5]

あれだけ苦労したけど、結局Windowsを再起動したら難なく動いた。JPSのHTMLについてはブラウザを立ち上げたままでも問題なく変更が反映されたが、Javaのコードをちょこっと修正してコンパイルをしなおすと、ブラウザを立ち上げなおしただけではエラーになるケースがある。この場合、JSPコードは何も変更していないのに・・・これは引き続き課題。

fileUserList.jsp
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
<%@ page contentType="text/html; charset=Windows-31J"%>
<jsp:useBean class="produst.golf.UserList" id="userList" scope="page"/>
<%
 
// userテーブルアクセス初期ロード
userList.loadUser();
 
%>
 
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>ゴルフスコア管理</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="../style.css">
</HEAD><BODY>
<H1>ゴルフスコア管理  ユーザ一覧</H1>
 
<%while(userList.readNext()){%>
<DIV CLASS="section">
    <A HREF="UserEdit.jsp?id=<%=userList.getId()%>">ユーザー編集</A>
    <%=userList.getId()%>
    /
    <%=userList.getRealName()%>
    (<%=userList.getPrivName()%>)
</DIV>
<%}
userList.close();
%>
 
<DIV CLASS="section">
    <A HREF="UserEdit.jsp">ユーザーの追加</A>
    <A HREF="../Score/ScoreList.jsp">ゴルフスコア一覧</A>
    <A HREF="../Login/Logout.jsp">ログアウト</A>
</DIV>
</BODY></HTML>

↓画面はこんな感じ

UserList.PNG

ユーザー編集画面

ユーザーデータの編集は管理者のみが実施できるという想定から、まず権限のチェックを実施する必要がある。ユーザーの追加やパスワードの初期化でも同様に管理者権限のチェックをするので、権限チェックのロジックを共通のIncludeファイルに定義して、それぞれのJSPにおいて取込んでチェックをおこなう。ここではAdminCheck.incというチェック用のロジックが実装されたファイルを定義し、各JSPの頭で、<%@ include file="AdminCheck.inc"%>によって実装する。

AdminCheck.incでは権限取得のためのメソッドをuserクラスから取得するため、AdminCheck.incを使用する場合は、JSPのuseBeanアクションによってid="user"を宣言する必要がある。

fileAdminCheck.inc
  0
  1
  2
  3
  4
  5
  6
<!-- 管理者権限チェック -->
<%
if(user.getPriv()!=2){
    response.sendRedirect("PrivError.jsp");
    return;
}
%>
fileUserEdit.jsp
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*,javax.sql.*,javax.naming.*"%>
<jsp:useBean class="produst.golf.User" id="editUser" scope="session"/>
<jsp:useBean class="produst.golf.User" id="user" scope="session"/>
<%@ include file="AdminCheck.inc"%>
<%
 
String strId = request.getParameter("id");
if(strId!=null){
    int intId=Integer.parseInt(strId);
    editUser.load(intId);
}else{
    editUser.clear();
}
 
%>
 
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>ゴルフスコア管理</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="../style.css">
</HEAD><BODY>
<H1>ユーザの編集</H1>
<FORM ACTION="UserUpdate.jsp" METHOD="post">
 
<DIV CLASS="section">
    id:<%=editUser.getId()%>
</DIV>
<DIV CLASS="section">
    ユーザー名 :<%=editUser.getUserName()%>
</DIV>
<DIV CLASS="section">
    氏名:<INPUT TYPE="text" NAME="real_name" SIZE="40" MAXLENGTH="20"
         VALUE="<%=editUser.getUserRealName()%>">
</DIV>
<DIV CLASS="section">
    権限:
    <SELECT NAME="priv">
        <%
        String[] aryPriv=produst.golf.User.aryPrivName;
        for(int i=0;i<aryPriv.length;i++){%>
            <OPTION VALUE="<%=i%>" 
            <%if(i==editUser.getPriv()){%>SELECTED<%}%>>
                <%=aryPriv[i]%>
            </OPTION>
        <%}%>
    </SELECT>
</DIV>
<%if(strId==null){%>
    <DIV CLASS="section">
        ユーザ名:<INPUT TYPE="text" NAME="user_name" SIZE="40" MAXLENGTH="20">
    </DIV>
    <DIV CLASS="section">
        パスワード:<INPUT TYPE="password" NAME="password" SIZE="40" MAXLENGTH="20">
    </DIV>
    <DIV CLASS="section">
        <INPUT TYPE="submit" VALUE="登録">
        <INPUT TYPE="button" VALUE="戻る" ONCLICK="history.back()">
    </DIV>
<%}else{%>
    <DIV CLASS="section">
        <INPUT TYPE="hidden" NAME="id" VALUE="<%=strId%>">
        <INPUT TYPE="submit" VALUE="更新">
        <INPUT TYPE="button" VALUE="パスワード変更"
         ONCLICK="location.href='PasswordAdminEdit.jsp'">
        <INPUT TYPE="button" VALUE="削除" ONCLICK="funcDelete()">
        <INPUT TYPE="button" VALUE="戻る" ONCLICK="history.back()">
    </DIV>
    <SCRIPT TYPE="text/javascript"><!--
    function funcDelete(){
        if(confirm('削除します。よろしいですか?')){
            location.href='UserUpdate.jsp?id=<%=strId%>&amp;delete';
        }
    }
    //--></SCRIPT>
<%}%>
</FORM>
</BODY></HTML>
fileUserUpdate.jsp
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
<%@ page contentType="text/html; charset=Windows-31J"%>
<jsp:useBean class="produst.golf.User" id="editUser" scope="session"/>
<jsp:useBean class="produst.golf.User" id="user" scope="session"/>
<%@ include file="AdminCheck.inc"%>
<%
 
request.setCharacterEncoding("Windows-31J");
String strDelete = request.getParameter("delete");
String strRealName=request.getParameter("real_name");
String strPriv = request.getParameter("priv");
int intPriv = 0;
if(strPriv!=null){
    intPriv = Integer.parseInt(strPriv);
}
String strUserName=request.getParameter("user_name");
String strPassword=request.getParameter("password");
String strMessage=null;
try{
    editUser.setRealName(strRealName);
    editUser.setPriv(intPriv);
    if(editUser.getId()==0){
        editUser.add(strUserName,strPassword);
        strMessage="登録完了";
    }else if(strDelete!=null){
        editUser.delete();
        strMessage="削除完了";
    }else{
        editUser.update();
        strMessage="更新完了";
    }
}catch(Exception e){
    strMessage=e.getMessage();
}
%>
 
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>ゴルフスコア管理</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="../style.css">
</HEAD><BODY>
<H1>ユーザ管理</H1>
<DIV CLASS="section">
<%=strMessage%>
</DIV>
<DIV CLASS="section">
<INPUT TYPE="button" VALUE="一覧に戻る" ONCLICK="location.href='UserList.jsp'">
</DIV>
</BODY></HTML>

↓ユーザー一覧で選択したユーザーの編集画面

UserEdit.PNG

↓更新後の画面

UserUpdate.PNG

↓管理者によるユーザーのパスワード変更(初期化)は、ユーザーがパスワードを忘れてしまった場合に初期化する目的で使用する。したがってユーザーが自身のパスワードを変更する場合と違って、現在のパスワードを条件にしていない。無条件で指定された新しいパスワードに更新する。

PasswordAdminEdit.PNG

ユーザーの追加

ユーザーの登録画面。JSPファイルはユーザー更新時と同じもの。

UserEdit2.PNG

エラー画面

権限チェックにおいてエラーと判定された場合の画面をつくる。とりえず通常の画面と差別化するために style.css ファイルに以下の定義を追加

H2{
	width:600px;
	margin:20px 10px 10px 10px;
	font-size:28pt;
 	padding:10px;
 	background-color:#FF00FF;
}
DIV.section2{ 
	width:600px;
	margin:10px;
	padding:10px;
	background-color:#FF0000;
}
filePrivError.jsp
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
<%@ page contentType="text/html; charset=Windows-31J"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
     
<HTML><HEAD>
<TITLE>ゴルフスコア管理</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="../style.css">
</HEAD><BODY>
<H2>権限エラー</H2>
<DIV CLASS="section2">
    <P>管理者権限のユーザーでないか、</P>
    <P>タイムアウトによりセッションが切断されています。</P>
    <P>管理者権限のアカウントで再ログインしてください。</P>
    <P><A HREF="../Login/LoginForm.jsp">ログイン</A></P>
</DIV>
</BODY></HTML>

↓かなり毒々しい。センスが悪すぎるので全体的にデザインを見直す必要があるが後回し。

PrivErr.PNG

ゴルフスコア一覧画面

ゴルフスコア一覧画面は、登録されているゴルフスコアのデータを一覧に表示する画面。登録されているデータを編集する場合は[編集]ボタンを、新たにスコアデータを登録したい場合は[スコアの登録]ボタンを押す。一覧画面はこれまでにないくらいセンスが悪いが、とりあえず一通りの機能(登録/編集/削除)を実装してから手を加えることにする。 (^^;

機能としては自分のデータ以外を編集できないようにしたり自動ログインの機能を順次実装していく必要がある。が、これも後回し。。。

fileScoreList.jsp
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 
 
 
 
 
-
|
-
|
!
 
 
-
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
-
-
|
-
|
!
!
-
|
!
 
 
 
 
 
 
 
 
-
|
!
-
|
!
-
|
-
|
!
 
-
|
!
 
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
!
 
 
 
<%@ page contentType="text/html; charset=Windows-31J"%>
<jsp:useBean class="produst.golf.User" id="user" scope="session"/>
<jsp:useBean class="produst.golf.ScoreList" id="scoreList" scope="page"/>
<%
String strRealName;
if(user.getId()==0){
    strRealName="ゲスト";
}else{
    strRealName=user.getUserRealName();
}
int intPage=0;
String strPage = request.getParameter("page");
if(strPage!=null){
    intPage=Integer.parseInt(strPage);
}
scoreList.loadScores(intPage*10,10);
 
%>
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>ゴルフスコア管理</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="../style.css">
 
<SCRIPT type="text/javascript"><!--
var scoreCount = 0;
function funcBack(){
    if(scoreCount==10){
        location.href="ScoreList.jsp?page=<%=intPage+1%>";
    }else{
        alert("これより前のページはありません");
    }
}
function funcForward(){
    location.href="ScoreList.jsp?page=<%=intPage-1%>";
}
//--></SCRIPT>
 
</HEAD><BODY>
<H1>ゴルフスコア一覧</H1>
<DIV CLASS="section">
<DIV CLASS="userName">ユーザ:<%=strRealName%>
<A HREF="../User/PasswordUserEdit.jsp">パスワード変更</A>
</DIV>
<%if(user.getPriv()>=3){%>
    <A HREF="../User/UserList.jsp">ユーザ管理</A>
<%}%>
<%if(user.getPriv()>=2){%>
    <A HREF="ScoreEdit.jsp">スコアの登録</A>
<%}%>
<%if(user.getId()==0){%>
    <A HREF="../Login/LoginForm.jsp">ログイン</A>
<%}else{%>
    <A HREF="../Login/Logout.jsp">ログアウト</A>
<%}%>
<A HREF="javascript:funcBack()">前のページ</A>
<%if(intPage>0){%>
    <A HREF="javascript:funcForward()">次のページ</A>
<%}%>
</DIV>
<%while(scoreList.next()){%>
 
<SCRIPT TYPE="text/javascript"><!--
scoreCount++;
//--></SCRIPT>
<DIV CLASS="section">
<%=scoreList.getId()%>
<%=scoreList.getPdate()%>
<%=scoreList.getUserName()%>
<%=scoreList.getRealName()%>
<%=scoreList.getCourseName()%>
<%=scoreList.getWeaterName()%>
<%=scoreList.getOutScore()%>
<%=scoreList.getInScore()%>
<%=scoreList.getScore()%>
<A HREF="ScoreEdit.jsp?id=<%=scoreList.getId()%>">編集</A>
</DIV>
<%}
scoreList.close();
%>
</BODY></HTML>

※あくまでも暫定画面

ScoreList.PNG

ゴルフスコア編集画面

デザインや使い勝手は後回しで登録更新削除機能を実装する。

fileScoreEdit.jsp
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 
 
 
 
 
 
-
|
|
|
-
|
!
 
 
 
 
 
 
 
 
 
 
-
|
-
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
-
|
|
|
|
|
|
|
-
-
|
!
!
|
!
 
<%@ page contentType="text/html; charset=Windows-31J"%>
<jsp:useBean class="produst.golf.Score" id="score" scope="session"/>
<jsp:useBean class="produst.golf.User" id="user" scope="session"/>
<%
String strId = request.getParameter("id");
String strBody="";
if(strId!=null){
    int intId=Integer.parseInt(strId);
    score.load(intId);
    user.load(score.getUid());
}else{
    score.clear();
}
 
%>
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>ゴルフスコア管理</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="../style2.css">
</HEAD><BODY>
<%if(strId==null){%>
<H1>ゴルフスコア登録</H1>
<%}else{%>
<H1>ゴルフスコア更新</H1>
<%}%>
<FORM ACTION="ScoreUpdate.jsp" METHOD="post">
 
<DIV CLASS="section">
<B>ユーザーID</B>
<INPUT TYPE="text" NAME="uid" VALUE="<%=score.getUid()%>">
</DIV>
 
<DIV CLASS="section">
<B>名前</B>
<INPUT TYPE="text" NAME="real_name" VALUE="<%=user.getUserRealName()%>">
</DIV>
 
<DIV CLASS="section">
<B>プレー日</B>
<INPUT TYPE="text" NAME="pdate" VALUE="<%=score.getPdate()%>">
</DIV>
 
<DIV CLASS="section">
<B>コース</B>
<INPUT TYPE="text" NAME="cid" VALUE="<%=score.getCid()%>">
</DIV>
 
<DIV CLASS="section">
<B>スコア(OUT)</B>
<INPUT TYPE="text" NAME="outscore" VALUE="<%=score.getOutScore()%>"><BR>
<B>スコア(IN)</B>
<INPUT TYPE="text" NAME="inscore" VALUE="<%=score.getInScore()%>"><BR>
<B>スコア</B>
<%=score.getScore()%>
</DIV>
 
<DIV CLASS="section">
<B>ニアピン賞(OUT)</B>
<INPUT TYPE="text" NAME="award1" size="1" maxlength="1" VALUE="<%=score.getAward1()%>"><BR>
<B>ニアピン賞(IN)</B>
<INPUT TYPE="text" NAME="award2" size="1" maxlength="1" VALUE="<%=score.getAward2()%>"><BR>
<B>ドラコン賞(OUT)</B>
<INPUT TYPE="text" NAME="award3" size="1" maxlength="1" VALUE="<%=score.getAward3()%>"><BR>
<B>ドラコン賞(IN)</B>
<INPUT TYPE="text" NAME="award4" size="1" maxlength="1" VALUE="<%=score.getAward4()%>"><BR>
</DIV>
 
<DIV CLASS="section">
<B>天候</B>
<INPUT TYPE="text" NAME="wid" size="1" maxlength="1" VALUE="<%=score.getWid()%>">
</DIV>
 
<%if(strId==null){%>
    <DIV CLASS="section">
        <INPUT TYPE="submit" VALUE="登録">
        <INPUT TYPE="button" VALUE="戻る" ONCLICK="history.back()">
    </DIV>
<%}else{%>
    <DIV CLASS="section">
        <INPUT TYPE="hidden" NAME="id" VALUE="<%=strId%>">
        <INPUT TYPE="submit" VALUE="更新">
        <INPUT TYPE="button" VALUE="削除" ONCLICK="funcDelete();">
        <INPUT TYPE="button" VALUE="戻る" ONCLICK="history.back()">
    </DIV>
    <SCRIPT TYPE="text/javascript"><!--
    function funcDelete(){
        if(confirm('削除します。よろしいですか?')){
            location.href='ScoreUpdate.jsp?id=<%=strId%>&delete';
        }
    }
    //--></SCRIPT>
<%}%>
</FORM></BODY></HTML>

ゴルフスコア更新画面

ScoreEdit1.PNG

ゴルフスコア登録画面

ScoreEdit2.PNG

ゴルフスコア更新画面

ゴルフスコア編集画面で入力した値を登録したり更新したり削除するJSP。

fileScoreUpdate.jsp
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
 
 
 
 
-
|
|
!
 
 
 
 
 
 
 
-
|
!
 
 
 
 
-
|
!
 
 
 
 
-
|
!
 
 
 
 
 
 
 
-
|
!
 
 
-
|
!
 
 
 
 
 
-
|
!
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
-
|
|
|
|
|
|
|
|
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
<%@ page contentType="text/html; charset=Windows-31J"%>
<jsp:useBean class="produst.golf.User" id="user" scope="session"/>
<jsp:useBean class="produst.golf.Score" id="score" scope="session"/>
<%
if(user.getId()==0){
    response.sendRedirect("../Error/SessionTimeout.jsp");
    return;
}
 
request.setCharacterEncoding("Windows-31J");
String strDelete = request.getParameter("delete");
 
// スコアIDセット
String strId = request.getParameter("id");
int intId=0;
if (strId!=null) {
    intId=Integer.parseInt(strId);
}
 
// ユーザーIDセット
String strUid = request.getParameter("uid");
int intUid=0;
if (strUid!=null) {
    intUid=Integer.parseInt(strUid);
}
 
// コースIDセット
String strCid = request.getParameter("cid");
int intCid=0;
if (strCid!=null) {
    intCid=Integer.parseInt(strCid);
}
 
// プレー日
String strPdate = request.getParameter("pdate");
 
// スコア
String strOutScore = request.getParameter("outscore");
int intOutScore=0;
if (strOutScore!=null) {
    intOutScore=Integer.parseInt(strOutScore);
}
String strInScore = request.getParameter("inscore");
int intInScore=0;
if (strInScore!=null) {
    intInScore=Integer.parseInt(strInScore);
}
int intScore = intOutScore + intInScore;
 
// 天候
String strWid = request.getParameter("wid");
int intWid=0;
if (strWid!=null) {
    intWid=Integer.parseInt(strWid);
}
 
// 賞
String strAward1 = request.getParameter("award1");
String strAward2 = request.getParameter("award2");
String strAward3 = request.getParameter("award3");
String strAward4 = request.getParameter("award4");
 
String strMessage=null;
if(score.getId()==0){
    score.add(intUid,
              strPdate,
              intCid,
              intOutScore,
              intInScore,
              intScore,
              strAward1,
              strAward2,
              strAward3,
              strAward4,
              intWid );
    strMessage="登録完了";
}else if(strDelete!=null){
    score.delete();
    strMessage="削除完了";
}else{
    score.setUid(intId);
    score.setUid(intUid);
    score.setCid(intCid);
    score.setPdate(strPdate);
    score.setOutScore(intOutScore);
    score.setInScore(intInScore);
    score.setScore(intScore);
    score.setWid(intWid);
    score.update();
    strMessage="更新完了";
}
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>ゴルフスコア管理</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="../style.css">
</HEAD><BODY>
<H1>ゴルフスコア更新</H1>
<DIV CLASS="section">
<%=strMessage%>
</DIV>
<DIV CLASS="section">
<A HREF="ScoreList.jsp">ゴルフスコア一覧に戻る</A>
</DIV>
</BODY></HTML>

更新完了画面

ScoreUpdate1.PNG

登録完了画面

ScoreUpdate2.PNG

削除の際には確認用のポップアップ画面を出力する。

ScoreEdit3.PNG

覚書

  • Scoreクラスにセッター →完了
  • コースマスタからデータをセットしてリストボックスにセット
  • 天候マスタデータと画面ラジオボタンとの連携
  • 日付について
  • オートログイン機能の実装
  • 一般ユーザー権限のデータを編集するとスコア登録ボタンがなくなる
  • 自分のデータのみ編集可能にする
  • デザイン
  • デザイン
  • デザイン

添付ファイル: fileWeatherList.java 556件 [詳細] fileCourseList.java 531件 [詳細] fileScoreUpdate2.PNG 385件 [詳細] fileScoreUpdate1.PNG 373件 [詳細] fileScoreEdit3.PNG 309件 [詳細] fileScoreEdit2.PNG 325件 [詳細] fileScoreEdit1.PNG 292件 [詳細] fileScoreUpdate.jsp 287件 [詳細] fileScoreEdit.jsp 336件 [詳細] fileScore.java 385件 [詳細] fileScoreList.jsp 317件 [詳細] fileScoreList.PNG 417件 [詳細] fileScoreList.java 302件 [詳細] filePrivError.jsp 347件 [詳細] filePrivErr.PNG 325件 [詳細] fileUserEdit2.PNG 298件 [詳細] filePasswordAdminEdit.PNG 308件 [詳細] fileUserUpdate.PNG 264件 [詳細] fileUserEdit.PNG 365件 [詳細] fileAdminCheck.inc 327件 [詳細] fileUserUpdate.jsp 274件 [詳細] fileUserEdit.jsp 330件 [詳細] fileUserList.PNG 297件 [詳細] fileUserList.jsp 300件 [詳細] fileLogout.jsp 345件 [詳細] fileLogout.PNG 388件 [詳細] fileLoginProcess.PNG 365件 [詳細] fileUserList.java 319件 [詳細] filePasswordUserEditError.PNG 316件 [詳細] filePasswordUserUpdate.PNG 311件 [詳細] filePasswordUserEdit.PNG 346件 [詳細] filePasswordUserUpdate.jsp 367件 [詳細] filePasswordUserEdit.jsp 393件 [詳細] fileLoginUserOK.PNG 292件 [詳細] fileLoginNG.PNG 266件 [詳細] fileLoginAdminOK.PNG 267件 [詳細] fileLoginProcess.jsp 353件 [詳細] fileGOLF.xml 530件 [詳細] fileLoginForm.jsp 431件 [詳細] fileGOLFLoginForm.PNG 269件 [詳細] fileUser.java 941件 [詳細] filegolf.sql 424件 [詳細] fileuser.sql 454件 [詳細] filescore.sql 408件 [詳細] fileweather.sql 363件 [詳細] filecourse.sql 416件 [詳細] filegolf.xml 163件 [詳細] fileweb.xml 548件 [詳細]

リロード   新規 編集 凍結 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2008-03-05 (水) 23:07:16 (4036d)