Struts2.3+S2JDBCのセットアップからDBアクセス(ORACLE)まで - DBアクセス編
Struts2.3+S2JDBCのセットアップからDBアクセス(ORACLE)までの方法です。
以前「Struts2.3+S2JDBCのセットアップからDBアクセス(ORACLE)まで – アップデート編」のページでは、Struts2.3 にアップデートし、動作するところまで確認しました。
今回は S2JDBCを使ってOracleにアクセスするところまで確認 したいと思います。
目次
Oracle のインストール
Oracle を利用しますので、インストールする必要があります。「Oracle 11gをWindowsにインストールする方法」のページを参考に、Oracle をインストールしましょう。
Oracle IDが必要です。お持ちでない方はこの機会に登録しておきましょう。
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 を追加します。
ビルド・パスに追加されたら 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 を追加します。
s2jdbc-gen-build(Ant)の実行
データベースの環境が出来上がったところで、s2jdbc-gen-build(Ant)を実行します。プロジェクト直下の s2jdbc-gen-build.xml を右クリックして、[実行] - [外部ツールの構成] を選択してください。
新規ボタンを押下します。
Ant ビルドの中に、struts2-s2jdbc s2jdbc-gen-build.xml が出来上がります。[ターゲット]タブを選択し、gen-entity にチェックを入れ、gen-ddl(デフォルト) のチェックを外します。
下の実行ボタンを押下すると、Ant が実行されます。コンソールにログが次々と出てきますが、BUILD SUCCESSFUL と出れば成功です。entity パッケージと 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」にアクセスしてみましょう。
まずは、何も入力せずに Login ボタンを押下してみましょう。
おお、予定どおりエラーメッセージが表示されましたね。
では、UserId:00001、Password:password1を入力してみましょう。
おおお、メインページに遷移して名称が表示されましたね。
まとめ
S2JDBC を使えばデータベースのアクセスがサクサクできます。一度「流れるようなインターフェース」に慣れると、簡単な SQL を記述するのが面倒になりますね^^
とはいえ、実務では厄介な SQL を作成しなければならないケースもあります。その時は、無理して「流れるようなインターフェース」を使わずに、SQL 文を書いた方がよいと思います。
S2JDBC には、外部 SQL ファイルの読み込みも可能です。
次回は、Flex4 との連携を予定しています。
おつかれさまでした。