この章では、サンプル・アプリケーションの変更方法および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)にフォワードされ、このページがブラウザに表示されます。