情報をかき集めてメモるWebアプリです。
Jetty開発環境のRI(Reference Implementation:参照実装)も兼ねます。
Jetty+Wicket+JPAでWebアプリを作りHeroku上で動作させるためのテンプレートプロジェクトです。
もちろん、Heroku上でなくても動作します。
このプロジェクトは
導入に手間がかからない
ことを第一に考えて構成しています。
Javaで依存ライブラリをダウンロードしてくれるツール。
http://maven.apache.org
最新版をダウンロードして解凍したら、binフォルダにPATHを通せばインストールは完成。
http://www.postgresql.jp/download
必須ではないが、あった方がいいでしょう。
http://www.eclipse.org/downloads/
このプロジェクトの次のURLからダウンロード出来ます。
https://github.com/jabaraster/heroku-web-template/archive/master.zip
このプロジェクトはpostgresというDBに接続します。 通常このDBはPostgreSQLをインストールしたときにデフォルトでインストールされます。 ですので、PostgreSQLを起動しさえすれば準備完了です。
eclipseからMavenのリポジトリを参照可能にするために、次のコマンドを実行します。
mvn -Declipse.workspace=<eclipseの.metadataのあるフォルダへのパス> eclipse:add-maven-repo
eclipseプロジェクトが依存するJARをダウンロードするために、次のコマンドを実行します。
mvn eclipse:eclipse
初めて実行するときはたくさんのJARがダウンロードされるので、かなり時間がかかります。
依存JARの情報は、Mavenの設定ファイルであるpom.xmlに書かれています。 また、実はこのコマンドは依存JARをダウンロードするためのコマンドではなく、pom.xmlの設定に従ってeclipseプロジェクトを構成するためのコマンドです。 pom.xmlファイルを編集した場合、再度このコマンドを実行してeclipseプロジェクトに反映する必要があります。
先にダウンロードしたeclipseプロジェクトZIPを解凍し、eclipseにインポートします。
これでWebアプリを実行する準備が整いました。
このクラスを実行すると、次のURLでWebアプリにアクセス出来ます。 http://localhost:8081/ui/
Mavenの設定ファイルであるpom.xmlに、最低限の設定を記述済みです。
デフォルトでは、JPAが起動するときに既存テーブルをDROPしてから再作成するようになっています。
この挙動は、環境変数HIBERNATE_HBM2DDL_AUTO
を設定することで上書きできます。
Linux系であれば
export HIBERNATE_HBM2DDL_AUTO=none
Winows系であれば
set HIBERNATE_HBM2DDL_AUTO=none
と設定します。
@com.google.inject.Inject
を付けることにより、オブジェクトが自動的に注入されます。
次のようなメソッドには自動でトランザクション制御が仕込まれます。
- メソッドを持っているクラスが、
jabara.jpa_guice.DaoBase
クラスを継承している public
メソッド
このようなメソッドはトランザクション制御対象メソッドです。 トランザクション制御対象メソッドに対しては、メソッド実行直前にトランザクションが開始され、メソッドから例外がスローされた場合は自動でロールバックされます。 例外が発生せず、普通にメソッドから復帰した場合は自動でコミットされます。
トランザクション制御対象メソッドの中から別のトランザクション制御対象メソッドを呼び出した場合、トランザクションが入れ子になることはなく、同じトランザクションの中で実行されます。
Memcachedを使うとWebアプリケーションのプロセスが複数ある場合にセッションを共有することが可能になります。
このファイルはWebアプリケーションをHeroku上で動作させるための起動コマンドが書かれています。
web: java -cp src/main/webapp/WEB-INF/classes:target/dependency/* -XX:+UseCompressedOops -Dweb.port=${PORT} -Ddatabase.url=${DATABASE_URL} -Dwicket.configuration=deployment -Dmemcached.servers=${MEMCACHIER_SERVERS} -Dmemcached.username=${MEMCACHIER_USERNAME} -Dmemcached.password=${MEMCACHIER_PASSWORD} -server SampleWebStarter
この起動コマンドの意味は次の通りです。
- Webアプリケーションを起動します。
- リッスンポートはHerokuが設定する環境変数
PORT
の値を使います。 - データベースはHerokuがデフォルトで提供するものを使います。つまりHerokuが設定する環境変数
DATABASE_URL
の値を接続先として使います。 - Wicketを
deployment
モードで起動します。 - Memcachedによるセッション管理を行います。Herokuのアドオン
MemCachier
が追加されている前提です。Memcachedに関する設定は、MemCachier
が設定する各種環境変数の値を使います。 - JVMをserverモードで起動します。
推奨パッケージ構成を説明します。 ルートパッケージを<root_package>と表記します。
パッケージ | 配置するクラスの分類 |
---|---|
<root_package>.web | ServletAPIに近いクラス。WebInitializerクラスもここに置く |
<root_package>.web.rest | JAX-RSに関するクラス |
<root_package>.web.ui | 画面を構成するクラス。Wicketの場合は各種Pageクラス。Pageクラスが多い場合はweb.ui.pageパッケージを切って、そこにまとめた方が見通しが良くなります |
<root_package>.web.ui.component | 画面を構成する部品。Wicketの場合はPanelなどのUI部品 |
パッケージ | 配置するクラスの分類 |
---|---|
<root_package>.entity | エンティティクラス(データベースモデルをJavaクラスに写したクラス)を置く |
<root_package>.model | エンティティクラスよりも高級なデータモデルを置く |
<root_package>.service | ビジネスロジックのインターフェイスを置く。業務的な例外クラスもここに置く |
<root_package>.service.impl | ビジネスロジックの実装クラスを置く |
パッケージ | 配置するクラスの分類 |
---|---|
<root_package> | グローバル設定値を置く。環境変数など。ただし、ここに属するクラス/変数などは最小限になるように注意するべき |
<root_package>.util | Serviceにするほどでないロジックを置く。例えば日付の表現形式を統一するためのユーティリティメソッドなど |
いくつかある大事なクラスの中でも、このクラスが飛び抜けて大事です。
このクラスはjavax.servlet.ServletContextListener
インターフェイスをimplementsしています。これにより、Webアプリケーション起動時にこのクラスのcontextInitialized
メソッドがただ一度だけ呼び出されるようになります。
また、ServletAPI3.0になってから、ServletContextを通してコードからServletやFilterを登録することが出来るようになりました。
つまりcontextInitialized
メソッドの中でこの機能を利用すれば、web.xmlに頼らずにServletやFilterを登録することが出来るようになるわけです。
web.xmlに頼らずJavaコードでServletやFilterを登録する利点は、__型安全性__です。web.xmlはクラス名を誤って記述してしまっても、Servletコンテナを起動するまでは気付けません。しかしJavaコードで登録する場合、工夫次第でクラス名を謝るなどということは起こらないようにすることが出来ます。
ただし、場合によってはweb.xmlを編集する必要が生じることに注意が必要です。例えばファイルの拡張子とMIMEタイプのマッピングは、web.xmlでないと登録できません。
JAX-RSを使うために必要です。javax.ws.rs.core.Application
クラスを継承します。
このクラスの主な役割は
- リソースクラスの登録
- 各種拡張クラスの登録
です。
なお、SampleRestApplication
クラスをWebアプリケーションから使えるようにするには、前述のSampleWebInitializer
クラスの中でSampleRestApplication
クラスを登録する必要があります。
Wicketを使うためのクラスです。 Wicketの詳しい説明は別項に譲りますが、日本語の情報は多いですし、メーリングリストも充実しているので手詰まりになることはまずありません。
なおSampleWicketApplication
クラスをWebアプリケーションから使えるようにするには、前述のSampleWebInitializer
クラスの中でSampleWicketApplication
クラスを登録する必要があります。
このプロジェクトはMaven2というパッケージ管理システムの利用を前提に設定されています。 http://maven.apache.org
Maven2の唯一の設定ファイルがpom.xml
です。
pom.xml
にはプロジェクトが依存するライブラリやプロジェクトのディレクトリ構成が書かれています。
このファイルは、このプロジェクトをHerokuにデプロイする際に必要となるファイルです。HerokuというのはPaaS環境です。 http://www.heroku.com
Herokuを使わない場合はこのファイルは無視して下さい。
ソースをGitで管理する場合に、管理対象外とするファイルのパターンを書くファイルです。 Gitを使わない場合はこのファイルは無視して下さい。
WARを作成して、それがGlassfish上で動作するかどうかの検証を行う必要があります。
これは困る。