簡単なサンプルを使用してWisdomの仕組み、設定方法をご説明します。
Wisdomは一般的なWebアプリケーションと同じくMVCパターンで動作します。
パラメータの値と呼び出すコマンドクラスの設定は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>
サーブレットの設定。
<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.contentype value='text/html;charset=UTF-8' /> </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経由で接続できるデータベースであれば拡張クラスを一つ作成することで接続可能にすることができます。
データベース接続を行うサンプルを実行する場合は適宜変更してください。
パラメータと呼び出すコマンドクラスの設定情報です。
<?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>
実行環境でwisdom_config.xmlの場所を指定するファイルです。
config.file.path=c:eclipse/wisdom/wisdom/WebContent/WEB-INF
サンプルを実行するときのwisdom_config.xmlが配置されているWEB-INFのパスを指定します。
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 language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="false" session="false"%> <%@ 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クラスを応用してデータベースへの接続、トランザクション処理を行うサンプルです。サンプルでは、パラメータ 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と同じ設定がされたデータベース接続を取得します
を使って取得します。
HelloWorldクラスを応用してデータベースへの接続、トランザクション処理を行うサンプルです。サンプルでは、パラメータ idに指定された値を 使用してテーブルUSERに対してSELECT文を発行してユーザーが登録されているか画面に表示を行います。
コード) sayhellofromtable.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="false" session="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)メソッドで取得することができます。
コマンドクラスはバッチ形式(Javaアプリケーションと動く)も作成することができます。 バッチ型のコマンドクラスは単体でJVM上で動かすことや、wisdom_config.xmlに設定することでWebアプリケーションの始動時に動かすことも可能です。 このクラスはWebのコマンドクラス同様、トランザクション管理やログ出力などを使用することができます。
コード) HelloBatchWorld.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()を使用することで同じように 取得されます。トランザクション管理も同様に処理がされるので、例外処理は不要です。