Struts2.3+S2JDBCのセットアップからDBアクセス(ORACLE)まで - DBアクセス編
Struts2.3+S2JDBCのセットアップからDBアクセス(ORACLE)までの方法です。
以前「Struts2.3+S2JDBCのセットアップからDBアクセス(ORACLE)まで – アップデート編」のページでは、Struts2.3 にアップデートし、動作するところまで確認しました。
今回は S2JDBCを使ってOracleにアクセスするところまで確認 したいと思います。
Sponsored Links
目次
Oracle のインストール
Oracle を利用しますので、インストールする必要があります。「Oracle 11gをWindowsにインストールする方法」のページを参考に、Oracle をインストールしましょう。
Oracle IDが必要です。お持ちでない方はこの機会に登録しておきましょう。
Sponsored Links
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とパスワードを設定します。
Sponsored Links
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 ) /
Sponsored Links
データ投入
何件かデータを入れておきましょう。
以下の 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 との連携を予定しています。
おつかれさまでした。
Sponsored Links