mb_language("uni"); mb_internal_encoding("utf-8"); mb_http_input("auto"); mb_http_output("utf-8"); ?>
前回は、住所録アプリケーションのアイテム情報入力画面と、アイテム情報確認画面の作成を紹介しました。作成したjspを通して、新規データをXprioriに登録する流れを理解していただけたのではないでしょうか。今回は、Xprioriに既に登録済みのアイテムを編集、または削除する流れを紹介します。また、入力値をチェックする機能についての詳細も紹介します。拡張する画面は前回に引き続き以下のとおりです。
● 情報入力画面
新規アイテムや登録済みアイテムの内容を編集する画面です。以下の機能を持っています。
1. アイテム情報入力(前回)
2. 編集の場合、アイテム詳細表示画面で選択した編集するアイテムの情報を表示する。(今回)
● 内容確認画面
アイテム情報の登録/削除確認を行う画面です。以下の機能を持っています。
1. 登録/編集の場合、入力画面で入力した内容を確認表示(前回)
2. 編集後の入力値のチェック(今回)
3. 入力チェック後のXprioriへのアイテムの登録/更新/削除(今回は更新と削除)
4. 削除の場合、アイテム詳細表示画面で選択した削除するアイテムの情報を表示(今回)
アイテム情報を入力する際、ユーザが誤って入力する可能性があるので、間違った入力値でXprioriに書き込まれないように、入力値が正しいものかどうかチェックする必要があります。アイテム情報の各項目でチェックする内容は以下のとおりです。
項目名 |
チェック内容 |
ID | 半角数字6桁で構成されているか |
名前 | 入力されているか |
郵便番号 | 入力されているか、半角数字で***-****の形式かどうか |
住所 | 入力されているか |
入力値チェックを行うためにCheckBeanクラスを作成します。
CheckBeanクラスはメンバ変数としてerrflg(エラーフラグ)とerrmsg(エラーメッセージ)を持っており、各関数で入力値がエラーと判断された場合、errflgが真になり、errmsgにエラー内容が追加されます。CheckBeanクラスの持つ関数は以下のとおりです。
関数名 |
概要 |
checkItemParam | アイテム情報のパラメータを一括チェックする |
checkId | アイテムIDが半角数字6桁かチェックする |
checkBlank | 引数で指定した値が空、またはnull文字でないかチェックする |
checkZip | 郵便番号が半角数字で***-****の形式かどうかチェックする |
getErrmsg | エラーメッセージを返す |
getErrflg | エラーフラグを返す |
checkItemParam関数に入力したデータを格納したParamBeanを渡し、関数の中でcheckId関数などの各パラメータをチェックする関数を呼び出し、正規表現を使ったパラメータのチェックを行います。関数の詳細はコードを参照してください。
確認画面で実行ボタンが押されたときに、Xpriori上のアイテムの編集または削除を実行する関数を、前回作成したUpdateAddressbookBeanクラスに追加します。
● アイテムを編集する(modifyItem)
アイテムの編集は、XPathで指定した既存のitem要素を編集したitem要素で置き換えることにより行います。item要素の編集の実行にはConnectXprioriBeanクラスのmodify関数を利用します。modify関数はAPIのmodifyXML関数をラップした関数であり、引数に置き換える要素の位置を指定するXPathと、置き換えるXMLを渡します。
public String modify(String xpath, String xml) { String ret = ""; try {// modifyXMLをラップする ret = neosession.modifyXML(xpath, xml); } catch (Exception e) { System.out.println("エラーが発生しました: " + e); } return ret; } |
modify関数に渡すitem要素の位置を指定するXPathは、
/ND/address_book/item[@id = {置き換えるitem要素のID}] |
です。
UpdateAddressbookBeanクラスに追加したmodifyItem関数では、引数として渡された編集対象のItemBeanクラスを利用して、上記のXPathを作成し、置き換えるitem要素のXMLをgetItemXML関数により取得します。そしてmodify関数を呼び出すことで編集を実行します。
public String modifyItem(ItemBean item) { // ItemBeanのidと同じID属性値を持つitem要素を取得するXPath String modifyXPath = "/ND/address_book/item[@id = \"" + item.getID() + "\"]"; // itemから編集用XMLを作り、XPathで指定した既存のアイテムXMLと置き換える String ret = xcon.modify(modifyXPath, item.getItemXML()); return ret; } |
● アイテムを削除する(deleteItem)
アイテムの削除は、Xprioriに対して削除するitem要素をXPathを指定して実行します。item要素の削除の実行にはConnectXprioriBeanクラスのdelete関数を利用します。delete関数はAPIのdeleteXML関数をラップした関数であり、引数に削除する要素の位置を指定するためのXPathを渡します。
public String delete(String xpath) { String ret = ""; try {// deleteXMLをラップする ret = neosession.deleteXML(xpath); } catch (Exception e) { System.out.println("エラーが発生しました: " + e); } return ret; } |
delete関数に渡す、削除するitem要素を指定するXPathは
/ND/address_book/item[@id = {削除するitem要素のID}] |
です。
UpdateAddressbookBeanクラスに追加したdeleteItem関数では、引数として渡された削除対象のItemBeanクラスを利用して、上記のXPathを作成し、delete関数を呼び出すことで削除を実行します。
public String deleteItem(ItemBean item) { // ItemBeanのidと同じID属性値を持つitem要素を取得するXPath String deleteXPath = "/ND/address_book/item[@id = \"" + item.getID() + "\"]"; // XPathで指定した既存のアイテムXMLを削除する String ret = xcon.delete(deleteXPath); return ret; } |
では、これらのクラスを利用して、編集/削除機能を追加します。処理の流れは以下のとおりです。
● 編集
アイテム詳細画面(itemdetail.jsp)→入力画面(inputitem.jsp)→確認画面(confirmitem.jsp)→編集を実行し一覧画面に戻る(runitem.jsp)
● 削除
アイテム詳細画面(itemdetail.jsp)→確認画面(confirmitem.jsp)→削除を実行し一覧画面に戻る(runitem.jsp)
なお、入力値のチェックについては、編集の場合に、確認画面(confirmitem.jsp)と実行画面(runitem.jsp)で行い、エラーがあった場合は入力画面に戻ります。実行画面(runitem.jsp)での入力値チェックは故意にパラメータが書き換えられた場合を想定しています。
各画面を紹介しますが、今回は既存画面の拡張ですので部分的にコードを抜粋して紹介します。
● アイテム詳細画面(inputdetail.jsp)
アイテム詳細画面には詳細表示しているアイテムの編集/削除をするためのアンカーを設定します。それぞれパラメータにアイテムIDと編集モードを渡しています。追加したコードは以下になります。
<a href="inputitem.jsp?id=<%= item.getID() %>&mode=<%= param.MOD_MODE %>">編集</a> <a href="confirmitem.jsp?id=<%= item.getID() %>&mode=<%= param.DEL_MODE %>">削除</a> |
実行結果は以下のようになります。
▲アイテム編集/削除への遷移(アイテム情報確認画面)
● 情報入力画面(inputitem.jsp)
アイテムを編集する場合、編集するアイテムの詳細表示画面から入力画面に遷移します。このとき入力フォームには編集するアイテムの情報があらかじめ入力されている必要があるため、詳細画面からアイテムIDをパラメータとして受け取り、そのIDによって編集するアイテムの情報をXprioriから取得します。
else if(param.getMode() == param.MOD_MODE){ // 既存編集の場合はパラメータidからアイテムを取得する ItemBean item = searchxpri.getItemById(param.getId()); input_item = item; } |
その後、取得したアイテム情報を入力フォームに埋めていきます。
アイテム情報が埋められ、一部を編集した状態です。
▲アイテム編集画面
● 内容確認画面(confirmitem.jsp)
アイテムの編集/削除を実行する前にユーザが最終確認を行うため、編集/削除するアイテム情報を表示します。編集の場合は入力画面から渡されたパラメータのチェックを行い、エラーがなければSearchAddressbookBeanクラスのgetItemByParam関数を利用してパラメータからアイテムを作成します。エラーの場合はエラーメッセージを渡して入力画面に戻るようにします。削除の場合は、詳細画面からアイテムIDをパラメータとして受け取り、そのIDによって削除するアイテムの情報をXprioriから取得します。
//(1) パラメータmodeをみて新規追加、既存編集か既存削除かを決める if(param.getMode() == param.INS_MODE || param.getMode() == param.MOD_MODE ){ // 新規追加、既存編集の場合 //(2-1)入力内容をチェックし、入力エラーの場合は入力画面に戻る check.checkItemParam(param); if(check.getErrflg()){//エラーがある場合は入力画面に戻る %> <jsp:forward page="inputitem.jsp"> <jsp:param name="errmsg" value="<%= check.getErrmsg() %>" /> <jsp:param name="id" value="<%= param.getId() %>" /> <jsp:param name="name" value="<%= param.getName() %>" /> <jsp:param name="zip" value="<%= param.getZip() %>" /> <jsp:param name="address" value="<%= param.getAddress() %>" /> <jsp:param name="mode" value="<%= param.getMode() %>" /> </jsp:forward> <% } //(3)チェックに問題なければパラメータからアイテムを作成する ItemBean item = searchxpri.getItemByParam(param); confirm_item = item; } else if(param.getMode() == param.DEL_MODE){ // 既存削除の場合 //(2-2)パラメータからアイテムを作成する ItemBean item = searchxpri.getItemById(param.getId()); confirm_item = item; msg = "以下の内容のアイテムを削除しますか?"; // 確認メッセージ } |
その後、取得したアイテムの情報を表示します。削除の場合は以下のようになります。
▲アイテム削除確認画面
● アイテム登録実行(runitem.jsp)
確認画面で実行ボタンが押された後、実行画面に遷移します。実行画面では、編集の場合、実行前にまずパラメータのチェックを行います。フォームで入力された値のチェックではなく、故意にパラメータが書き換えられた場合の対応です。エラーがなければ編集を実行しますが、エラーがあれば入力画面に戻ります。削除の場合は実行に必要なパラメータはIDだけですので、パラメータのチェックは行いません。
//(1)入力内容をチェックし、入力エラーの場合は入力画面/一覧画面に戻る check.checkItemParam(param); if(param.getMode() == param.INS_MODE || param.getMode() == param.MOD_MODE){ if(check.getErrflg()){//エラーがある場合は入力画面に戻る %> <jsp:forward page="inputitem.jsp"> <jsp:param name="errmsg" value="<%= check.getErrmsg() %>" /> <jsp:param name="id" value="<%= param.getId() %>" /> <jsp:param name="name" value="<%= param.getName() %>" /> <jsp:param name="zip" value="<%= param.getZip() %>" /> <jsp:param name="address" value="<%= param.getAddress() %>" /> <jsp:param name="mode" value="<%= param.getMode() %>" /> </jsp:forward> <% } } |
エラーがない場合は、次の処理に進み、パラメータidによってXprioriからアイテム情報を取得します。そして、パラメータmodeを見て、追加(INS_MODE)、編集(MOD_MODE)、削除(DEL_MODE)のどれを実行するかを判断します。編集/削除の場合は、先ほど取得したアイテムが空でないことをチェックすることで、編集/削除するアイテムがあることを確かめます。編集の場合はUpdateAddressbookBeanクラスのmodifyItem関数を利用して、削除の場合は同クラスのdeleteItem関数を利用して編集/削除を実行します。
//(2)パラメータidからアイテムを取得する ItemBean item = searchxpri.getItemById(param.getId()); // パラメータmodeをみて新規追加か既存編集か既存削除かを決める if(param.getMode() == param.INS_MODE ){ // 新規追加の場合 // 同一IDを持つアイテムが登録されていないかチェックする if(item.getID().equals("")){//まだ登録されていない // パラメータからアイテムを作成する ItemBean insert_item = searchxpri.getItemByParam(param); // アイテムをXprioriに登録する updatexpri.insertItem(insert_item); } } else if(param.getMode() == param.MOD_MODE){// 既存編集の場合 //(3)同一IDを持つアイテムが登録されていることをチェックする if(!item.getID().equals("")){// 登録済み //(4)パラメータからアイテムを作成する ItemBean modify_item = searchxpri.getItemByParam(param); //(5)アイテムをXprioriに登録する updatexpri.modifyItem(modify_item); } } else if(param.getMode() == param.DEL_MODE){ // 既存削除の場合 //(3)同一IDを持つアイテムが登録されていることをチェックする if(!item.getID().equals("")){// 登録済み //(4)パラメータからアイテムを作成する ItemBean delete_item = searchxpri.getItemByParam(param); //(5)アイテムをXprioriから削除する updatexpri.deleteItem(delete_item); } } |
編集/削除実行後は追加の時と同様に、編集/削除したアイテムの名前を検索キーワードのパラメータswordに渡し、アイテム一覧画面に遷移します。このようにして、編集、削除機能を追加することができました。
編集実行後の詳細画面は以下のようになります。
▲編集後のアイテム詳細画面
また、削除実行前と実行後のアイテム一覧画面は以下のようになります。IDが00002のアイテムが削除されていることがわかります。
▲削除前の一覧画面
▲削除後の一覧画面
XML DBでは編集/削除の場合も、挿入の場合と同じようにクエリ送信ではなく、modifyXML/deleteXMLというAPIの関数を利用します。編集/削除するアイテムを指定するためにXPathを使用しますが、XPathはそれ自体がSQLのUPDATE文やDELETE文のような、編集/削除命令を意味するわけではありません。データの追加/編集/削除の方法はRDBとは異なるXML DBの特徴的な部分と言えるでしょう。
今回までで表示/検索/登録/編集/削除という住所録としての基本的な機能の実装は完了しました。次回からはWebアプリケーションとして必要な幾つかの機能をXprioriを利用する場合はどのように実装するかを紹介します。
今回作成したjavaクラス・jspファイルはこちらからダウンロードすることができます。
・ jspファイルはWebアプリケーションフォルダのaddress_book/WebContentに配置してください。
・ javaファイルはWebアプリケーションフォルダのaddress_book/WebContent/WEB-INF/srcに配置してください。
また、ご自分でクラスを新規作成する場合はEclipseのメニューバーより、[ファイル]→[新規]→[クラス]を選択し、[次へ]を押してください。
次の画面で[ソースフォルダ]に「address_book/src」、[パッケージ]に「addressbook」を入力し、[名前]に適切なクラス名を入力し、[終了]を押すことで、新規のクラスを作成することができます。
▲このページのTOPへ