ヘッダーをスキップ

Oracle Database 2日でJava開発者ガイド
11g リリース1(11.1)

E05692-02
目次
目次
索引
索引

戻る 次へ

5 データの更新

この章では、サンプル・アプリケーションの変更方法およびOracleデータベース内のデータをユーザーが編集、更新および削除できるようにする機能の追加方法について説明します。この章は次の項で構成されています。

JavaBeanの作成

簡単に言うと、Beanは、プロパティ、イベントおよびメソッドを持つJavaクラスです。Beanは、プロパティごとにアクセッサ(getおよびsetメソッド)も持っています。特定の基本ルールに従っているオブジェクトは、すべてBeanといえます。Beanを作成するために拡張する必要がある特別なクラスはありません。

この章のサンプル・アプリケーションの作成手順では、単一の従業員レコードを保持するためにJavaBeanを使用します。既存レコードを編集したり、新規レコードを追加するときに、表の単一行の変更された値または新しい値を保持するコンテナとしてJavaBeanが使用され、これによりデータベースの更新に使用する行が準備されます。

Beanは従業員レコードのフィールドごとにプロパティを持ち、JDeveloperはこれらのプロパティごとにアクセッサ(getおよびsetメソッド)を作成します。次の項では、サンプル・アプリケーションのJavaBeanの作成方法について説明します。

JDeveloperでのJavaBeanの作成

Employee.javaはサンプル・アプリケーションで使用するJavaBeanで、単一の従業員レコードを保持してその内容を変更します。JavaBeanを作成するには、次の手順を実行します。

  1. Viewプロジェクトを右クリックして、ショートカット・メニューから「新規」を選択します。

  2. 「新規ギャラリ」ダイアログ・ボックスの「フィルタ方法」フィールドで、「すべてのテクノロジ」を選択します。

  3. 「一般」カテゴリを開いて、「一般」カテゴリの「JavaBeans」を選択します。「項目」リストから、「Bean」を選択します。「OK」をクリックします。

  4. 「Bean作成」ダイアログ・ボックスで、名前にEmployee、パッケージにhrを入力し、「拡張」フィールドがjava.lang.Objectに設定されていることを確認します。「OK」をクリックして、Beanを作成します。

  5. ファイルを保存します。これで、Employee.javaファイルに次のコードが含まれます。

    package hr;
     
    public class Employee {
      public Employee(){
      }
    }
    

JavaBeanのプロパティおよびメソッドの定義

JavaBeanでは、Employees表の列ごとに1つのフィールドを作成し、フィールドごとにアクセッサ・メソッド(getおよびsetメソッド)を作成する必要があります。

  1. java.sql.Date(いずれかのフィールドのフィールド型)のimport文を追加します。

    import java.sql.Date;
    
    
  2. 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;
    
    
  3. ソース・エディタのページで右クリックし、ショートカット・メニューで「アクセッサの生成」を選択します。「アクセッサの生成」ダイアログ・ボックスで、トップレベルのEmployeeノードを選択します。Employeeノードとそのすべてのフィールドに、チェック・マークが表示されます。「OK」をクリックします。図5-1に、すべてのフィールドが選択されている「アクセッサの生成」ダイアログ・ボックスを示します。

    図5-1    「アクセッサの生成」ダイアログ・ボックス


    画像の説明

  4. ファイルを保存します。これで、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クラスからのデータの更新

Javaアプリケーションからデータベースの表に含まれる行を更新するには、次のタスクを実行する必要があります。

  1. 特定の従業員行を検索するメソッドを作成します。このメソッドを使用して、特定の従業員の値を編集ページに表示します。

  2. Beanから更新済の従業員データを取り出してデータベースを更新するメソッドを作成します。

  3. アプリケーションのメイン・ページにある従業員データの各行に、その従業員データの編集を可能にするリンクを含めます。このリンクを使用すると、edit.jspファイルが開き、その従業員のデータが編集可能な状態で表示されます。

  4. edit.jspという名前のJSPページを作成します。このページには、単一の従業員の全データを表示するフォームと表が含まれ、ユーザーはこのページを使用して値を変更できます。

  5. edit.jspページのフォームを処理し、更新された値をEmployee.java Beanに書き込んで、updateEmployeeメソッドをコールするJSPページを作成します。

これらの方法については、次の項を参照してください。

従業員レコードを識別するメソッドの作成

次の手順で作成するメソッドは、特定の従業員レコードの検索に使用します。このメソッドは、特定の従業員レコードを編集または削除する場合や、Employee.javaページでその従業員のリンクを選択した場合に使用されます。

  1. DataHandlerクラスがJavaソース・エディタでまだ開いていない場合は、アプリケーション・ナビゲータでこのクラスをダブルクリックして開きます。

  2. DataHandlerクラスで、更新する従業員レコードを識別するための新規メソッドを宣言します。

    public Employee findEmployeeById(int id) throws SQLException {
     
    }
    
    
  3. このメソッドのボディで、selectedEmpという名前の、Employee Beanの新規インスタンスを作成します。

    Employee selectedEmp = new Employee();
    
    
  4. データベースに接続します。

    getDBConnection();
    
    
  5. 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);
    
    
  6. 問合せを実行し、ResultSetオブジェクトを使用して結果を格納します。

    rset = stmt.executeQuery(query);
    
    
  7. 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"));
    }
    
    
  8. 移入されたオブジェクトを返します。

    return selectedEmp;
    

従業員データを更新するメソッドの作成

次の手順では、データベース内の従業員データを更新するメソッドの作成方法について説明します。

  1. DataHandlerクラスを開きます。

  2. 次のように、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 {
     
    }
    
    
  3. このメソッドのボディで、選択した従業員の詳細を格納する、Employee Beanのインスタンスを作成します。

    Employee oldEmployee = findEmployeeById(employee_id);
    
    
  4. データベースに接続します。

    getDBConnection();
    
    
  5. Statementオブジェクトを作成し、前述と同様にResultSet型を指定します。

    stmt =
      conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, 
                           ResultSet.CONCUR_READ_ONLY);
    
    
  6. 作成する必要があるSQL UPDATE文の詳細を集積するStringBufferを作成します。

    StringBuffer columns = new StringBuffer( 255 );
    
    
  7. 従業員レコードのフィールドごとに、ユーザーが値を変更したかどうかをチェックします。値が変更されている場合には、関連するコードをStringBufferに追加します。追加する2つ目以降の項目については、カンマを使用してそれぞれの項目を区切ります。次のコードは、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の変更をチェックします。


    注意:

    この手順にはコードの重要な部分のみが含まれています。例5-2には、このメソッドのコードをすべて記載しています。 


    salaryフィールドについては、String値を取得して、次のようにStringBufferに追加します。

      if ( salary != null && 
          !salary.equals( oldEmployee.getSalary().toString() ) ) {
        if ( columns.length() > 0 ) {
          columns.append( ", " );
        }
        columns.append( "salary = '" + salary + "'" );
    
    
  8. すべての変更セットが収集されたら、実際に変更があるかどうかをチェックします。つまり、StringBufferに何か含まれているかどうかをチェックします。含まれている場合は、StringBufferの情報を使用してSQL UPDATE文を構築し、このSQL文を実行します。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);
      }
    
    
  9. 「success」というメッセージを返します。

    return "success";
    
    
  10. 作業内容を保存してファイルを作成し、構文エラーがないかどうかをチェックします。

例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ページの従業員表の各行にリンクを追加します。ユーザーはリンクをクリックしてその行を編集します。

  1. ビジュアル・エディタでemployees.jspを開きます。

  2. 従業員の詳細を表示する表に、新規に列を追加します。列を追加するには、表の最後の列にカーソルを置いて右クリックし、ショートカットメニューで「表」を選択してから、「行または列の挿入」を選択します。「行または列の挿入」ダイアログ・ボックスで「列」および「選択した列の後」を選択して、「OK」をクリックします。

  3. この追加された列には、「Edit」と表示されるリンクが行ごとに含まれます。これらのリンクは、選択した従業員レコードを編集できる個々のページにナビゲートします。これには、Employees表内のスクリプトレットをダブルクリックして「スクリプトレットのプロパティ」ダイアログ・ボックスを表示します。

  4. 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を使用して、その従業員のレコードをデータベース内で検索します。

  5. employees.jspを保存します。図5-2に、実行されブラウザに表示されたemployees.jspを示します。図に示されたリンクをクリックすると、従業員データを編集できます。

    図5-2    employees.jspの従業員の編集へのリンク


    画像の説明

従業員データを編集するJSPページの作成

この項では、従業員レコードの更新に使用するedit.jspファイルを作成します。

  1. 新しいJSPページを作成して、edit.jspという名前を付けます。その他はすべてデフォルトを使用します。

  2. このページに、以前に設定したものと同じ見出しAnyCo Corporation: HR Applicationを付け、Heading 2スタイルを割り当て、ページの中央に配置します。

  3. 次の行に、Edit Employee Recordと入力し、Heading 3スタイルを適用します。この見出しをページの左側に配置します。

  4. JDeveloperスタイルシートをページに追加します。

  5. jsp:usebeanタグを追加します。empsbeanIDとして入力し、hr.DataHandlerクラスとして入力します。「有効範囲」「セッション」に設定し、「OK」をクリックします。

  6. カーソルをuseBeanタグの後に置いて、jsp:usebeanタグをもう1つ追加します。今度は、employee「ID」として入力し、hr.Employeeを「クラス」として参照して選択し、「有効範囲」を「page」のままにします。「OK」をクリックします。

  7. スクリプトレットをページに追加します。スクリプトレット・コードは、従業員IDをfindEmployeeByIdメソッドに渡して、Employee Bean内のデータを取り出します。次のコードを「スクリプトレットの挿入」ダイアログ・ボックスに入力します。

    Integer employee_id = new Integer(request.getParameter("empid"));
    employee = empsbean.findEmployeeById(employee_id.intValue());
    
    
  8. フォームをページに追加します。「フォームの挿入」ダイアログで、「アクション」フィールドにupdate_action.jspと入力します。まだ作成していないため、このページはドロップダウン・リストからは選択できません。

  9. をページに追加します。フォーム内に配置します。6行2列のレイアウトを指定し、その他のレイアウトはデフォルトを使用します。

  10. 各行の最初の列に、次の見出しをそれぞれ入力します。First NameLast NameEmailPhone, JobMonthly Salary

  11. コンポーネント・パレットの「HTML Forms」ページから、「Hidden Field」コンポーネントをドラッグします。2列目の、First Name見出しの横にドロップします。「Hidden Fieldの挿入」ダイアログで、employee_id「名前」プロパティに入力し、<%= employee.getEmployeeId() %>「値」プロパティに入力します。

  12. この列の、First Name見出しの横に、「テキスト・フィールド」コンポーネントをドラッグします。「テキスト・フィールドの挿入」ダイアログで、first_name「名前」フィールドに入力し、<%= employee.getFirstName() %>「値」フィールドに入力します。「OK」をクリックします。

  13. この列の、Last Name見出しの横に、2つ目の「テキスト・フィールド」コンポーネントをドラッグします。「テキスト・フィールドの挿入」ダイアログで、last_name「名前」フィールドに入力し、<%= employee.getLastName() %>「値」フィールドに入力します。「OK」をクリックします。

  14. 同様の方法で、残りの各列見出しの横にテキスト・フィールドを追加します。emailphone_numberjob_idおよびsalaryをフィールド名として使用し、各フィールドに対応するgetterメソッドを指定します。これらは次の表に示されています。

  15. 「発行」ボタンを、フォームの表の下に追加します。Update「値」として入力します。

  16. アプリケーションを保存します。

    結果として作成されるedit.jspページは、図5-3のようなページになります。

    図5-3    従業員の詳細を編集するJSPページの作成


    画像の説明

更新アクションを処理するJSPページの作成

この項では、update_action.jspファイルの作成方法について説明します。このページは、従業員レコードの更新に使用するedit.jspページのフォームを処理します。このページには表示要素はなく、edit.jspフォームを処理するためにのみ使用され、employees.jspファイルに制御を返します。

  1. 新しいJSPページを作成して、update_action.jspという名前を付けます。その他はすべて、JSP作成ウィザードのページのデフォルトを使用します。

  2. コンポーネント・パレットの「JSP」ページから、「Page Directive」コンポーネントをページにドラッグします。「Page Directiveの挿入」ダイアログ・ボックスで、java.sql.ResultSetを参照してインポートします。「OK」をクリックします。

  3. jsp:usebeanタグを追加します。empsbeanIDとして入力し、hr.DataHandlerクラスとして入力します。「有効範囲」「セッション」に設定し、「OK」をクリックします。

  4. スクリプトレットをページに追加します。次のコードを「スクリプトレットの挿入」ダイアログ・ボックスに入力します。

    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 );
    
    
  5. jsp:forwardタグをページにドラッグします。「Forwardの挿入」ダイアログ・ボックスで、「ページ」プロパティにemployees.jspと入力します。

  6. 作業内容を保存します。

  7. プロジェクトを実行して、従業員レコードを編集できるかどうかをテストします。employees.jspページで、いずれかの従業員のEditをクリックすると、図5-4に示されているページに移動します。従業員の詳細を変更し、employees.jspページで変更が反映されているかどうかをチェックします。

    図5-4    従業員データの編集


    画像の説明

従業員レコードの挿入

Employees表に新しい従業員レコードを挿入する手順は、従業員レコードの更新処理と似ています。

  1. Employees表に新しい従業員行を挿入するメソッドを作成します。

  2. アプリケーションのメイン・ページにリンクを追加します。ユーザーは、このリンクをクリックすることで、新しい従業員を挿入できます。リンクをクリックすると、insert.jspが開き、新しい行の詳細を入力できる空のフォームが表示されます。

  3. insert.jspページのフォームを処理するJSPページを作成します。

  4. 新しい従業員の値を入力するためのフォームを制御するJSPページを作成します。

ここでは、新しい従業員データを挿入するJavaアプリケーション・コードの作成方法について次の各項で説明します。

データを挿入するメソッドの作成

次の手順では、新しい従業員レコードを挿入するメソッドを作成します。

  1. Javaソース・エディタでDataHandler.javaを開きます。

  2. 新しい従業員レコードを追加するメソッドを宣言します。

    public String addEmployee(String first_name, 
      String last_name, String email, 
      String phone_number, String job_id, int salary) throws SQLException {
     
    }
    
    
  3. データベースに接続するための行を追加します。

    getDBConnection();
    
    
  4. 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つの列(CommissionManagerIdおよびDepartmentId)には、サンプル・アプリケーション用のハードコードされた値が格納されます。 


  5. トレース・メッセージを追加して、SQL文を実行します。

  6. 挿入が成功した場合は、「success」というメッセージを返します。

  7. 構文エラーをチェックするためのファイルを作成します。

例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";
}

挿入ページにナビゲートするリンクの追加

次の手順では、従業員表のヘッダー行にリンクを追加します。ユーザーはリンクをクリックすることで、新しい従業員を追加できます。

  1. ビジュアル・エディタでemployees.jspを開きます。

  2. コンポーネント・パレットの「HTML Common」ページから、「Hyper Link」コンポーネントを、ヘッダー行の最後にある空の列ヘッダーのセルにドラッグします。「ハイパー・リンクの挿入」ダイアログ・ボックスで、「ハイパーリンク」フィールドにinsert.jspを入力し、「テキスト」フィールドにInsert Employeeを入力します。まだ作成していないため、insert.jspを参照して検索することはできません。「OK」をクリックします。

  3. employees.jspを保存します。

新規データを入力するJSPページの作成

次の手順では、insert.jspページを作成します。このページを使用することで、ユーザーは新しい従業員レコードの詳細を入力できます。

  1. 新しいJSPページを作成して、insert.jspという名前を付けます。

  2. このページに、以前に設定したものと同じ見出しAnyCo Corporation: HR Applicationを付け、Heading 2としてフォーマットして、中央に配置します。

  3. 次の行に、Insert Employee Recordと入力し、Heading 3フォーマットを適用します。この見出しをページの左側に配置します。

  4. JDeveloperスタイルシートをページに追加します。

  5. フォームを追加します。「フォームの挿入」ダイアログ・ボックスで、「アクション」プロパティにinsert_action.jspと入力して、「OK」をクリックします。

  6. フォーム内に追加します。6行2列を指定し、その他のレイアウトはデフォルトを使用します。

  7. 各行の最初の列に、次の見出しをそれぞれ入力します。First NameLast NameEmailPhone, JobMonthly Salary

  8. First Nameヘッダーの右の列に、「テキスト・フィールド」をドラッグ・アンド・ドロップします。「フィールドの挿入」ダイアログ・ボックスで、「名前」プロパティにfirst_nameと入力します。

  9. Last NameEmailPhoneおよびMonthly Salaryヘッダーのそれぞれの横に、「テキスト・フィールド」をドラッグします。これらのテキスト・フィールドごとに、「フィールドの挿入」ダイアログ・ボックスで「名前」プロパティに値を指定します。次の表に、値を示します。

    テキスト・フィールドの対象  「名前」プロパティに設定する値 

    Last Name 

    last_name 

    Email 

    email 

    Phone 

    phone_number 

    Monthly Salary 

    salary 

    Job行は手順が異なります。

  10. コンポーネント・パレットの「HTML Forms」ページから、コンボ・ボックスコンポーネントを、Job見出しの横の列にドラッグします。

  11. 「選択の挿入」ダイアログ・ボックスで、名前に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 

  12. 「発行」ボタンを表の下のフォームにドラッグします。「送信ボタンの挿入」ダイアログ・ボックスで、「値」プロパティにAdd Employeeと入力します。

  13. 作業内容を保存します。

図5-5に、ビジュアル・エディタでのinsert.jspページを示します。

図5-5    従業員データを挿入するフォーム


画像の説明

挿入アクションを処理するJSPページの作成

次の手順では、insert_action.jspページを作成します。このページは、新しい従業員レコードを入力するinsert.jspページからのフォーム入力を処理します。このページには表示要素はなく、insert.jspフォームを処理するためにのみ使用され、employees.jspファイルに制御を返します。

  1. 前述と同様に、JSPページを作成します。このページにinsert_action.jspという名前を付けます。

  2. jsp:usebeanタグを追加します。以前と同様に、IDempsbeanを入力し、クラスhr.DataHandlerを入力します。「有効範囲」「セッション」に設定し、「OK」をクリックします。

  3. カーソルを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());
    
    
  4. jsp:forwardタグをページにドラッグします。「Forwardの挿入」ダイアログ・ボックスで、 employees.jspと入力します。

  5. 作業内容を保存します。

  6. Viewプロジェクトを実行して、新しい従業員レコードを挿入できるかどうかをテストします。

従業員を挿入するには、図5-6に示したemployees.jspページで、Insert Employeeをクリックします。

図5-6    新規従業員データの挿入


画像の説明

図5-7に、入力済のデータと、ジョブの選択に使用されるジョブ・リストが表示されている、従業員データを新規に挿入するページを示します。

図5-7    従業員データの挿入


画像の説明

従業員レコードの削除

レコードを削除する手順は、レコードを編集および挿入する手順と似ています。

  1. 「従業員レコードを識別するメソッドの作成」で作成したメソッドを使用して、特定の従業員行を識別します。このメソッドは、削除する行を識別するために使用されます。

  2. 従業員レコードをデータベースから削除するメソッドを作成します。

  3. アプリケーションのメイン・ページの各行にリンクを追加します。ユーザーは、このリンクをクリックすることで、その行の従業員を削除できます。リンクをクリックすると、ユーザーは削除する従業員レコードのIDによるdelete_action.jspページにナビゲートされます。

  4. データベースから従業員を削除するには、手順2で作成した削除メソッドをコールするJSPページを作成します。

この項では、従業員データの削除に関連する次のタスクについて説明します。

データを削除するメソッドの作成

次の手順で作成するメソッドは、IDを使用した従業員レコードの削除に使用します。

  1. Javaソース・エディタでDataHandler.javaを開きます。

  2. 削除する従業員レコードを識別するための新規メソッドを宣言します。

    public String deleteEmployeeById(int id) throws SQLException {
     
    }
    
    
  3. 前述と同様に、データベースに接続します。

    getDBConnection();
    
    
  4. 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);
    
    
  5. SQL文を実行します。

    stmt.execute(sqlString);
    
    
  6. 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ページの従業員表の各行にリンクを追加します。リンクをクリックすると、その行の従業員データがすべて削除されます。

  1. ビジュアル・エディタでemployees.jspを開きます。

  2. Editリンクを配置するために作成した列に、行を削除するための別のリンクを追加します。このためには、Employees表内のスクリプトレットをダブルクリックしてスクリプトレットのプロパティ」ダイアログ・ボックスを表示します。

  3. 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>");
        }
    
    
  4. employees.jspを保存します。

削除アクションを処理するJSPページの作成

次の手順では、delete_action.jspページを作成します。このページは削除操作のみを処理します。このページには、表示要素はありません。

  1. 新しいJSPページを作成して、delete_action.jspという名前を付けます。

  2. jsp:usebeanタグを追加します。以前と同様に、IDempsbeanを入力し、クラスhr.DataHandlerを入力します。「有効範囲」「セッション」に設定し、「OK」をクリックします。

  3. スクリプトレットをページに追加します。次のコードを「スクリプトレットの挿入」ダイアログ・ボックスに入力します。

    Integer employee_id = 
     new Integer(request.getParameter("empid"));
    empsbean.deleteEmployeeById(employee_id.intValue());
    
    
  4. コンポーネント・パレットからForwardをドラッグして、jsp:forwardタグをページに追加します。「Forwardの挿入」ダイアログ・ボックスで、 employees.jspと入力します。

  5. 作業内容を保存します。

  6. プロジェクトを実行して従業員を削除してみます。図5-8に、employees.jspから従業員レコードを削除するリンクを示します。

    図5-8    employees.jspから従業員を削除するためのリンク


    画像の説明

いずれかの従業員レコードのDeleteをクリックすると、その従業員レコードが削除されます。

例外処理

SQLExceptionオブジェクトのインスタンスを使用すると、データベース・アクセス・エラーやその他のエラーに関する情報を取得できます。それぞれのSQLExceptionインスタンスには、エラーを記述する文字列を含む様々な種類の情報が用意されています。この文字列はJava Exceptionメッセージとして使用され、getMessageメソッドで取得できます。

サンプル・アプリケーションでは、tryブロックとcatchブロックを使用します。これらは、例外を処理するJavaメカニズムです。Javaでは、メソッドが例外をスローした場合に、それを処理するメカニズムが必要です。一般的には、catchブロックで例外を捕捉して、例外発生時の一連のアクションを指定します。これは、単なるメッセージの表示のみの場合もあります。

データベース・アクセス・エラーが発生すると、各JDBCメソッドはSQLExceptionをスローします。そのため、このようなメソッドを実行するアプリケーションのメソッドにはすべて例外処理が必要です。

サンプル・アプリケーションのメソッドにはすべて例外処理のコードが含まれています。たとえば、データベースへの接続を取得するgetDBConnectionは、SQLExceptionをスローします。これは、次のようなgetAllEmployeesメソッドと同様です。

public ResultSet getAllEmployees() throws SQLException {
}

SQLExceptionsを捕捉して処理するコードのサンプルについては、DataHandler.javaクラスのauthenticateUserメソッドのコードを参照してください。この例では、tryブロックに、ユーザーを認証するために実行される作業のコードが含まれており、catchブロックに認証に失敗した場合の処理が含まれています。

次の項では、SQLExceptionsを捕捉して処理するコードをサンプル・アプリケーションに追加する方法について説明します。

Javaメソッドへの例外処理の追加

サンプル・アプリケーションのメソッドでSQL例外を処理するには、次の手順を実行します。

  1. メソッドがSQLExceptionをスローしていることを確認します。次にメソッドの例を示します。

    public ResultSet getAllEmployees() throws SQLException
    
    
  2. tryブロックとcatchブロックを使用して、SQLExceptionsを捕捉します。たとえば、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;
    }
    
    
  3. また別の例として、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を処理するメソッドの作成

サンプル・アプリケーションのコードの改良点として、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";
}

この機能をアプリケーションに追加するには、次の手順を実行します。

  1. DataHandler.javaで、logExceptionメソッドを追加します。

  2. tryブロックとcatchブロックを含むように各メソッドを編集します。

  3. 各メソッドのcatchブロックで、logExceptionメソッドを実行します。

  4. Stringの戻り値を持つメソッドの場合は、次のようにreturn文を記述して、メソッドが失敗したことを示すメッセージを返します。

    return "failure";
    

サンプル・アプリケーションのナビゲーション

web.xmlファイルは、Webアプリケーションのデプロイメント・ディスクリプタです。web.xmlファイルの1つのセクションを、アプリケーションの開始ページの定義に使用できます。次に例を示します。

<web-app>
...
  <welcome-file>
    myWelcomeFile.jsp
  </welcome-file>
...
</web-app>

web.xmlファイルにようこそページを定義しなかった場合、一般的には、indexという名前で拡張子に.html.htmまたは.jspを持つファイルが開始ページとして使用されます(存在する場合)。Jdeveloperで、アプリケーションのデフォルトの実行ターゲットにするページ、つまり、最初に表示されるアプリケーションのページを定義できます。ページは、プロジェクトのプロパティで定義します。

アプリケーションが起動して開始ページが表示された後、アプリケーション内のナビゲーションは次の方法を使用して実現されます。

アプリケーションの開始ページの作成

次の手順では、index.jspページを作成します。このページはアプリケーションのデフォルトの開始ページになります。ページには表示要素はいっさい含まれません。単に、ユーザーをアプリケーションのログイン・ページ(login.jsp)にフォワードします。これを行うには、jsp:forwardタグを使用します。jsp:forwardタグは、問合せおよびフォームを処理するJSPページで実行され、同じJSPページに再度フォワードするかまたは別のJSPページにフォワードします。

  1. 新しいJSPページを作成して、index.jspという名前を付けます。

  2. サンプル・アプリケーションでは、このページにテキストを追加しません。コンポーネント・パレットの「JSP」ページから、Forwardをドラッグして、jsp:forwardタグをページに含めます。

  3. フォワードタグの「Forwardの挿入」ダイアログ・ボックスで、login.jsp「ページ」として入力します。

これで、この新しいページをアプリケーションのデフォルト・ターゲットに指定できます。次の手順を実行します。

  1. アプリケーション・ナビゲータで、Viewプロジェクトを右クリックして、「プロジェクト・プロパティ」を選択します。

  2. 表示されたツリーで、「実行/デバッグ」を選択します。「実行/デバッグ」領域で「プロジェクト設定を使用」が選択されていることを確認し、「実行構成」領域で「デフォルト構成」が選択されていることを確認します。「編集」をクリックします。

  3. 「起動設定の編集」ダイアログ・ボックスで、「起動設定」を選択します。右側の「起動設定」領域で、「デフォルトの実行ターゲット」フィールドの横にある「参照」をクリックして、今作成した新しいindex.jspページを検索し、「OK」をクリックします。再度「OK」をクリックして、ダイアログ・ボックスを閉じます。

これで、Viewプロジェクトを右クリックし、ショートカット・メニューで「実行」を選択すると、アプリケーションを実行できます。アプリケーションを実行すると、アプリケーションのデフォルトの起動ターゲットとして設定されているindex.jspが実行されます。index.jspによって直接ログイン・ページ(login.jsp)にフォワードされ、このページがブラウザに表示されます。


戻る 次へ
Oracle
Copyright © 2007 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引