この章では、サンプル・アプリケーションの変更方法およびOracle Database内のデータをユーザーが編集、更新および削除できるようにする機能の追加方法について説明します。この章は次の項で構成されています。
簡単に言うと、Beanは、プロパティ、イベントおよびメソッドを持つJavaクラスです。Beanは、プロパティごとにアクセッサ(get
およびset
メソッド)も持っています。特定の基本ルールに従っているオブジェクトは、すべてBeanといえます。Beanを作成するために拡張する必要がある特別なクラスはありません。
この章のサンプル・アプリケーションの作成手順では、単一の従業員レコードを保持するためにJavaBeanを使用します。既存レコードを編集したり、新規レコードを追加するときに、表の単一行の変更された値または新しい値を保持するコンテナとしてJavaBeanが使用され、これによりデータベースの更新に使用する行が準備されます。
Beanは従業員レコードのフィールドごとにプロパティを持ち、JDeveloperはこれらのプロパティごとにアクセッサ(get
およびset
メソッド)を作成します。次の項では、サンプル・アプリケーションのJavaBeanの作成方法について説明します。
Employee.java
はサンプル・アプリケーションで使用するJavaBeanで、単一の従業員レコードを保持してその内容を変更します。JavaBeanを作成するには、次の手順を実行します。
Viewプロジェクトを右クリックして、ショートカット・メニューから「新規」を選択します。
「新規ギャラリ」で、「すべてのテクノロジ」タブを選択します。
「一般」カテゴリを開いて、「一般」カテゴリの「JavaBeans」を選択します。「項目」リストから、「Bean」を選択します。「OK」をクリックします。
「Beanの作成」ダイアログ・ボックスで、名前にEmployee
を、パッケージにhr
を入力し、「拡張」フィールドがjava.lang.Object
に設定されていることを確認します。「OK」をクリックして、Beanを作成します。
ファイルを保存します。これで、Employee.java
ファイルに次のコードが含まれます。
package hr; public class Employee { public Employee(){ } }
JavaBeanでは、Employees
表の列ごとにフィールドを1つ作成し、フィールドごとにアクセッサ・メソッド(get
メソッドおよびset
メソッド)を作成する必要があります。
java.sql.Date
(いずれかのフィールドのフィールド型)のimport文を追加します。
import java.sql.Date;
Employees
表の列ごとに、Employee
クラスにフィールドを追加します。各フィールドはprivate
で、フィールド型は次のとおりです。
private Integer employeeId; private String firstName; private String lastName; private String email; private String phoneNumber; private Date hireDate; private String jobId; private Double salary; private Double commissionPct; private Integer departmentId;
ソース・エディタのページで右クリックし、ショートカット・メニューで「アクセッサの生成」を選択します。「アクセッサの生成」ダイアログ・ボックスで、トップレベルのEmployeeノードを選択します。Employeeノードとそのすべてのフィールドに、チェック・マークが表示されます。「OK」をクリックします。図5-1に、すべてのフィールドが選択されている「アクセッサの生成」ダイアログ・ボックスを示します。
ファイルを保存します。これで、Employee.java
ファイルに次のコードが含まれます。
例5-1 基本的なJava Beanとアクセッサ・メソッドのスケルトン・コード
package hr; import java.sql.Date; public class Employee { public Employee() { } private Integer employeeId; private String firstName; private String lastName; private String email; private String phoneNumber; private Date hireDate; private String jobId; private Double salary; private Double commissionPct; private Integer departmentId; public void setEmployeeId(Integer employeeId) { this.employeeId = employeeId; } public Integer getEmployeeId() { return employeeId; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getFirstName() { return firstName; } ... ... ... ... // This list has been shortened and is not comprehensive. The actual code contains // accessor methods for all the fields declared in the bean. public void setDepartmentId(Integer departmentId) { this.departmentId = departmentId; } public Integer getDepartmentId() { return departmentId; } }
Javaアプリケーションからデータベースの表に含まれる行を更新するには、次のタスクを実行する必要があります。
特定の従業員行を検索するメソッドを作成します。このメソッドを使用して、特定の従業員の値を編集ページに表示します。
Beanから更新済の従業員データを取り出してデータベースを更新するメソッドを作成します。
アプリケーションのメイン・ページにある従業員データの各行に、その従業員データの編集を可能にするリンクを含めます。このリンクを使用すると、edit.jsp
ファイルが開き、その従業員のデータが編集可能な状態で表示されます。
edit.jsp
という名前のJSPページを作成します。このページには、単一の従業員の全データを表示するフォームと表が含まれ、ユーザーはこのページを使用して値を変更できます。
edit.jsp
ページのフォームを処理し、更新された値をEmployee.java
Beanに書き込んで、updateEmployee
メソッドをコールするJSPページを作成します。
これらの方法については、次の項を参照してください。
次の手順で作成するメソッドは、特定の従業員レコードの検索に使用します。このメソッドは、特定の従業員レコードを編集または削除する場合や、Employee.java
ページでその従業員のリンクを選択した場合に使用されます。
DataHandler
クラスがJavaソース・エディタでまだ開いていない場合は、アプリケーション・ナビゲータでこのクラスをダブルクリックして開きます。
DataHandler
クラスで、更新する従業員レコードを識別するための新規メソッドを宣言します。
public Employee findEmployeeById(int id) throws SQLException { }
このメソッドのボディで、selectedEmp
という名前の、Employee
Beanの新規インスタンスを作成します。
Employee selectedEmp = new Employee();
データベースに接続します。
getDBConnection();
Statement
オブジェクトを作成し、ResultSet
型を定義して問合せを作成します。デバッグに役立てるために、トレース・メッセージを追加します。
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); query = "SELECT * FROM Employees WHERE employee_id = " + id; System.out.println("\nExecuting: " + query);
問合せを実行し、ResultSetオブジェクトを使用して結果を格納します。
rset = stmt.executeQuery(query);
rset
で返された結果セットを使用し、従業員Beanのset
メソッドを使用してBeanのフィールドに移入します。
while (rset.next()) { selectedEmp.setEmployeeId(new Integer(rset.getInt("employee_id"))); selectedEmp.setFirstName(rset.getString("first_name")); selectedEmp.setLastName(rset.getString("last_name")); selectedEmp.setEmail(rset.getString("email")); selectedEmp.setPhoneNumber(rset.getString("phone_number")); selectedEmp.setHireDate(rset.getDate("hire_date")); selectedEmp.setSalary(new Double(rset.getDouble("salary"))); selectedEmp.setJobId(rset.getString("job_id")); }
移入されたオブジェクトを返します。
return selectedEmp;
次の手順では、データベース内の従業員データを更新するメソッドの作成方法について説明します。
DataHandler
クラスを開きます。
次のように、updateEmployee
メソッドを宣言します。
public String updateEmployee(int employee_id, String first_name, String last_name, String email, String phone_number, String salary, String job_id) throws SQLException { }
このメソッドのボディで、選択した従業員の詳細を格納する、Employee
Beanのインスタンスを作成します。
Employee oldEmployee = findEmployeeById(employee_id);
データベースに接続します。
getDBConnection();
Statement
オブジェクトを作成し、前述と同様にResultSet
型を指定します。
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
作成する必要があるSQL UPDATE
文の詳細を集積するStringBuffer
を作成します。
StringBuffer columns = new StringBuffer( 255 );
従業員レコードの各フィールドの値をユーザーが変更したかどうかをチェックし、値が変更された場合は、関連するコードをStringBuffer
に追加します。最初の項目以降に追加する項目には、それぞれカンマを追加して各項目を分離します。次のコードは、first_name
変数が変更されたかどうかをチェックし、変更された場合はその詳細をStringBuffer
内のSQLに追加し、これを使用してデータベースを更新します。
if ( first_name != null && !first_name.equals(oldEmployee.getFirstName() ) ) { columns.append( "first_name = '" + first_name + "'" ); }
last_name
については、新しい名字を追加する前に、StringBuffer
内にすでになんらかの変更があるかどうかをチェックし、変更がある場合は、カンマを追加して新しい変更と以前の変更を分けます。次のコードを使用します。
if ( last_name != null && !last_name.equals(oldEmployee.getLastName() ) ) { if ( columns.length() > 0 ) { columns.append( ", " ); } columns.append( "last_name = '" + last_name + "'" ); }
同じコード・ロジックを使用して、email
およびphone_number
の変更をチェックします。
salary
フィールドについては、String
値を取得して、次のようにStringBuffer
に追加します。
if ( salary != null && !salary.equals( oldEmployee.getSalary().toString() ) ) { if ( columns.length() > 0 ) { columns.append( ", " ); } columns.append( "salary = '" + salary + "'" );
変更セットが作成された後、実際に変更があったかどうか、つまり、StringBuffer
にデータが含まれているかどうかをチェックします。そうであれば、StringBuffer
内の情報を使用してSQL UPDATE
文を作成し、実行します。StringBufferに変更が含まれていない場合、そのことを通知するメッセージを表示します。
if ( columns.length() > 0 ) { sqlString = "update Employees SET " + columns.toString() + " WHERE employee_id = " + employee_id; System.out.println("\nExecuting: " + sqlString); stmt.execute(sqlString); } else { System.out.println( "Nothing to do to update Employee Id: " + employee_id); }
「success」というメッセージを返します。
return "success";
作業内容を保存してファイルを作成し、構文エラーがないかどうかをチェックします。
図5-2に、このメソッドのすべてのコードを示します。
図5-2 データベース・レコードの更新のメソッド
public String updateEmployee(int employee_id, String first_name, String last_name, String email, String phone_number, String salary, String job_id) throws SQLException { Employee oldEmployee = findEmployeeById(employee_id); getDBConnection(); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); StringBuffer columns = new StringBuffer( 255 ); if ( first_name != null && !first_name.equals( oldEmployee.getFirstName() ) ) { columns.append( "first_name = '" + first_name + "'" ); } if ( last_name != null && !last_name.equals( oldEmployee.getLastName() ) ) { if ( columns.length() > 0 ) { columns.append( ", " ); } columns.append( "last_name = '" + last_name + "'" ); } if ( email != null && !email.equals( oldEmployee.getEmail() ) ) { if ( columns.length() > 0 ) { columns.append( ", " ); } columns.append( "email = '" + email + "'" ); } if ( phone_number != null && !phone_number.equals( oldEmployee.getPhoneNumber() ) ) { if ( columns.length() > 0 ) { columns.append( ", " ); } columns.append( "phone_number = '" + phone_number + "'" ); } if ( salary != null && !salary.equals( oldEmployee.getSalary().toString() ) ) { if ( columns.length() > 0 ) { columns.append( ", " ); } columns.append( "salary = '" + salary + "'" ); } if ( job_id != null && !job_id.equals( oldEmployee.getJobId() ) ) { if ( columns.length() > 0 ) { columns.append( ", " ); } columns.append( "job_id = '" + job_id + "'" ); } if ( columns.length() > 0 ) { sqlString = "UPDATE Employees SET " + columns.toString() + " WHERE employee_id = " + employee_id; System.out.println("\nExecuting: " + sqlString); stmt.execute(sqlString); } else { System.out.println( "Nothing to do to update Employee Id: " + employee_id); } return "success"; }
次の手順では、employees.jsp
ページの従業員表の各行にリンクを追加します。ユーザーはリンクをクリックしてその行を編集します。
ビジュアル・エディタでemployees.jsp
を開きます。
従業員の詳細を表示する表に、新規に列を追加します。列を追加するには、表の最後の列にカーソルを置いて右クリックし、ショートカットメニューで「表」を選択してから、「行または列の挿入」を選択します。「行または列の挿入」ダイアログ・ボックスで「列」および「選択した列の後」を選択して、「OK」をクリックします。
この追加された列には、「Edit」と表示されるリンクが行ごとに含まれます。これらのリンクは、選択した従業員レコードを編集できる個々のページにナビゲートします。これには、Employees
表内のスクリプトレットをダブルクリックして「スクリプトレットのプロパティ」ダイアログ・ボックスを表示します。
edit.jsp
ページへのリンクが含まれるように、スクリプトレットを変更します。変更されたスクリプトレットには次のコードが含まれている必要があります。
while (rset.next ()) { out.println("<tr>"); out.println("<td>" + rset.getString("first_name") + "</td><td> " + rset.getString("last_name") + "</td><td> " + rset.getString("email") + "</td><td> " + rset.getString("job_id") + "</td><td>" + rset.getString("phone_number") + "</td><td>" + rset.getDouble("salary") + "</td><td> <a href=\"edit.jsp?empid=" + rset.getInt(1) + "\">Edit</a></td>"); out.println("<tr>"); }
従業員の編集リンクがクリックされると、このコードは、従業員レコードの更新を処理するedit.jsp
ページに、従業員IDを渡します。edit.jsp
ページはこのIDを使用して、その従業員のレコードをデータベース内で検索します。
employees.jsp
を保存します。図5-2は、実行されてブラウザに表示されたemployees.jsp
を示しています。クリックして従業員データを編集できるリンクが表示されています。
この項では、従業員レコードの更新に使用するedit.jsp
ファイルを作成します。
新しいJSPページを作成して、edit.jsp
という名前を付けます。その他はすべてデフォルトを使用します。
このページに、以前に設定したものと同じ見出しAnyCo Corporation: HR Applicationを付け、Heading 2スタイルを割り当て、ページの中央に配置します。
次の行に、Edit Employee Recordと入力し、Heading 3スタイルを適用します。この見出しをページの左側に配置します。
JDeveloperスタイルシートをページに追加します。
jsp:usebean
タグを追加します。empsbean
をIDとして入力し、hr.DataHandler
をクラスとして入力します。「有効範囲」を「セッション」
に設定し、「OK」をクリックします。
カーソルをuseBeanタグの後に置いて、jsp:usebean
タグをもう1つ追加します。今度は、employee
を「ID」として入力し、hr.Employeeを「クラス」として参照して選択し、「有効範囲」を「page」のままにします。「OK」をクリックします。
スクリプトレットをページに追加します。スクリプトレット・コードは、従業員IDをfindEmployeeById
メソッドに渡して、Employee
Bean内のデータを取り出します。次のコードを「スクリプトレットの挿入」ダイアログ・ボックスに入力します。
Integer employee_id = new Integer(request.getParameter("empid")); employee = empsbean.findEmployeeById(employee_id.intValue());
フォームをページに追加します。「フォームの挿入」ダイアログで、「アクション」フィールドにupdate_action.jsp
と入力します。まだ作成していないため、このページはドロップダウン・リストからは選択できません。
表をページに追加します。フォーム内に配置します。6行2列のレイアウトを指定し、その他のレイアウトはデフォルトを使用します。
各行の最初の列に、次の見出しをそれぞれ入力します。First Name
、Last Name
、Email
、Phone
, Job
、Monthly Salary
コンポーネント・パレットの「HTML Forms」ページから、「Hidden Field」コンポーネントをドラッグします。2列目の、First Name見出しの横にドロップします。「Hidden Fieldの挿入」ダイアログで、employee_id
を「名前」プロパティに入力し、<%= employee.getEmployeeId() %>
を「値」プロパティに入力します。
この列の、First Name見出しの横に、「テキスト・フィールド」コンポーネントをドラッグします。「Text Fieldの挿入」ダイアログで、 first_name
を「名前」フィールドに入力し、< %= employee.getFirstName() %>
を「値」フィールドに入力します。「OK」をクリックします。
この列の、Last Name見出しの横に、2つ目の「テキスト・フィールド」コンポーネントをドラッグします。「Text Fieldの挿入」ダイアログで、 last_name
を「名前」フィールドに入力し、< %= employee.getLastName() %>
を「値」
フィールドに入力します。「OK」をクリックします。
同様に、残りの各列見出しの横にテキスト・フィールドを追加します。email
、phone_number
、job_id
およびsalary
をフィールド名として使用し、各フィールドに対応するgetterメソッドを使用します。これらは次の表で指定されます。
「発行」ボタンを、フォームの表の下に追加します。Update
を「値」として入力します。
アプリケーションを保存します。
結果として作成されるedit.jsp
ページは、図5-3のようなページになります。
この項では、update_action.jsp
ファイルの作成方法について説明します。このページは、従業員レコードの更新に使用するedit.jsp
ページのフォームを処理します。このページには表示要素はなく、edit.jsp
フォームを処理するためにのみ使用され、employees.jsp
ファイルに制御を返します。
新しいJSPページを作成して、update_action.jsp
という名前を付けます。その他はすべて、JSP作成ウィザードのページのデフォルトを使用します。
コンポーネント・パレットの「JSP」ページから、「Page Directive」コンポーネントをページにドラッグします。「Page Directiveの挿入」ダイアログ・ボックスで、java.sql.ResultSetを参照してインポートします。「OK」をクリックします。
jsp:usebeanタグを追加します。empsbean
をIDとして入力し、hr.DataHandler
をクラスとして入力します。「有効範囲」を「セッション」
に設定し、「OK」をクリックします。
スクリプトレットをページに追加します。次のコードを「スクリプトレットの挿入」ダイアログ・ボックスに入力します。
Integer employee_id = new Integer(request.getParameter("employee_id")); String first_name = request.getParameter("first_name"); String last_name = request.getParameter("last_name"); String email = request.getParameter("email"); String phone_number = request.getParameter("phone_number"); String salary = request.getParameter("salary"); String job_id = request.getParameter("job_id"); empsbean.updateEmployee(employee_id.intValue(), first_name, last_name, email, phone_number, salary, job_id );
jsp:forwardタグをページにドラッグします。「Forwardの挿入」ダイアログ・ボックスで、「ページ」プロパティにemployees.jsp
と入力します。
作業内容を保存します。
プロジェクトを実行して、従業員レコードを編集できるかどうかをテストします。employees.jsp
ページで、いずれかの従業員のEditをクリックすると、図5-4に示されているページに移動します。従業員の詳細を変更し、employees.jsp
ページで変更が反映されているかどうかをチェックします。
Employees表に新しい従業員レコードを挿入する手順は、従業員レコードの更新処理と似ています。
Employees
表に新しい従業員行を挿入するメソッドを作成します。
メイン・アプリケーション・ページにリンクを追加し、ユーザーがリンクをクリックして新規従業員を挿入できるようにします。このリンクは、新しい行の詳細を入力するためのinsert.jsp
にユーザーを誘導します。
insert.jsp
ページのフォームを処理するJSPページを作成します。
新しい従業員の値を入力するためのフォームを制御するJSPページを作成します。
ここでは、新しい従業員データを挿入するJavaアプリケーション・コードの作成方法について次の各項で説明します。
次の手順では、新しい従業員レコードを挿入するメソッドを作成します。
Javaソース・エディタでDataHandler.java
を開きます。
新しい従業員レコードを追加するメソッドを宣言します。
public String addEmployee(String first_name, String last_name, String email, String phone_number, String job_id, int salary) throws SQLException { }
データベースに接続するための行を追加します。
getDBConnection();
Statement
オブジェクトを作成し、ResultSet
型を以前と同様に定義してSQL文を作成します。
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); sqlString = "INSERT INTO Employees VALUES (EMPLOYEES_SEQ.nextval, '" + first_name + "','" + last_name + "','" + email + "','" + phone_number + "'," + "SYSDATE, '" + job_id + "', " + salary + ",.30,100,80)";
注意: 最後の3つの列(Commission 、ManagerId およびDepartmentId )には、サンプル・アプリケーション用のハードコードされた値が格納されます。 |
トレース・メッセージを追加して、SQL文を実行します。
挿入が成功した場合は、「success」というメッセージを返します。
構文エラーをチェックするためのファイルを作成します。
図5-3に、addEmployee()
メソッドのコードを示します。
図5-3 新規従業員レコードの追加のメソッド
public String addEmployee(String first_name, String last_name, String email, String phone_number, String job_id, int salary) throws SQLException { getDBConnection(); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); sqlString = "INSERT INTO Employees VALUES (EMPLOYEES_SEQ.nextval, '" + first_name + "','" + last_name + "','" + email + "','" + phone_number + "'," + "SYSDATE, '" + job_id + "', " + salary + ",.30,100,80)"; System.out.println("\nInserting: " + sqlString); stmt.execute(sqlString); return "success"; }
次の手順では、従業員表のヘッダー行にリンクを追加します。ユーザーはリンクをクリックすることで、新しい従業員を追加できます。
ビジュアル・エディタでemployees.jsp
を開きます。
コンポーネント・パレットの「HTML Common」ページから、「Hyper Link」コンポーネントを、ヘッダー行の最後にある空の列ヘッダーのセルにドラッグします。「ハイパー・リンクの挿入」ダイアログ・ボックスで、「ハイパーリンク」フィールドにinsert.jsp
を入力し、「テキスト」フィールドにInsert Employee
を入力します。まだ作成していないため、insert.jsp
を参照して検索することはできません。「OK」をクリックします。
employees.jsp
を保存します。
次の手順では、insert.jsp
ページを作成します。このページを使用することで、ユーザーは新しい従業員レコードの詳細を入力できます。
新しいJSPページを作成して、insert.jsp
という名前を付けます。
このページに、以前に設定したものと同じ見出しAnyCo Corporation: HR Applicationを付け、Heading 2としてフォーマットして、中央に配置します。
次の行に、Insert Employee Recordと入力し、Heading 3フォーマットを適用します。この見出しをページの左側に配置します。
JDeveloperスタイルシートをページに追加します。
フォームを追加します。「フォームの挿入」ダイアログ・ボックスで、「アクション」プロパティにinsert_action.jsp
と入力して、「OK」をクリックします。
表をフォーム内に追加します。6行2列を指定し、その他のレイアウトはデフォルトを使用します。
各行の最初の列に、次の見出しをそれぞれ入力します。First Name、Last Name、Email、Phone、Job、Monthly Salary
First Nameヘッダーの右の列に、「テキスト・フィールド」をドラッグ・アンド・ドロップします。「フィールドの挿入」ダイアログ・ボックスで、「名前」プロパティにfirst_name
と入力します。
Last Name、Email、PhoneおよびMonthly Salaryヘッダーのそれぞれの横に、「テキスト・フィールド」をドラッグします。これらのテキスト・フィールドごとに、「フィールドの挿入」ダイアログ・ボックスで「名前」プロパティに値を指定します。次の表に、値を示します。
テキスト・フィールドの対象 | 「名前」プロパティに設定する値 |
---|---|
Last Name | last_name |
email |
|
Phone | phone_number |
Monthly Salary | salary |
Job行は手順が異なります。
コンポーネント・パレットの「HTML Forms」ページから、コンボ・ボックス・コンポーネントを、Job見出しの横の列にドラッグします。
「選択の挿入」ダイアログ・ボックスで、名前にjob_id
を入力し、サイズに1
を入力します。追加(+)アイコンをクリックし、「値」フィールドにSA_REP
と入力し、「キャプション」フィールドにSales Representative
と入力します。追加(+)記号をクリックして、次の各ジョブ・タイトルを追加し、「OK」をクリックします。
値 | キャプション |
---|---|
HR_REP |
HR Representative |
PR_REP |
PR Representative |
MK_MAN |
Marketing Manager |
SA_MAN |
Sales Manager |
FI_MAN |
Finance Manager |
IT_PROG |
Software Developer |
AD_VIP |
Vice President |
「発行」ボタンを表の下のフォームにドラッグします。「送信ボタンの挿入」ダイアログ・ボックスで、「値」プロパティにAdd Employee
と入力します。
作業内容を保存します。
図5-5に、ビジュアル・エディタのinsert.jsp
ページを示します。
次の手順では、insert_action.jsp
ページを作成します。このページは、新しい従業員レコードを入力するinsert.jsp
ページからのフォーム入力を処理します。このページには表示要素はなく、 insert.jsp
フォームを処理するためにのみ使用され、employees.jsp
ファイルに制御を返します。
jsp:usebeanタグを追加します。以前と同様に、IDにempsbean
を入力し、クラスにhr.DataHandler
を入力します。「有効範囲」を「セッション」
に設定し、「OK」をクリックします。
カーソルをuseBeanタグの後に置き、スクリプトレットをページに追加します。次のコードを「スクリプトレットの挿入」ダイアログ・ボックスに入力します。
String first_name = request.getParameter("first_name"); String last_name = request.getParameter("last_name"); String email = request.getParameter("email"); String phone_number = request.getParameter("phone_number"); String job_id = request.getParameter("job_id"); Integer salary = new Integer(request.getParameter("salary")); empsbean.addEmployee(first_name, last_name, email, phone_number, job_id, salary.intValue());
jsp:forwardタグをページにドラッグします。「Forwardの挿入」ダイアログ・ボックスで、employees.jsp
と入力します。
作業内容を保存します。
Viewプロジェクトを実行して、新しい従業員レコードを挿入できるかどうかをテストします。
従業員を挿入するには、図5-6に示したemployees.jsp
ページで、Insert Employee
をクリックします。
図5-7に、入力済のデータと、ジョブの選択に使用されるジョブ・リストが表示されている、従業員データを新規に挿入するページを示します。
レコードを削除する手順は、レコードを編集および挿入する手順と似ています。
「従業員レコードを識別するメソッドの作成」で作成したメソッドを使用して、特定の従業員行を識別します。このメソッドは、削除する行を識別するために使用されます。
従業員レコードをデータベースから削除するメソッドを作成します。
メイン・アプリケーション・ページで各行にリンクを追加し、ユーザーがリンクをクリックしてその行の従業員を削除できるようにします。このリンクは、レコードが削除される従業員のIDとともにdelete_action.jsp
にユーザーを誘導します。
データベースから従業員を削除するには、手順2で作成した削除メソッドをコールするJSPページを作成します。
この項では、従業員データの削除に関連する次のタスクについて説明します。
次の手順で作成するメソッドは、IDを使用した従業員レコードの削除に使用します。
削除する従業員レコードを識別するための新規メソッドを宣言します。
public String deleteEmployeeById(int id) throws SQLException { }
前述と同様に、データベースに接続します。
getDBConnection();
Statement
オブジェクトを作成し、ResultSet
型を以前と同様に定義してSQL文を作成します。デバッグに役立てるために、トレース・メッセージを追加します。
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); sqlString = "DELETE FROM Employees WHERE employee_id = " + id; System.out.println("\nExecuting: " + sqlString);
SQL文を実行します。
stmt.execute(sqlString);
SQL文の実行が正常に完了した場合は、Success
というメッセージを返します。
return "success";
図5-4に、 deleteEmployeeById()
メソッドのコードを示します。
図5-4 従業員レコードを削除するメソッド
public String deleteEmployeeById(int id) throws SQLException { getDBConnection(); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); sqlString = "DELETE FROM Employees WHERE employee_id = " + id; System.out.println("\nExecuting: " + sqlString); stmt.execute(sqlString); return "success"; }
次の手順では、employees.jsp
ページの従業員表の各行にリンクを追加します。リンクをクリックすると、その行の従業員データがすべて削除されます。
ビジュアル・エディタでemployees.jsp
を開きます。
Editリンクを配置するために作成した列に、行を削除するための別のリンクを追加します。これには、Employees
表内のスクリプトレットをダブルクリックして「スクリプトレットのプロパティ」ダイアログ・ボックスを表示します。
delete_action.jsp
ページへのリンクが含まれるように、スクリプトレットを変更します。変更されたスクリプトレットには次のコードが含まれている必要があります。
while (rset.next ()) { out.println("<tr>"); out.println("<td>" + rset.getString("first_name") + "</td><td> " + rset.getString("last_name") + "</td><td> " + rset.getString("email") + "</td><td> " + rset.getString("job_id") + "</td><td>" + rset.getString("phone_number") + "</td><td>" + rset.getDouble("salary") + "</td><td> <a href=\"edit.jsp?empid=" + rset.getInt(1) + "\">Edit</a> <a href=\"delete_action.jsp?empid=" + rset.getInt(1) + "\">Delete</a></td>"); out.println("<tr>"); }
employees.jsp
を保存します。
次の手順では、delete_action.jsp
ページを作成します。これは、削除操作のみを処理するページです。このページにはビジュアル要素はありません。
jsp:usebeanタグを追加します。以前と同様に、IDにempsbean
を入力し、クラスにhr.DataHandler
を入力します。「有効範囲」を「セッション」
に設定し、「OK」をクリックします。
スクリプトレットをページに追加します。次のコードを「スクリプトレットの挿入」ダイアログ・ボックスに入力します。
Integer employee_id = new Integer(request.getParameter("empid")); empsbean.deleteEmployeeById(employee_id.intValue());
コンポーネント・パレットからForwardをドラッグして、jsp:forwardタグをページに追加します。「Forwardの挿入」ダイアログ・ボックスで、employees.jspと入力します。
作業内容を保存します。
プロジェクトを実行して従業員を削除してみます。図5-8に、employees.jsp
から従業員レコードを削除するリンクを示します。
いずれかの従業員レコードのDeleteをクリックすると、その従業員レコードが削除されます。
SQLException
オブジェクト・インスタンスは、データベース・アクセス・エラーやその他のエラーに関する情報を提供します。各SQLException
インスタンスは様々なタイプの情報を提供しますが、情報がエラー内容を説明する文字列である場合は、これをJava例外メッセージとして使用し、getMessage
メソッドをとおして取得できます。
このサンプル・アプリケーションでは、Javaの例外処理メカニズムである、try
ブロックとcatch
ブロックを使用します。Javaでは、メソッドから例外がスローされる場合、これを処理するメカニズムが必要になります。通常、catch
ブロックは例外を捕捉し、例外発生時のアクションの流れを指定しますが、単にメッセージを表示するだけの場合もあります。
データベース・アクセス・エラーが発生すると、各JDBCメソッドはSQLException
をスローします。そのため、このようなメソッドを実行するアプリケーションのメソッドにはすべて例外処理が必要です。
サンプル・アプリケーション内のすべてのメソッドには、例外処理用のコードが含まれています。たとえば、データベース接続に使用されるgetDBConnection
は、次に示すgetAllEmployees
メソッドと同じように、SQLExceptionをスローします。
public ResultSet getAllEmployees() throws SQLException { }
SQLExceptionを捕捉して処理するコードの例は、DataHandler.java
クラスのauthenticateUser
メソッド内のコードを参照してください。この例では、ユーザー認証を行うため実行する必要のあるコードがtry
ブロックに含まれており、認証が失敗した場合は、catch
ブロックが対応します。次の項では、SQLExceptionを捕捉して処理するコードをサンプル・アプリケーションに追加する方法について説明します。
サンプル・アプリケーションのメソッドでSQL例外を処理するには、次の手順を実行します。
メソッドがSQLException
をスローしていることを確認します。次にメソッドの例を示します。
public ResultSet getAllEmployees() throws SQLException
try
ブロックおよびcatch
ブロックを使用して、SQLExceptionを捕捉します。たとえば、getAllEmployees
メソッドでは、既存コードをtry
ブロックにまとめ、catch
ブロックを次のように追加しています。
public ResultSet getAllEmployees() throws SQLException { try { getDBConnection(); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); sqlString = "SELECT * FROM Employees order by employee_id"; System.out.println("\nExecuting: " + sqlString); rset = stmt.executeQuery(sqlString); } catch (SQLException e) { e.printStackTrace(); } return rset; }
別の例として、try
ブロックおよびcatch
ブロックを使用するように書き換えたdeleteEmployee
メソッドは、メソッドの実行が成功した場合にのみ"success"を返します。つまり、return
文がtry
ブロックに含まれています。コードは次のようになります。
public String deleteEmployeeById(int id) throws SQLException { try { getDBConnection(); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); sqlString = "delete FROM Employees where employee_id = " + id; System.out.println("\nExecuting: " + sqlString); stmt.execute(sqlString); return "success"; } catch (SQLException e) { e.printStackTrace(); } }
サンプル・アプリケーションのコードの改良点として、SQLException
をスローするメソッドで使用する例外処理のメソッドを作成します。例として、次のメソッドは、サンプル・アプリケーションのどのメソッドのcatch
ブロックからでもコールできます。このメソッドは累積されたすべての例外を処理し、それぞれについてスタック・トレースを出力します。
例5-5 アプリケーションのSQLExceptionを処理するメソッドの追加
public void logException( SQLException ex ) { while ( ex != null ) { ex.printStackTrace(); ex = ex.getNextException(); } }
また、catch
ブロックでは、メソッドが失敗した理由を説明するテキストを返せます。つまり、メソッドのcatch
ブロックを次のように記述できます。
catch ( SQLException ex ) { logException( ex ); return "failure"; }
この機能をアプリケーションに追加するには、次の手順を実行します。
web.xml
ファイルは、Webアプリケーションのデプロイメント・ディスクリプタ・ファイルです。web.xml
ファイルの1つのセクションを使用して、次のようにアプリケーションの開始ページを定義できます。
<web-app> ... <welcome-file> myWelcomeFile.jsp </welcome-file> ... </web-app>
web.xml
ファイルでwelcomeページを定義しなかった場合、名前がindex
で拡張子が.html
、.htm
または.jsp
のファイルが見つかれば、通常これが開始ページとして使用されます。JDeveloperでは、アプリケーションのデフォルトの実行ターゲットとするページ、つまり、最初に表示されるアプリケーションのページを、プロジェクトのプロパティを使用して定義できます。
アプリケーションが起動して開始ページが表示された後、アプリケーション内のナビゲーションは次の方法を使用して実現されます。
リンク: HTMLアンカー・タグの形式で、リンクのターゲット(通常はナビゲート先の別のJSPページを特定する)およびリンクのテキストを定義します。
HTML送信ボタン: このボタンを使用してページのフォーム(新規データまたは変更済のデータを入力するフォームなど)を送信します。
jsp:forward
タグ: 問合せおよびフォームを処理するJSPページで実行され、同じJSPページに再度フォワードするかまたは別のJSPページにフォワードします。
次の手順では、アプリケーションのデフォルトの開始ページとするindex.jsp
ページを作成します。このページには表示要素は配置せず、アプリケーションのログイン・ページ(login.jsp
)へのユーザーのフォワードのみを行います。これを行うには、jsp:forward
タグを使用します。jsp:forward
タグは問合せおよびフォームを処理するJSPページで実行され、同じJSPページに再度フォワードするかまたは別のJSPページにフォワードします。
新しいJSPページを作成して、index.jsp
という名前を付けます。
サンプル・アプリケーションでは、このページにテキストを追加しません。コンポーネント・パレットの「JSP」ページから、Forwardをドラッグして、jsp:forward
タグをページに含めます。
forward
タグの「Forwardの挿入」ダイアログ・ボックスで、login.jsp
を「ページ」として入力します。
これで、この新しいページをアプリケーションのデフォルト・ターゲットに指定できます。次の手順を実行します。
アプリケーション・ナビゲータで、Viewプロジェクトを右クリックして、「プロジェクト・プロパティ」を選択します。
表示されたツリーで、「実行/デバッグ/プロファイル」を選択します。「実行/デバッグ/プロファイル」領域で「プロジェクト設定を使用」が選択されていることを確認し、「実行構成」領域で「デフォルト構成」が選択されていることを確認します。「編集」をクリックします。
「起動設定の編集」ダイアログ・ボックスで、「起動設定」を選択します。右側の「起動設定」領域で、「デフォルトの実行ターゲット」フィールドの横にある「参照」をクリックして、今作成した新しいindex.jsp
ページを検索し、「OK」をクリックします。再度「OK」をクリックして、ダイアログ・ボックスを閉じます。
これで、Viewプロジェクトを右クリックし、ショートカット・メニューで「実行」を選択すると、アプリケーションを実行できます。アプリケーションを実行すると、アプリケーションのデフォルトの起動ターゲットとして設定されているindex.jsp
が実行されます。index.jsp
によって直接ログイン・ページ(login.jsp
)にフォワードされ、このページがブラウザに表示されます。