投稿

12月15日(火)1、2コマ目

今日、やったこと 課題「かんたんオークションサイト(Java版)」 課題「かんたんオークションサイト(Java版)」 解答例をあげときます。 [DAO]ItemDAOクラス 商品マスタテーブルアクセス用クラス。 [DAO]UserDAOクラス ユーザーマスタテーブルアクセス用クラス。 [DAO]BidDAOクラス (主に)入札データテーブルアクセス用クラス。 [BLL]Serviceクラス 機能提供クラス。 [Exception]PriceExceptionクラス 応札金額が応札最高値以下のときにスローする検査例外クラス。 [Exception]OverDueExceptionクラス 応札期限を超過したときにスローする検査例外クラス。 [Exception]NotFilledExceptionクラス 未入力の項目があるときにスローする検査例外クラス。 [Presentation]IndexSrvクラス サーブレット。ログインページ表示、認証実行、商品一覧ページ表示を行う。 [Presentation]SelectItemSrvクラス サーブレット。商品一覧ページにて商品選択時の処理を行う。 [Presentation]BidSrvクラス サーブレット。入札ページの処理を行う。 [Presentation]index.jsp ログインページ。 [Presentation]selectitem.jsp 商品一覧ページ。 [Presentation]bid.jsp 入札ページ。

12月7日(月)1、2コマ目

イメージ
今日、やったこと 新課題「かんたんオークションサイト構築(Java版)」 今日のホワイトボード <A>タグについて 2ページ目の商品一覧画面にて、商品名のリンクをクリックすると、商品を選択できます。 リンクは作るにはHTMLの<A>タグを使います。<A>タグには クリック後移動するURLを指定するhref属性 があります。 図 <A>タグ なお、リンククリックはHTTPの GETコマンド でリンク先をリクエストします。 前回の課題について 課題「かんたんオークションサイト(C#版)」を採点して気が付いた点を。 UserDAOクラスのGetCount()メソッド ダメ1 全件検索実行後、検索結果のユーザー名、パスワードを1件づつチェック まず、以下のSQLを実行。  SELECT * FROM ユーザーマスタ つぎに、検索結果のユーザー名、パスワードをチェック。 ユーザー名、パスワードが引数と一致するならカウントアップ。 while(reader.Next) {  if(reader["ユーザー名"].Equals(引数のユーザー名) &&    reader["パスワード"].Equals(引数のパスワード)) {   count++;  } } ダメ2 検索実行、検索結果をカウントアップ まず、以下のSQLを実行。  SELECT * FROM ユーザーマスタ   WHERE ユーザー名=引数のユーザー名 AND パスワード=引数のパスワード つぎに検索結果の行数をカウントアップ。 while(rs.Next) {  count++; } ダメ3 検索実行、検索結果をListに格納してListの要素数を返す まず、以下のSQLを実行。  SELECT * FROM ユーザーマスタ   WHERE ユーザー名=引数のユーザー名 AND パスワード=引数のパスワード つぎに検索結果をListに格納。 while(rs.Next) {  list.Add(new User(・・)); } Listの要素数を返す。 return list.Count; おすすめ グループ関数count()を使う 実行するSQLはこれ。  SELECT count(*) FROM ユー...

12月1日(火)1、2コマ目

イメージ
今日、やったこと Javaでの例外処理 今日のホワイトボード (あまり本題とは関係ないですが)Sessionオブジェクト取得 複数リクエスト間でデータを共有できるSessionオブジェクトを取得するには、getSession()メソッドを使います。このメソッドは引数が3パターンあり、動作が異なるため注意が必要です。 図 Sessionオブジェクトの取得メソッド とくに、セッションがスタートしていない(クライアントに紐づいていないSessionオブジェクトがない)ときに注意です。 (前回のつづき)ユーザー登録 これ以上正常系の処理を続けられないときに例外をスローします。(正常系の流れを止める) スローされた例外はエラー処理ができるところでキャッチしてエラー処理を行います。 図 正常系から抜け出すために例外スロー [演習]ユーザー登録 .Netでも同じようなモノを作りました。 スローする例外は例外クラスからエラーがわかるようにするべきです。 まちがってもExceptionクラスをスローするのはやめてください。 図 エラー内容ごとに例外クラスをスローすべき ソースコードを載せときます。 [DAOクラス]UserDAO.java ユーザーマスタテーブルアクセス用クラス。 [例外クラス]DupplicateIDException.java 指定されたIDがすでに利用中のときにスローする検査例外クラス。 [例外クラス]InvitedByMyselfException.java 新規登録者本人を紹介者と指定したときにスローする検査例外クラス。 [例外クラス]NoInviterException.java 指定された紹介者がいないときにスローする検査例外クラス。 [例外クラス]NotFilledException.java 未入力の項目があるときにスローする検査例外クラス。 [presentationレイアクラス]IndexSrv.java サーブレットクラス。

11月30日(月)1、2コマ目

イメージ
今日、やったこと C#版「オークションサイト」構築 Javaの例外 今日の課題(C#版「オークションサイト」) ソースを載せておきます。 [データアクセスレイア]UserDAOクラス ユーザーマスタテーブルアクセス用クラス。 あくまでもデータベースアクセスクラス。認証メソッドはここには作らない。 このクラスが返す値を使って、ビジネスロジック層で認証を行う。 逆の言い方をすれば、ビジネスロジック層で認証を行うためにこのクラスの機能を使う。 [データアクセスレイア]ItemDAOクラス 商品マスタテーブルアクセス用クラス。 [データアクセスレイア]BidDAOクラス 入札データテーブルアクセス用クラス。 [ビジネスロジックレイア]Serviceクラス このクラスでシステムに必要な機能を提供する。 [プレゼンテーションレイア]Index.cshtml.cs 1ページ目。Index.cshtmlはなんてことはないので省略。 [プレゼンテーションレイア]ItemList.cshtml.cs 2ページ目。おなじく、ItemList.cshtmlは省略。 [プレゼンテーションレイア]Bid.cshtml.cs 3ページ目。Bid.cshtmlは省略。 今日のホワイトボード Javaの例外クラス .Netと異なり、例外処理(キャッチするまたはthrowsで例外スローを宣言してスロー)をコンパイル時にチェックする検査例外と.Netと同じ実行時例外の2種類の例外がJavaにはあります。 図 Javaの例外クラス せっかく2種類の例外クラスがあるので、異常時の通知方法で使い分けをします。 図 検査例外と実行時例外の使い分け サンプルアプリケーション「ユーザー登録」 以前、.Netでの作成したユーザー登録です。入力されたIDがすでに登録済みならエラー「異なるIDを入力し...

11月16日(月)1、2コマ目

イメージ
今日、やったこと 新課題「C#版簡単オークションサイト」の説明 今日のホワイトボード 処理結果を伝える 以前から話している内容そのままです。とくに真新しい内容はありません。 図 処理結果を伝える [データベース]列の初期値 INSERT INTO実行時に挿入値が未指定の場合にデフォルト値が登録されるようにするには、図のようにdefaultを使って初期値を指定します。 図 応札日時列の初期値は現在日時(systimestampで取得できる) なお、列制約構文での制約、さらに初期値を指定する場合は下図の順になります。 create table テーブル名(  列名 データ型  default 初期値  制約 ) 入札処理 入札前の最高値取得は1人だけしかできないようにしなければならない。 入札最高値より高い金額しか入札できません。 まず、入札最高値をチェックする必要がありますが、下図のようにAさん、Bさんがほぼ同じタイミングでチェック(ロックしなければできる)し、先にBさんがDBに書き込むとAさんはエラーにする必要がありますが、Aさんのチェック時では最高値以上であるため、エラーにできません。 そこで、まず入札データテーブルの対象商品のデータをすべてロックし、ロックできた人がだけその後の処理(最高値取得、チェック、データ書き込み)ができるようにしてください。 図 最高値は1人だけしか取得できないようにするために NotFilledExceptionについて シーケンス図に書いてありましたが、ちゃんと説明をしていなかったので。 未入力項目がある場合は、NotFilledExceptionをスローするとかいてあります。 〇NotFilledExceptionクラスをつくる まず、NotFilledExceptionクラスですが、自作例外クラスです。Exceptionを継承してください。 図 自作例外クラスNotFilledExceptionをつくる 〇空白チェックのながれ tryブロック内は正常系をメインに実装し、catchブロックでエラー内容に応じた処理を書くのがtry~catchの一般的な実装です。 図 空白チェックのながれ ページ遷移 ログインページのOnPost()は以下のようになります。 ポイントは OnPost()の戻り値はIActionResult 遷移...

11月9日(月)1、2コマ目

イメージ
今日、やったこと [.Net版]異常系処理演習(ユーザー登録) 今日のホワイトボード トランザクションとコミット、ロールバックについて 前回のJava版在庫引当でトランザクション処理に理解が甘いかたがおられましたので、フォローしておきます。 図 トランザクションとコミット、ロールバック トランザクションはコミット、ロールバックで終わる コミットすれば、更新処理はすべて確定。 ロールバックすれば、直近のコミットした時点のデータに戻る。 ということは、コミット後の更新処理はすべてキャンセルされる。 〇コミットすれば更新は確定 在庫引当の課題では、一度に複数商品の在庫引当ができるようになってました。 仕様では すべての在庫引当成功 => 在庫引当処理成功 => コミット 1件でも在庫引当失敗 => 在庫引当処理失敗 => ロールバック です。 これを1件更新するたびにコミットまたはロールバックするように実装されていた方がおられました。仕様と異なる動きをしてしまいます。 〇ロールバックすれば直近のコミットしたときのデータにデータベースが戻してくれる 自力でデータ復旧処理を実装されていた方がおられましたが、ロールバック一発でOKです。 今日の課題 C#で、ユーザー登録を行うアプリケーション作成です。 一見さんお断りシステムを採用していますので、すでに登録済みユーザーが紹介者になってもらう必要があります。 一応、ソースコードを公開しておきます。 〇Userクラス ユーザーデータの受け渡しに使うクラス。 〇RegistUserResultEnum(列挙型) ユーザー登録処理の結果を伝えるための列挙型。 〇UserDAOクラス ユーザーマスタテーブルアクセスのためのクラス。 〇Serviceクラス 機能提供クラス。 〇Index.cshtml Razorページ。 〇Index.cshtml.cs Index.cshtmlの...

11月2日(月)1、2コマ目

イメージ
今日、やったこと .Net版異常時の対応 今日のホワイトボード 処理は2種類の終わり方がある 処理が正常に実行された「正常終了」となにがしかの問題が発生した「異常終了」。 異常終了も図のように2パターンに分類できる。 図 正常終了と異常終了 この2パターンの異常終了を通知する方法を.Netでは以下のようにすることにする。 ユーザーに通知して、 リカバリしてほしい エラー 戻り値で通知 ユーザーに通知しても、 リカバリが期待できない エラー 例外で通知 tryブロックについて 基本的に例外はスローしっぱなし。スローされた例外は上位へ伝播させる。 ただし、例外時に実行すべき処理がある場合のみ、例外をキャッチしていい。 これを今後の基本ルールにします。 図 tryブロックについて 今日のサンプルソース Userクラス ユーザー情報受け渡し用クラス。 UserInsertResultEnum 列挙型。ユーザー登録結果を通知するために用意。 UserDAOクラス 全件検索(SelectAll())、登録(Insert())メソッドのみ。 Serviceクラス ビジネスロジックレイアのクラス。今回はなくてもよかったけど。 Index.cshtml Index.cshtml.cs