Top > MyPage
 

HSQLDBをとりあえず使う

ダウンロード

<URL:http://sourceforge.net/project/showfiles.php?group_id=23316>

から、最新1.8をダウンロード。

これを展開すると、hsqldbというディレクトリーが出来るが、これ全体はいらないのでとりあえず、どこかに置いておく。

jar等のコピー

コピーの前にディレクトリー作成

もしTomcatのインストールしたディレクトリーをCATALINA_HOMEとすると

  • CATALINA_HOME/webapps/struts-hello/WEB-INF/lib
  • CATALINA_HOME/webapps/struts-hello/WEB-INF/database

が存在しない場合は、これらのディレクトリーを作成してください。

コピー

次に、前項で解凍したもののうち

  • hsqldb/lib/hsqldb.jar → CATALINA_HOME/webapps/struts-hello/WEB-INF/lib
  • hsqldb/demo/runManagerSwing.bat → CATALINA_HOME/webapps/struts-hello/WEB-INF
  • hsqldb/demo/runServer.bat → CATALINA_HOME/webapps/struts-hello/WEB-INF/lib

バッチファイルの編集等

編集

上記でコピーしたバッチファイルを書き換えます。

  • runManagerSwing.bat
    cd WEB-INF\database
    java -Dsqlfile.charset=Windows-31J -classpath ..\lib\hsqldb.jar \
        org.hsqldb.util.DatabaseManagerSwing -driver org.hsqldb.jdbcDriver -url \
        jdbc:hsqldb:file:sanPai -user sa
    cd ..\..
    
  • runServer.bat
    cd WEB-INF\database
    java -Dsqlfile.charset=Windows-31J -classpath ../lib/hsqldb.jar \
        org.hsqldb.Server -port 9002 -database.0 file:sanPai
    cd ..\..
    

です。単に、databaseというディレクトリーに移って、

  • runManagerSwing.bat → GUIでSQL等を発行できるツール
  • runServer.bat → DBをサーバーモードで立ち上げる

ものです。

runManagerSwing.batがしっかり動くかどうかの確認

DOSプロンプトで、

cd CATALINA_HOME/webapps/struts-hello/WEB-INF runManagerSwing.bat

で、なにやら小さなWindowが立ち上がってくればOKです。

ここで、次の作業を行います。

tableの作成

以前のメールで告知した、3つのフィールドを作成します。

drop table users if exists;

create cached table users (
ID integer generated by default as identity (start with 1),
                           NAME varchar(100),
                           PASSWORD varchar(100),
                           EMAIL varchar(100),
                           primary key (ID)
                          );

を上にあるボックスにコピペして、「Execute SQLボタン」をクリック。

何も怒られなきゃ、OK。

サンプルデータを入れてみる

insert into users (NAME, PASSWORD, EMAIL) values \
    ('chikkun','kazukun','chikkun@chikkun.com');
insert into users (NAME, PASSWORD, EMAIL) values \
    ('坂井','kazukun','chikkun@chikkun.com');

とりあえず、上記のように2つのレコードをインサートしてみる。

上にあるボックスに上記2行をコピペして、「Execute SQLボタン」をクリック。

やはり、何も怒られなきゃOK。

select * from users;

で、先ほど入れたレコードがselectされているならばOK。

checkpoint

これはHSQLDB特有なものですが、メモリー上のデータをファイルに書き出すにはこの「checkpoint」を行う必要があります(そうしなくてもデータが消えるわけじゃなく、ヒストリーあたりからHSQLDBはしっかりデータを保持できるみたいですが、一応念のため)。メニューの

Command → CHECKPOINT

をクリックするとOKです。

終了して、確認

File → Exit

で終了してください。databaseディレクトリーになにやら沢山ファイルが出来ていると思います。

再度

runManagerSwing.bat

を実行して

select * from users;

を打ち込み、Execute SQLをクリックして、やはり、2行レコードがselectされていれば間違いないでしょう。

strutsでこのDBにアクセスするには

さて、ようやくJavaのサーブレット(実際にはstrutsのAction)からDBにアクセスします。

runServer.batを実行

このバッチを実行すれば、DBの用意はOKです。

このバッチの実行を忘れて、Tomcatを実行しても、helloWorldアプリケーションが立ち上がりません---これで1時間も無駄にしてしまった---やれやれ

また、終わりにするにはctrl-cを打ち込めば終わりになりますが、Windowsのバッチの場合、バッチを終了させるかどうかを聞いてきますが、その場合はNを押してください。

DBCPのダウンロードとデプロイ

<URL:http://commons.apache.org/dbcp/downloads.html>

に言って、アーカイブをダウンロード(version 1.2.2)。解凍し、commons-dbcp-1.2.2.jarCATALINA_HOME/webapps/struts-hello/WEB-INF/libにコピーしておきます。

struts-config.xmlの修正

一番上の方にある

<struts-config>

の下すぐに

<data-sources>
  <data-source type="org.apache.commons.dbcp.BasicDataSource">
<set-property value="org.hsqldb.jdbcDriver" property="driverClassName"/>
<set-property value="jdbc:hsqldb:hsql://localhost:9002" property="url"/>
    <set-property value="sa" property="username"/>
    <set-property value="" property="password"/>
  </data-source>
</data-sources>

を加えます。これによりstrutsよりDBにアクセスする準備が出来ます。ちなみに

<set-property value="sa" property="username"/>
<set-property value="" property="password"/>

は、デフォルトの場合のユーザー名とパスワードで、何もしてなければこれでOKです。

Actionに書き込む

以前作成したHelloActionを次のように変更します。

package hello;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

/**
 * DB確認用アクション
 * 
 * @author chikkun
 * @version 1.0
 */
public class RegistUsersAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm actionForm,
            HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        RegistUsersActionForm form = (RegistUsersActionForm) actionForm;
        DataSource dataSource = getDataSource(request);
        ResultSet rs = null;
        List<String> results = new ArrayList<String>();
        try {
            Connection conn = dataSource.getConnection();
            PreparedStatement stmt = conn
                    .prepareStatement("select * from users");
            rs = stmt.executeQuery();
            while (rs.next()) {
                results.add(rs.getString(2));
            }
            form.setUsers(results);
        } catch (SQLException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
        return (mapping.findForward("success"));
    }
}

ただし上記の

RegistUsersActionForm form = (RegistUsersActionForm) actionForm;

form.setUsers(results);

があって、コンパイルできないはずです。当然ですね。ActionFormがないからです。

このアクションフォームを作成します。

ActionFormの作成

src/hello/RegistUsersActionForm.java

を作成し、

package hello;

import java.util.List;

import org.apache.struts.validator.ValidatorForm;

/**
 * 管理者登録のアクションフォーム
 * 
 * @author chikkun
 * @version 1.0
 */
public class RegistUsersActionForm extends ValidatorForm {

    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = 2309629575808108952L;

    private String name;

    private String email;

    private String password;

    private List users;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public List getUsers() {
        return users;
    }

    public void setUsers(List users) {
        this.users = users;
    }

}

をコピペします。

いずれ、登録のために、色々なフィールドを書いてありますが、今回必要なのはprivate List users;とこれのsetterとgetterだけです。

設定の書き込み(struts-config.xml)

現状は(以前もらったのは)

<?xml version="1.0" encoding="Windows-31J"?>
<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
          "http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>
  <form-beans>
  </form-beans>
  <global-exeptions>
  </global-exeptions>
  <global-forwards>
  </global-forwards>
  <action-mappings>
    <action path="/hello" type="hello.HelloAction">
      <forward name="success" path="/pages/helloworld.jsp"/>
  </action>
  </action-mappings>
  <controller/>
</struts-config>

でしたが、この

<form-beans>
</form-beans>

の間に

<form-beans>
<form-bean name="registUsersActionForm" \
    type="hello.RegistUsersActionForm"/>
</form-beans>

とし、

<action-mappings>
  <action path="/hello" type="hello.HelloAction">
    <forward name="success" path="/pages/helloworld.jsp"/>
</action>
</action-mappings>

<action-mappings>
<action name="registUsersActionForm" path="/hello" \
    type="hello.HelloAction">
    <forward name="success" path="/pages/helloworld.jsp"/>
</action>
</action-mappings>

とします(つまりアクションフォームを登録しているわけです)。

jspの変更

もともとは

<%@page pageEncoding="Windows-31J" contentType="text/html; \
    charset=Windows-31J" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-31J"/>
<title>課題(Struts)</title>
</head>
<body>
Hello, World!
<br>
<br>
<font color="#00BFFF" size="5">Hello, World!</font>
<br>
<br>
<font color="#32CD32" size="7">Hello, World!</font>
</body>
</html>

とあったのを

<%@page pageEncoding="Windows-31J" contentType="text/html; \
    charset=Windows-31J" %>
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-31J"/>
<title>課題(Struts)</title>
</head>
<body>
Hello, World!
<br>
<br>
<font color="#00BFFF" size="5">Hello, World!</font>
<br>
<br>
<font color="#32CD32" size="7">Hello, World!</font>

<logic:iterate id="user" name="registUsersActionForm" property="users" \
    indexId="idx">
<bean:write name="idx" />人目:<bean:write name="user"/>
<br/>
</logic:iterate>

</body>
</html>

web.xmlに追加

</servlet-mapping>

のすぐ後あたりに、

<taglib>
  <taglib-uri>/tags/struts-bean</taglib-uri>
  <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib>
  <taglib-uri>/tags/struts-html</taglib-uri>
  <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
<taglib>
  <taglib-uri>/tags/struts-logic</taglib-uri>
  <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>

を書き込みます。

strutsのtldの追加

strutsのアーカイブにある、

  • struts-logic.tld
  • struts-html.tld
  • struts-bean.tld

をWEB-INF以下にコピーします。

確認

runServer.batを実行されていることを確認したら、Tomcat君を立ち上げて

http://localhost:8080/struts-hello/action/hello

を実行して、

0人目:chikkun
1人目:坂井 

が見られたら、成功です

過不足無く書けたかどうか不安ですが、分からないことがあったら、ご連絡ください。可能な限り対応します。