入門
簡単なサンプルを使用してwisdomの仕組み、設定方法をご説明します。
MVCパターン
wisdomは一般的なWebアプリケーションと同じくMVCパターンで動作します。
- M-モデル
一覧表示用、照会、更新、保管および画面表示に使用する基本クラスがあり、
通常はこれらのクラスを継承したり、利用して実装を行います。
- V-ビュー
wisdomではJSPを指します。
- C-コントローラー
wisdomでは「コマンド」クラスを呼び出すことによって制御します。
wisdomでのMVC基本動作
図) wisdomの基本動作イメージ
- クライアントから来たリクエストのパラメータの値によりwisdomのサーブレットが
要求されたコマンドクラスを呼び出します。
- コマンドクラスは適宜必要なビジネスロジッククラスを呼び出します。
- ビジネスロジッククラスは主に入力チェック、オブジェクトのデータベースへの保管処理などを
行います。
- コマンドクラスはアプリケーションの結果に沿ったJSPへ結果を転送します。
- JSP上でHTMLを生成してクライアントへ戻します。
パラメータの値と呼び出すコマンドクラスの設定はxmlにて定義を行います。
必要なファイル
インストールを行うために必要なファイルです。
- wisdom.jar
wisdom本体。/WEB-INF/libに置いてください。
- xalan-2.4.1.jar
wisdom本体で使用されているxml解析のライブラリー。/WEB-INF/libに置いてください。
- runtime-command.xml
パラメータと呼び出すコマンドクラスの設定情報です。/WEB-INF/libに置いてください。
- wisdom_config.xml
サーブレット、データベース情報、ログ出力情報を設定するためのファイルです。配置場所は任意です。
- config_path_ja_JP.properties
実行環境でwisdom_config.xmlの場所を指定するファイルです。
パラメータの値と呼び出すコマンドクラスの設定はxmlにて定義を行います。
web.xml
コマンド呼び出しをおこなうwisdom.core.runtime.RunTimeServletというサーブレットが動くようにweb.xmlに設定します。
<servlet-name>RunTimeServlet</servlet-name>
<servlet-class>wisdom.core.runtime.RunTimeServlet</servlet-class>
<load-on-startup>-1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>RunTimeServlet</servlet-name>
<url-pattern>/jp</url-pattern>
</servlet-mapping>
wisdom_config.xml
サーブレットの設定
<servletRuntimeConfig className='wisdom.core.runtime.RunTimeServlet' enablesSession="true">
<authenticate required="false" authType="form" authClass="*NONE"/>
<allowedMethods post="true" get="true"/>
<reqidName name="cid"/>
<commandFileName name="runtime-command.xml"/>
<exception className='ProhibitMethodExceoption' page='error.jsp'/>
<exception className='wisdom.core.runtime.ReqidNotFoundException' page='/login.jsp'/>
<exception className='wisdom.core.runtime.AuthenticateException' page='/login.jsp'/>
<exception className='wisdom.core.session.SessionTimeOutedException' page='/login.jsp'/>
<response.header name="Pragma" value='No-cache' />
<response.header name="Expires" value='0' />
<response.header name="Cache-Control" value='no-cache' />
<response.contentype value='text/html;charset=Windows-31J' />
</servletRuntimeConfig>
サーブレットの設定は変更することができますが、ここではデフォルトを使用します。
データベース接続の設定
<datasource id='wisdomdb' default='true'>
<parameter id='db.dsname' value='*NONE'/>
<parameter id='db.user' value='postgres'/>
<parameter id='db.password' value='postgres'/>
<parameter id='db.name' value='//localhost:5432/WISDOMDB'/>
<parameter id='db.ds.class' value='wisdom.core.datasource.NativePostgre'/>
<parameter id='sql.stmt.auto.close' value='true'/>
<parameter id='sql.stmt.trace' value='true'/>
</datasource>
サンプルではPostgreSQLを使用していますが、現在はDB2,Oracleに対応しています。
JDBC経由で接続できるデータベースであれば拡張クラスを一つ作成することで接続可能にすることができます。
データベース接続を行うサンプルを実行する場合は適宜変更してください。
runtime-command.xml
パラメータと呼び出すコマンドクラスの設定情報です。
<?xml version='1.0' encoding='Shift_JIS'?>
<commands>
<reqid id='hello' command='tutorial.HelloWorld' desc='ハローワールド'></reqid>
<reqid id='hello2' command='tutorial.SayHelloFromTable' desc='データベースからハローワールド'></reqid>
</commands>
config_path_ja_JP.properties
実行環境でwisdom_config.xmlの場所を指定するファイルです。
config.file.path=c:eclipse/wisdom/wisdom/WebContent/WEB-INF
サンプルを実行するときのwisdom_config.xmlが配置されているWEB-INFのパスを指定します。
HelloWorld
HelloWorldを使用した単純なコマンドの設定、呼び出し、JSPへの転送、JSPでのコーディングサンプルです。
コード) HelloWorld.java
package tutorial;
import wisdom.core.application.AbstractRequestCommand;
public class HelloWorld extends AbstractRequestCommand {
protected void _execute() throws Exception {
setPage ("/tutorial/helloworld.jsp" );
}
}
コード) helloworld.jsp
<%@ page session="false" isThreadSafe="true" isErrorPage="false" %>
<%@ page contentType="text/html;charset=Shift_JIS" pageEncoding="Shift_JIS" autoFlush="true"%>
<%@ page import="wisdom.core.application.*" %>
<%
IRequestParser rp = RuntimeContext.getRequestParser(request);
%>
<HTML>
<HEAD><TITLE>Hello World</TITLE></HEAD>
<BODY>
<form method="get" action="/wisdom/jp">
<h1>Hello World</h1>
<input name="hoge" value="<%= rp.getString("hoge","") %>">
<input type="submit" value="送信" >
<input type="hidden" name="cid" value="hello">
</form>
</BODY>
</HTML>
}
HelloWorldの稼動確認を行うには
http://localhost:8080/wisdom/jp?cid=hello
というURLを入力することで確認ができます。
パラメータ引数cidの値によりコマンドクラスのサブクラスであるHelloWorldクラスが呼び出され、setPage(String)メソッドに
より遷移先JSPを設定しています。JSPでは
IRequestParser rp = RuntimeContext.getRequestParser(request);
というメソッドを使用してリクエストにアクセスするためのIRequestParserのインスタンスを取得します。
コマンドクラスの作り方
wisdomではAbstractRequestCommandを継承すればコマンドクラスとして動かすことができます。
以下の抽象メソッドを実装します。
protected void _execute() throws Exception
転送するJSPを以下のメソッドで指定します。
setPage(String)
コマンドクラスの作成ルールは以上です。
データベースへ接続してHelloWorld
HelloWorldクラスを応用してデータベースへの接続、トランザクション処理を行うサンプルです。サンプルでは、パラメータ idに指定された値を
使用してテーブルUSERに対してSELECT文を発行してユーザーが登録されているか画面に表示を行います。
コード) SayHelloFromTable.java
package tutorial;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import wisdom.core.application.AbstractRequestCommand;
public class SayHelloFromTable extends AbstractRequestCommand {
String message = null;
public void _execute() throws Exception {
debug(rp.getString("id"));
PreparedStatement ps = rh.getConnection().prepareStatement("SELECT NAME FROM USER WHERE USERID = ?");
ps.setString(1, rp.getString("id"));
ResultSet rs = ps.executeQuery();
if (rs.next()) message = "Hello " + rs.getString(1);
else message = "Hello " + rp.getString("id") + " your are not in the table";
rs.close();
ps.close();
rh.setAttribute("message", message);
setPage ( "tutorial/sayhellofromtable.jsp" );
}
}
コマンドクラスはIRequestHandlerクラスのインスタンスをrhという変数で保持しています。
IRequestHandlerはデータベースへの接続、セッション情報へアクセスなどアプリケーションに必要なオブジェクトとの橋渡しをするクラスです。
データベースへの接続は
IRequestHandler#getConnection()
※wisdom_config.xml上のdefault='true'と設定されたデータベース接続を取得します
または
IRequestHandler#getConnection(String)
※wisdom_config.xml上のdatasourceのidと同じ設定がされたデータベース接続を取得します
を使って取得します。
コード) sayhellofromtable.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ page session="false" isThreadSafe="true" isErrorPage="false" %>
<%@ page import="wisdom.core.application.*" %>
<%
IRequestParser rp = RuntimeContext.getRequestParser(request);
String message = (String)rp.getAttribute("message");
%>
<HTML>
<HEAD>
<TITLE>SayHelloFromTable</TITLE>
</HEAD>
<BODY>
<P><%= message %></P>
</BODY>
</HTML>
コマンドクラスで実行された rh.setAttribute("message", message) メソッドはHttpServletRequest#setAttribute(String,Object)を呼び出します。
JSPではIRequestParserオブジェクトを通して、Object HttpServletRequest#getAttribute(String)メソッドで取得することができます。
データベースへの接続はrh.getConnection()。例外処理は要りません。
データベースへの接続はIRequestHandler#rh.getConnection()を使用して行います。wisdom_config.xmlが正しく設定してあれば以上で完了します。
取得されたコネクションはコマンドクラス終了時に自動でコミット処理が行われ、実行時に例外が発生した場合にはwisdomがロールバック、コミットを行います。
バッチでHelloWorld
コマンドクラスはバッチ形式(Javaアプリケーションと動く)も作成することができます。
バッチ型のコマンドクラスは単体でJVM上で動かすことや、wisdom_config.xmlに設定することでWebアプリケーションの始動時に動かすことも可能です。
このクラスはWebのコマンドクラス同様、トランザクション管理やログ出力などを使用することができます。
コード) HelloWorld.java
package tutorial;
import wisdom.core.application.AbstractBatchCommand;
public class HelloBatchWorld extends AbstractBatchCommand {
public void _execute() throws Exception {
System.err.println("hello world");
}
public static void main(String[] args) throws Exception {
AbstractBatchCommand c = new HelloBatchWorld();
c.execute();
}
}
単体で動かす必要がある場合はmainメソッドを実装します。サーバー始動時にサーブレットコンテナ上で動かす場合は_execute()メソッドが呼び出されます。
バッチ型コマンドクラスの作り方
wisdomではAbstractBatchCommandを継承すればバッチ型コマンドクラスとして動かすことができます。
以下の抽象メソッドを実装します。
protected void _execute() throws Exception
バッチ型コマンドクラスの作成ルールは以上です。
コネクションの取得は通常のバッチコマンドがIRequestHandler#getConnection()をしたように、IHandler#getConnection()を使用することで同じように
取得されます。トランザクション管理も同様に処理がされるので、例外処理は不要です。