Struts2.3+S2JDBCのセットアップからDBアクセス(ORACLE)まで - DBアクセス編

Struts2.3+S2JDBCのセットアップからDBアクセス(ORACLE)までの方法です。

Struts2プロジェクト

以前「Struts2.3+S2JDBCのセットアップからDBアクセス(ORACLE)まで – アップデート編」のページでは、Struts2.3 にアップデートし、動作するところまで確認しました。

今回は S2JDBCを使ってOracleにアクセスするところまで確認 したいと思います。


Oracle のインストール

jdbcドライバ(ojdbc6.jar)のダウンロード

Oracle にアクセスすることが目的ですので、Oracle が提供している jdbc ドライバをダウンロードします。

Oracle Database 11g Release 2 JDBC Driver Downloads

Oracle IDが必要です。お持ちでない方はこの機会に登録しておきましょう。

Accept License Agreement にチェックを入れ、 ojdbc6.jar をダウンロードします。

ダウンロードしたら、 strtus2-s2jdbc 内、「src」-「main」-「webapp」-「WEB-INF」-「lib」の中にコピーします。コピーしたら、プロジェクトを選択して、プロパティを開きます。「Java のビルド・パス」を選択し、JARの追加から、ojdbc6.jar を追加します。

ojdbc6.jar ビルドパス追加

ビルド・パスに追加されたら OK を押下して画面を閉じます。

jdbc.dicon の設定

データベースへの接続先情報を記述する jdbc.dicon を編集します。様々なデータベースにアクセスできるよう、サンプルが書かれていますが、今回は Oracle にアクセスすることが目的なので、不要なものは削除します。

以下のように書き換えてください。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
  "http://www.seasar.org/dtd/components24.dtd">
<components namespace="jdbc">
  <include path="jta.dicon"/>

  <!-- for Oracle -->
  <component name="xaDataSource"
    class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
    <property name="driverClassName">
      "oracle.jdbc.driver.OracleDriver"
    </property>
    <property name="URL">
      "jdbc:oracle:thin:@127.0.0.1:1521:orcl"
    </property>
    <property name="user">"SAKAEN"</property>
    <property name="password">"pass1234word"</property>
  </component>

  <component name="connectionPool"
    class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
    <property name="timeout">600</property>
    <property name="maxPoolSize">50</property>
    <property name="allowLocalTx">true</property>
    <destroyMethod name="close"/>
  </component>

  <component name="DataSource"
    class="org.seasar.extension.dbcp.impl.DataSourceImpl"
  />
</components>

IPアドレス:ポート番号:SIDと設定

"jdbc:oracle:thin:@127.0.0.1:1521:orcl"

@以降、IPアドレス:ポート番号:SIDと設定をします。

ユーザーIDとパスワードを設定

<property name="user">"SAKAEN"</property>
<property name="password">"pass1234word"</property>

ユーザーIDとパスワードを設定します。

s2jdbc.dicon の設定

ORACLE を利用しますので dialect は、oracleDialect を利用し、他は削除します。

以下のように書き換えてください。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
  "http://www.seasar.org/dtd/components24.dtd">
<components>
  <include path="jdbc.dicon"/>
  <include path="s2jdbc-internal.dicon"/>
  <component name="jdbcManager" class="org.seasar.extension.jdbc.manager.JdbcManagerImpl">
    <property name="maxRows">0</property>
    <property name="fetchSize">0</property>
    <property name="queryTimeout">0</property>
    <property name="dialect">oracleDialect</property>
  </component>
</components>

テーブルを作る

ORACLE PL/SQL の CREATE TABLE コマンドを使って、テーブルを作ります。

以下の コマンド を実行します。

CREATE TABLE EMPLOYEE
(
    EMPLOYEE_CODE                  NVARCHAR2(5) NOT NULL,
    EMPLOYEE_NAME                  NVARCHAR2(50) NOT NULL,
    PASSWORD                       NVARCHAR2(50) NOT NULL,
    OFFICIAL_POSITION              NVARCHAR2(50) NOT NULL,
    EMAIL_ADDRESS                  NVARCHAR2(255) NOT NULL,
    SALARY                         NUMBER(18,2) NOT NULL,
    CONSTRAINT PK_EMPLOYEE PRIMARY KEY (EMPLOYEE_CODE) USING INDEX
)
/

データ投入

何件かデータを入れておきましょう。

以下の INSERT コマンド を実行します。

INSERT INTO EMPLOYEE values('00001','墨田 太郎','password1','Chief Executive Officer','taro.sumida@saka-en.com','150000000');
INSERT INTO EMPLOYEE values('00002','墨田 次郎','password2','Chief Operating Officer','jiro.sumida@saka-en.com','100000000');
INSERT INTO EMPLOYEE values('00003','墨田 三郎','password3','Chief Technology Officer','saburo.sumida@saka-en.com','50000000');
INSERT INTO EMPLOYEE values('00004','墨田 四郎','password4','Chief Information Officer','shiro.sumida@saka-en.com','50000000');

んんー、すごいお給料ですね^^;

JUnit のダウンロード

JUnit をダウンロードします。

ダウンロードファイル一覧 - JUnit - SourceForge.JP

ここでは junit-4.10.jar をダウンロードします。

Junit をビルドパスに設定しておかないと、S2TestCase でコンパイルエラーが発生します。

ダウンロードしたら、 strtus2-s2jdbc 内、「src」-「main」-「webapp」-「WEB-INF」-「lib」の中にコピーします。コピーしたら、プロジェクトを選択して、プロパティを開きます。「Java のビルド・パス」を選択し、JARの追加から、junit-4.10.jar を追加します。

junit-4.10ビルドパス追加

s2jdbc-gen-build(Ant)の実行

データベースの環境が出来上がったところで、s2jdbc-gen-build(Ant)を実行します。プロジェクト直下の s2jdbc-gen-build.xml を右クリックして、[実行] - [外部ツールの構成] を選択してください。

s2jdbc-gen-build.xmlを右クリック

新規ボタンを押下します。

s2jdbc-gen-build.xml 新規

Ant ビルドの中に、struts2-s2jdbc s2jdbc-gen-build.xml が出来上がります。[ターゲット]タブを選択し、gen-entity にチェックを入れ、gen-ddl(デフォルト) のチェックを外します。

gen-entityを選択

下の実行ボタンを押下すると、Ant が実行されます。コンソールにログが次々と出てきますが、BUILD SUCCESSFUL と出れば成功です。entity パッケージと service パッケージの中にソースが自動生成されています。

自動生成されたentiyクラスとserviceクラス

EmployeeServiceへ追加

自動生成された EmployeeService にメソッドを追加します。

これは、認証用の SQL を実行するためのものです。

public Employee findByEmployeeCodeAndPassword(String employeeCode, String Password) {
    return select().where(
        new SimpleWhere()
        .eq("employeeCode", employeeCode)
        .eq("Password", Password)
        ).getSingleResult();
}

LoginActionの変更

これまでは、リテラル値でチェックしていましたが、データベースへアクセスし、認証をおこないます。認証が OK であれば、 EmployeeName をセッションに保存します。

package sakaen.action;

import java.util.Map;

import org.apache.struts2.config.Result;
import org.apache.struts2.dispatcher.ServletRedirectResult;
import org.apache.struts2.interceptor.SessionAware;

import sakaen.entity.Employee;
import sakaen.service.EmployeeService;

import com.opensymphony.xwork2.ActionSupport;

@Result(type = ServletRedirectResult.class, name="main", value = "main.action")
public class LoginAction extends ActionSupport implements SessionAware {

  public String userId;
  public String password;
  public String message;
  public Map<String, Object> sessionMap;
  public EmployeeService employeeService;  // 追加

  public String execute() throws Exception {
    this.sessionMap.put("userId", null);
    return "success";
  }

  public String login()  throws Exception {
    System.out.println("userId: " + this.userId);
    System.out.println("password: " + this.password);
    this.message = "";
    //if ( !"saka-en".equals(this.userId) ) {
    //  message = "UserId は saka-en と入力してください。";
    //  return "error";
    //}
    //if ( !"password".equals(this.password) ) {
    //  this.message += "Password は password と入力してください。";
    //  return "error";
    //}
    Employee employee = employeeService.findByEmployeeCodeAndPassword(this.userId, this.password);
    if ( employee == null ) {
      message = "UserId、Password が間違っています。";
      return "error";
    }
    this.sessionMap.put("userId", this.userId);
    this.sessionMap.put("employeeName", employee.employeeName);
    return "main";
  }

    public void setSession(Map<String, Object> sessionMap) {
        this.sessionMap = sessionMap;
    }

}

MainAction の変更

アップデート編では、UserId を表示するだけでしたが、今度は EmployeeName を表示してみましょう。LoginAction でセッションに保存した EmployeeName を取得します。

import java.util.Map;

import org.apache.struts2.config.Result;
import org.apache.struts2.dispatcher.ServletRedirectResult;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

@Result(type = ServletRedirectResult.class, name="main", value = "main.action")
public class MainAction  extends ActionSupport implements SessionAware {

  public String userId;
  public String employeeName;
  public Map<String, Object> sessionMap;

  public String execute() throws Exception {
    userId = (String)this.sessionMap.get("userId");
    employeeName = (String)this.sessionMap.get("employeeName");
    return "success";
  }
  public void setSession(Map<String, Object> sessionMap) {
        this.sessionMap = sessionMap;
    }
}

main.jspの変更

EmployeeName を表示するよう変更します。

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Welcome Struts2 ver 2.3.16</title>
</head>
<body>
  <div id="container">
    <div id="page-header">
      <h1>Welcome Struts2 <small>ver 2.3.16</small></h1>
    </div>
    <ul>
      <li>UserId: <s:property value="userId"  /></li>
      <li>EmployeeName: <s:property value="employeeName"  /></li>
    </ul>
  </div>
</body>

検証

それでは「http://localhost:8080/struts2-s2jdbc/index.action」にアクセスしてみましょう。

Struts2.3+S2JDBC ログインページ

まずは、何も入力せずに Login ボタンを押下してみましょう。

Struts2.3+S2JDBC ログイン認証エラー

おお、予定どおりエラーメッセージが表示されましたね。

では、UserId:00001、Password:password1を入力してみましょう。

Struts2.3+S2JDBC メインページ

おおお、メインページに遷移して名称が表示されましたね。

まとめ

S2JDBC を使えばデータベースのアクセスがサクサクできます。一度「流れるようなインターフェース」に慣れると、簡単な SQL を記述するのが面倒になりますね^^

とはいえ、実務では厄介な SQL を作成しなければならないケースもあります。その時は、無理して「流れるようなインターフェース」を使わずに、SQL 文を書いた方がよいと思います。

S2JDBC には、外部 SQL ファイルの読み込みも可能です。

次回は、Flex4 との連携を予定しています。

おつかれさまでした。

この記事がお役に立ちましたら シェア をお願いいたします。