Posts filed under ‘GlassFish’

旧 Sun 製品の入手先について

旧 Sun のソフトウェア製品の入手についてですが、一部サイトにてリンク切れ等が発生しており、製品を入手できない、もしくはダウンロードサイトまでたどり着けないという方がいらっしゃいます。
例えば、Oracle iPlanet Web Server を入手したい場合、別の製品のダウンロードページへ誘導され入手できないといった事例が発生しています。iPlanet Web Server 等を入手したい方は直接下記のサイトへアクセスして入手してください。下記 URL には旧 Sun 製品への入手先が記載されております。

http://www.oracle.com/technetwork/indexes/downloads/sun-az-index-095901.html

※ 上記 URL もいつ変更されるか分かりませんので、現時点 (2010年10月) でのご対応とご理解ください。

また、このサイトを確認し1点気付いたのですが、旧 Sun のアプリケーションサーバ製品の名前が全て、GlassFish Server に変わっており、バージョン番号の大小と、製品の新しさの目安に不整合が発生しておりました。

具体的には、バージョン番号だけを取り出すと、2.1, 3, 6.5, 7, 8.2, 9.1 と記載されてますが、これらのバージョン番号の大小と、製品の新しさは一致しないのでご注意ください。各製品に対して古いものから順に並び替えすと下記のようになります。

バージョン番号 旧製品名
6.5 (旧 NetScape Application Server [iPlanet] )
7.0 (旧 iPlanet Application Server [Sun One] Java EE 1.3 対応)
8.2 (旧 Sun One Application Server [Sun Java] Java EE 1.4 対応)
9.1 (旧 Sun Java System Application Server: Java EE 5 対応)
2.1 (旧 Sun GlassFish Enterprise Server Java EE 5 対応)
3.0 (旧 Sun GlassFish Enterprise Server Java EE6 対応)

2010年10月5日 at 6:03 午後

GlassFish v2.1.1 と GlassFish v3.0.1 の機能比較

GlassFish v2.1とGlassFish v3.0.1の機能比較(英語版)がこちらに記載されていますが、日本語で情報共有したいと思います。

GlassFish v 2.1.1 と v3.0.1 は共に本番環境で今すぐ利用可能なアプリケーションサーバです。またサポートが必要な場合、Oracle から正式サポートを受ける事ができます。
どちらの製品を選択するかは製品が持つ機能/仕様を元に検討して頂きたいのですが、仮に高可用性の機能が必要な場合は、Java EE 5 の仕様に完全準拠した GlassFish v2.1.1を選択してください。また Java EE 6 で開発を行いたい場合、たとえば、Web アプリケーションのかんたん開発(JSF2,Servlet3.0)、EJB 3.1、Webサービス(RESTful/Jersey)、jRuby, Grails, Jython 等のスクリプト言語を使用したい場合は、GlassFish v3.0.1 を選択して頂ければと思います。

また、GlassFish v3.0.1 はパブリッククラウド環境にも今すぐ適用可能で、実際にこれを使用して Amazon EC2 上でサービスを提供開始している企業もあります。下記をご参照ください。
GlassFish v3.0.1 と MySQL を利用し Amazon EC2 上でサービスを提供する事例(海外)

最後に、今年末に提供予定の GlassFish v3.1 では GlassFish v2.1.1 のように高可用性機能も提供される予定ですので、是非楽しみにしていてください。

機能比較 GlassFish
v 2.1.x
GlassFish
v 3.0.x
リリースされた日程 v 2.1.1 の リリースは 2009 年 10 月 v 3.0.1 のリリースは 2010 年 6 月
Oracleによる有償サポートの有無 有(●) 有(●)
マルチプラットフォームのサポート

例:OS
: Solaris, Oracle Enterprise Linux, RedHat Enterprise Linux, SLES,
Ubunts, Windows, MaxOS X, HP-UX, AIX, Oracle VM, Solaris Container

JVM : JRockit, HotSpot VM

v2.1.1で正式サポートされている環境のリストはこちら
supported
platforms
v3.0.xで正式サポートされている環境のリストはこちら

supported
platforms
サポートするJava EE のバージョン
Java EE 仕様への対応 Java EE 5 に準拠 Java EE 6に準拠
(Java EE 5 アプリケーションも動作可能
Web Application and Service Technologies
Java
Web Technologies
Servlet 2.5
JSP 2.1, JSF 1.2
Servlet 3.0
JSP 2.2, JSF 2.0
Metro
Web Services Stack
.NET 3.0
Web サービスとの相互運用
.NET 3.5
Web サービスとの相互運用
Jersey / JAX-RS (RESTful Web Services) JAX-RS 1.0 JAX-RS 1.1
管理関連
GUIの管理コンソールとCLIツールの提供 有(●) 有(●)
JMXによる管理 有(●) 有(●)
ノードエージェントとクラスタ管理機能 有(●) 無(X)
アップグレードツール
(更新ツール/updatecenter)
有 (●) 有(●)
RESTful 管理APIの提供 無(X) 有(●)
Java EE 6 Web Profile 版の提供 無(X) 有(●)
拡張モニタリング機能
(btrace, dtraceのサポート)
無(X) 有(●)
アプリケーションクライアント
アプリケーションクライアントコンテナの提供 有(●) 有(●)
Java WebStartのサポート 有(●) 有(●)
Enterprise Application Technologies
Java DB, JDBC Connection Pooling Java DB 10.4.2.1 Java DB 10.5.3.0
JTA 1.1/JTS 1.0 有(●) 有(●)
J2EE Connector Architecture Connectors
1.5
Connectors
1.6
Enterprise JavaBeans (EJB) EJB
3.0
EJB
3.1
JMS 1.1 有(●) 有(●)
Java Pertistence API (JPA) JPA 1.0
(TopLink)
JPA 2.0
(EclipseLink)
スクリプト言語対応
jRuby on Rails のWebアーカイブ(.war)の配備が可能 有(●) 有(●)
ネィティブ jRuby on Rails アプリケーションの配備
(Servlet コンテナ上の動作は不要)
無(X) 有(●)
jRuby のランタイムスレッドプールの動的リサイズ 無(X) 有(●)
Groovy/Grails のサポート 無(X) 有(●) [4]
Jython/Djangoの動作

(現在は v3.01で動作は可能だがOracleによるサポートは未サポート、将来正式サポート予定)

無(X) 有(●) [4]
開発ツール
NetBeans IDE 有(●)[6] 有(●)[6]
Eclipse IDE 有(●) 有(●)
高速再配備−アプリケーション再配備時のセッション情報の保持 無(X) 有(●)
アップデートセンター(更新ツール) 有(●) 有(●)
アップデートセンターの管理コンソールへの統合 無(X) 有(●)
Java EEアプリケーションの検証ツール

Appilcation Verification Kit (AVK)

有(●) 無(X)
IPSパッケージツール対応 無(X) 有(●)
Framework Technologies
Grizzly (Java NIO)の対応バージョン 1.0.34 1.9.18
Comet (HTTP Push)のサポート 有(●) 有(●)
CORBAのサポート 有(●) 有(●)
OSGiベースのモジュールアーキテクチャ 無(X) 有(●)
組み込み可能な GlassFish/EJB
コンテナのサポート
無(X) 有(●)
管理機能(GUI/CLI)の拡張性 無(X) 有(●)
システム/パフォーマンス
クラスタリング機能 有(●) 有(●)
mod_jk で可能
ロードバランサプラグインの提供 有(●) 無(X)
管理コンソールからのロードバランサプラグイン設定 有(●) 無(X)
高可用性 有(●) 無(X)
他技術の統合/連携
アィデンティティ管理製品、シングルサインオン製品(OpenSSO)、SOA製品(OpenESB)との連携/統合 有(●) 無(X)

2010年6月24日 at 2:41 午後

「GlassFish v3 で実感!! エンタープライズ Java の進化」資料公開

Java Hot Topic セミナーのプレゼン資料とデモを公開します。

今回の発表のポイントは、Java EE 6 になり開発が如何に楽になったか、アプリケーションサーバのインストールも起動も如何にかんたんで高速になったのかという点に集中して説明を致しました。原稿は合計 120ページ程ありますが、全てを発表したわけではなく、抜粋して説明しました。特に JPA 2.0 については日本でまだあまり資料がないので参考にして頂けるのではないかと思います。


「GlassFish v3 で実感!! エンタープライズ Java の進化」プレゼン資料 (PDFの入手)

Java EE 6 のかんたん開発デモビデオの入手

GlassFish v3 のかんたんインストールデモビデオの入手

2010年5月30日 at 8:33 午後

Java Hot Topic セミナー緊急開催決定

今日は Java の勉強会開催に関する緊急告知をいたします。

本セミナーの受付は大変好評につき締め切りました。
ご登録頂いた皆様、誠にありがとうございました。

キャンセル待ちの手順:


件名を「ホットトピックセミナー キャンセル待ち」として本文に
「お名前」「ご所属」をご記入の上、以下までご連絡ください。
Mail: hottopics-seminar-japan@sun.com
※ キャンセル待ちの受付については確認メールはお送りしません。
※ 空きが出ましたら、個別にメールをお送りします。キャンセル状況
のお問い合わせには対応できませんのでご注意ください。


来る 2010 年 5 月 29 日 (今週土曜日) に Java の Hot Topic セミナーを緊急開催する事にしました。今回の Java Hot Topic セミナーはご参加頂いた皆様に、もれなく何らかの Sun ノベルティグッズをプレゼントする予定です。
(例:GlassFish Tシャツ、Java リング、Duke マウス、Sun ノート、Sun 時計等先ほどまで色々と大量に見つけ出してきましたので、かならず何かお渡しできると思います。)
今週末の開催という事で直前のご案内となり誠に申しわけございませんが、どうぞスケジュールをご調整の上ご参加頂ければ幸いです。

発表内容の詳細は後ほど決まり次第ご連絡いたします。


開催概要■ 3時間で学ぶ Java Hot Topic 2010
■ 日程2010 年 5 月 29 日 (土)
13:00 開場、13:30 セミナー開始、16:30 頃終了予定
発表内容
1. クロージャあらため、Project Lambda
Java in the Box 主筆
櫻庭 祐一 氏
2.Scala 入門 (仮)
町田 修一 氏
3.GlassFish v3 で実感!!エンタープライズ Java の進化
GlassFish エバンジェリスト
寺田 佳央
4. NetBeans 最新情報
Java エバンジェリスト
片貝 正紀
■ 会場サン・マイクロシステムズ株式会社 用賀本社27階セミナールーム田園都市線用賀駅改札を出てすぐ右側がSBS ビルの入り口です。ビルと駅は地下でつながっています。エレベーターにて27階まで直接お越しください。
■ 費用無料(事前登録制)

■ 主催
サン・マイクロシステムズ株式会社
■ お申込み 
件名を「ホットトピックセミナー参加」として本文に「お名前」「ご所属」をご記入の上、以下までお申し込み下さい。Mail: hottopics-seminar-japan@sun.com


今回はできるだけ多くの方に参加していただきたいと考えておりますが、会場規模の都合上、定員になり次第締め切らせていただきます。
一度申し込みをした後仮に、スケジュールの都合上どうしても参加ができなくなった場合、他の方を繰り上げ当選にしたいと考えておりますので、大変恐れ入りますが欠席される際は上記アドレスまで欠席のご連絡を頂けないでしょうか。

最後に余談ではありますが、私にとって「 Sun 」のエンジニアとして最後の発表になるかと思います(会社を辞めるわけではありませんが)。Sun の Java エバンジェリストとして活動して来た数年間を思い出すと色々感慨深いものがありますが、今回は Sun/Java/GlassFish を応援してくださった皆様へ感謝とお礼を込めて開催したいと考えております。

ちなみに、日本では Oracle と正式統合が完了していない為、私の口から今後の Oracle 製品と既存 Sun 製品に関する話題については申し上げる事ができませんので、どうぞご了承ください。

2010年5月24日 at 3:41 午後

EJB 3.1 の新機能概要

EJB 3.1 の新機能をプレゼン形式でまとめてみました。
かんたんに概要を紹介します。

EJB 3.0 から EJB 3.1 になり、かんたん開発に向けて多くの改善が施されています。まず、パッケージの簡略化が挙げられます。今までアプリケーションの種類に応じて .ear, .war 等のアーカイブにまとめる必要がありましたが、EJB コンポーネントも .war に含めることができるようになったため開発時の手間が大幅に削減されます。また、EJB 3.1 Lite が提供されフル Java EE の機能の一部の機能だけを利用できるようになったため、フル Java EE の機能が必要ないお客様にとっては不要なメモリリソースを消費せずに運用できる等のメリットがあります。

次のポイントはローカルビジネスインタフェースの実装が必要なくなった点です。これは開発者の生産性が向上するだけではなく、修正の手間も大幅に削減してくれます。例えば、過去に実装したクラスにおいて、特定のメソッドに対する引数や返り値の変更が必要になった場合を想定してください。今まではインタフェースのメソッド定義と実装クラスのメソッド定義を両方変更しなければなりませんでしたが、インタフェースの定義が必要がなくなったため、実装クラスのメソッド定義を変更するだけでよくなります。

次に、移植可能な Global JNDI 名では、今までベンダー独自に実装していた Global の JNDI 名が仕様の中で標準化されましたので、今後アプリケーションを他のアプリケーションサーバへ移行したいような場合、Global JNDI 名を変更する必要がなくなり移植性が高まります。

また、Java SE に組み込み可能な EJB コンテナ は開発時におけるテストの手間を大幅に削減してくれるようになります。今までは EJB のアプリケーションをテストする際、アプリケーションサーバにデプロイして Global 経由でアクセスする等の必要がありました。これは別の Java VM のプロセスとして稼働するためデバッグ等も困難でしたが、EJB 3.1 では Java SE のプロセス内に EJB コンテナをロードして実行する事ができるようになるため、同一 Java プロセス内で処理ができる他、EJB の単体テスト等がしやすくなります。

その他の追加機能として、Singleton Session Beans が追加された事が挙げられます。これはアプリケーション間で同一の情報を扱いたい場合に有効です。今までは独自に Singleton のクラスを作成して運用しなければなりませんでしたが、クラスタ環境のように複数台で実現するためには苦労していたかと思います。なぜなら異なる JVM プロセスの間で Sigleton のインスタンスを共有させる事は面倒だったからです。しかしEJB 3.1で提供する Singleton Session Bean はコンテナを跨ぐ環境においても唯一のインスタンスが保障されるため、こういった実装の手間が必要なく、アノテーションの追加だけで利用できるようになります。その他、タイマーサービスや非同期処理もそれぞれアノテーションを利用して簡単に実装できるようになっています。

最後に、
EJB といえば実装が難しい、設定も面倒という時代は今や過去の事で、今では実装がとてもかんたんになっています。また便利な機能をデフォルトで数多く持っている便利なフレームワークですので、今一度EJB を見直し利用をご検討ください。



























2010年4月7日 at 8:32 午後

GlassFish の今後のロードマップ

GlassFish の今後のロードマップが発表されています。発表資料

この資料中では、直近でリリース予定の GlassFish v2.1.1, v3.0.1の他、GlassFish v3.1 、v3.2 、v4 についても触れらてています。

この資料の中で特に興味深いのは、GlassFish v4 という名前が初登場した事で、次期 Java EE である Java EE 7 に対応する製品になるようです。資料中に記載されているスケジュールはあくまでも予定ですので(今までの経験から)今後変更される事が予想できますが、今後も GlassFish が継続してオープンソースのアプリケーションサーバとして提供されていく事をご確認いただけるかと思います。
ぜひ、この資料をご確認ください。

2010年3月26日 at 3:03 午後 1件のコメント

Servlet 3.0 web-fragment.xml による設定

Web アプリケーションの開発者は Apache Wicket や Spring 等 Servlet とは異なる別の外部フレームワークを開発時に利用する事があるかと思います。これらの外部フレームワークを使用するためには、これらのフレームワーク特有の設定 (Servlet, Filter 等)を web.xml に設定する必要があります。しかし複数の外部フレームワークを同一アプリケーション内で使用する場合、単一の web.xml ファイル内に全ての設定が含まれファイルが肥大化します。また web.xml ファイルが肥大化すると、各フレームワーク毎の設定を管理する際に可読性も低下しているため、管理が困難となります。

そこで、Web Fragment はフレームワーク毎に独自に設定を登録、管理できるようなメカニズムを提供しています。このWeb Fragment は Servlet 3.0 に導入された新しい技術で、配備記述子をモジュール化し、コンテナがモジュール化した配備記述子を認識する事ができるようになり、上記のような問題を解決しています。
一つの、web-fragment.xml ファイルは web.xml の一部として認識され、利用する外部フレームワーク毎に複数の web-fragment.xml を作成することもできます。

それでは、web-fragment.xml をどこに作成するか確認してみましょう。まず、Web アプリケーションのプロジェクトを作成します。この際、WEB-INF/lib ディレクトリ配下に、web-fragment.xml を含む jar ファイル (下記の例ではExternalLib.jar) をコピーします。

> jar tvf FragmentSample.war
0 Sun Mar 14 14:36:00 JST 2010 META-INF/
95 Sun Mar 14 14:35:58 JST 2010 META-INF/MANIFEST.MF
0 Sun Mar 14 14:36:00 JST 2010 WEB-INF/
0 Sun Mar 14 14:36:00 JST 2010 WEB-INF/classes/
0 Sun Mar 14 14:36:00 JST 2010 WEB-INF/lib/
2076 Sun Mar 14 14:36:00 JST 2010 WEB-INF/lib/ExternalLib.jar
515 Sun Mar 14 14:36:00 JST 2010 WEB-INF/sun-web.xml
469 Sun Mar 14 14:36:00 JST 2010 index.xhtml


ExternalLib.jar には、META-INF ディレクトリ配下に web-fragment.xml を作成します。
> jar tvf ExternalLib.jar
0 Sun Mar 14 14:36:00 JST 2010 META-INF/
109 Sun Mar 14 14:35:58 JST 2010 META-INF/MANIFEST.MF
995 Sun Mar 14 14:36:00 JST 2010 META-INF/web-fragment.xml


web-fragment.xml には下記のような内容を記載します。下記の例では JSF 2.0 の設定を web-fragment.xml に記載していますが、web.xml に記載する内容とほぼ同様の内容が記載されている事が分かります。
<?xml version=”1.0″ encoding=”UTF-8″?>
<web-fragment xmlns=”http://java.sun.com/xml/ns/javaee”&nbsp;
              xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#8221;
              xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee&nbsp;
              http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd&#8221;
         version=”3.0″>

    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
</web-fragment>

web.xml の記載は、Servlet 3.0 からオプション化されていますので、web.xml が無くても上記は動作しますが、web.xml を記載する場合は、<metadata-complete> に true が設定されていないことを確認してください。この<metadata-complete> はアノテーションの利用を許可したり、外部リソースをコンテナが自動的に検出するかどうかを指定する設定ですが、true に設定されていると、アノテーションの利用が不可になる他、web-fragment.xml 等のリソースの自動検出ができなくなります。このタグが記述されていない場合、もしくは false に設定されている場合は、アノテーションも、リソースの自動検出も有効になりますので確認してください。

<web-app version=”3.0″ xmlns=”http://java.sun.com/xml/ns/javaee&#8221; xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#8221; xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd&#8221; metadata-complete=”false”>
(例:Servlet 3.0 でアノテーション、web-fragment.xml の有効化)

また、複数の外部フレームを利用する場合、フレームワーク毎にそれぞれの web-fragment.xml を作成する事もできます。また、設定を読み込む順番を指定するため2種類の方法を提供しています。

● Absolute Ordering
  web.xml ファイルに、<absolute-ordering> を指定して順番を設定します。

● Relative Ordering
  web-fragment.xml ファイルに <ordering> を指定して順番を設定します。

例えば、2つの外部フレームワークを2つの Web Fragment(Fragment1, Fragment2) にそれぞれ設定した場合を想定します。この時、web.xml に順番を指定する場合、下記のように記載します。web.xml の設定が最初に読み込まれた後、Fragment2→Fragment1の設定が読み込まれます。

   <web-app>
       <name>MyApp</name>
       <absolute-ordering>
          <name>Fragment2</name>
          <name>Fragment1</name>
       </absolute-ordering>
       …
   </web-app>


最後に、web-fragment.xml の設定は外部フレームワークやリソースをモジュール化して読み込ませる事が可能になる他、web.xml の肥大化を防ぎ、可読性も向上するため設定管理が楽になります。是非お試しください。

備考:
最初は、上記 web-fragment.xml の設定を Wicket 1.4 を使用して試しましたが動作させる事ができませんでした。調査した結果、現在の Wicket 1.4 は WicketFilter 中で web.xml ファイルを直接参照するように実装されているため、web-fragment.xml の設定ファイル中から設定を読み込む事ができないためでした。今後 WicketFilter 側で修正が施されれば、Wicket の設定も web-fragment.xml に含める事ができるようになるかもしれません。

WicketFilter.java のソースコード

実装部分:
InputStream is = filterConfig.getServletContext().getResourceAsStream(“/WEB-INF/web.xml”);

2010年3月14日 at 4:04 午後

Servlet 3.0 の新機能概要

Servlet 3.0 の新機能をプレゼン形式でまとめてみました。個々の機能に関する詳細は別途記載する予定ですが、ここでかんたんに概要を説明します。

Servlet 3.0 は Servlet 2.5 からかなり多くの改良が施されています。
Java SE 5 から利用可能になった、アノテーションを利用し、今まで web.xml に記載していた Servlet や Filter 等の設定をアノテーションで記載できるようになり開発生産性が大幅に向上しました。
また、プラガビリティの向上として、外部のフレームワークやライブラリの設定を web.xml 以外のファイル (web-fragment.xml) に記載できるようになったため、web.xml の肥大化を抑制でき、またフレームワークの設定管理が容易になっています。
その他では Servlet API 自身でマルチパートを扱えるようになったため、Servlet API だけでファイルをアップロードすることができるようになっています。
さらに、Servlet 3.0 から非同期処理を実現できるようになっています。この非同期処理機能は、Comet/Reverse Ajax 等のアプリケーションを実装できる他、DB アクセス等とても処理に時間がかかるような処理を非同期で処理する事ができるようになります。例えば、HttpServlet のスレッドとは別のスレッドで非同期に実現する事で DB が高負荷時に HttpServlet の最大スレッド数に到達し Web のアクセスが不可になる状態を防ぐ事もできます。
その他では、HttpServletRequest に login/logout/authenticate のメソッドが含まれ、プログラムを利用しログイン/ログアウト処理を実装できるようになった他、@ServletSecurity を使用して web.xml に記載していた < security-constraint > の設定をプログラム中で宣言できるようになっています。

改良された、Servlet 3.0 を是非お試しください。


web.fragment.xml に関する詳細は 「Servlet 3.0 web-fragment.xml による設定」 のエントリをご参照ください。


マルチパートの詳細は 「Servlet 3.0 File Upload 機能」 のエントリをご参照ください。

2010年3月14日 at 2:26 午前 1件のコメント

ここから始める Java EE 6

2009年12月に Java EE 6 がリリースされて、約3ヶ月経ちました。Java EE 6 にはかなり多くの改善がみられますが、どこから始めればいいのかわからない方に、JSF2,JPA2,EJB 3.1を使ったかんたんな Java EE 6 アプリケーションの書き方を紹介します。

Java EE 6 には非常にたくさんの技術が含まれているので一度に全てを理解することは大変だと思いますが、まずはこのサンプルを通じて、JSF,JPA,EJB にどのような変更が加わったのか、またどのような点が楽になったのか等を理解して頂ければと思います。

開発/実行環境:
開発環境:NetBeans 6.8
実行環境:Oracle GlassFish Server v3

(上記は別途インストールしておいてください。)

サンプルアプリケーションの概要:

コードを書く前にこれから作成するサンプルアプリケーションの概要について説明します。このアプリケーションはとても簡単なアプリケーションでユーザ(データ)を登録して参照するだけという、いたってかんたんなアプリケーションです。また処理フローもとてもシンプルです。

サンプルアプリケーションの処理フロー

アプリケーションの完成予想イメージは下記です。ユーザ登録画面で「作成」ボタンを押下しデータを登録した後、一覧表示画面が表示されます。また一覧表示画面中の「新規作成」のリンクを押下すると登録画面に遷移します。

サンプルアプリケーションの完成イメージ

1.新規プロジェクトの作成

それでは早速プロジェクトを作成していきます。今回作成するアプリケーションは、EJBを含んでいますが新規プロジェクトの作成時「Web アプリケーション」を選択して作成することにします。

補足:
Java EE 6 におけるパッケージ構成の変更点を紹介します。過去の Java EE のバージョンでは下記のように EJB を ear にまとめたり、JSF/Servlet 等を war にまとめたりといったようにパッケージ構成が面倒でした。Java EE 6 からはこのようなパッケージ化の必要はなくなり、EJB も war に含めてデプロイできるようになりました。 

パッケージの簡略化

それでは、メニューから「ファイル」→「新規プロジェクト(W)…」→「Java Web」→「Web アプリケーション」を選択し、「次へ>」ボタンを押下してください。

新規プロジェクトの作成

プロジェクト名に「PersonManagement」を入力し「次へ>」ボタンを押下します。

新規プロジェクト作成

次に、「サーバと設定」で配備するアプリケーションサーバとJava EE のバージョンを選択します。ここでは、「GlassFish v3 ドメイン」と「Java EE 6 Web」を選択し「次へ>」ボタンを押下します。

稼働サーバとフレームワークの選択

次に、使用するフレームワークを選択します。今回は、「JavaServer Fcaces」を使用しますのでこれにチェックを付け「完了(F)」ボタンを押下します。

フレームワークの選択

プロジェクトを作成すると下記のような画面が表示されます。

プロジェクト作成完了

2. JPA 2.0:Entity Bean の作成

新規プロジェクトを作成後、Entity Bean を作成します。Java EE 5 から Entity CMP 2.x に代わり JPA 1.0 が登場し、DBに対する持続性のコード記述がかなり楽になりました。JPA 2.0 ではさらに扱いやすくなり、機能面でも改善が施されています。(JPA 2.0 の新機能の詳細は別途記載する予定です。また今回はとても簡単なサンプルのためJAP 2.0の新機能はあまり使用していません。JPA 1.0と同等レベルの記述内容)

それでは、実際に Entity Bean を作成してみましょう。メニューから「ファイル」→「新規ファイル(N)…」→「持続性」を選択してください。

NetBeans を利用すると既存のデータベースのテーブルから Entity クラスを自動的に生成する事ができます。既に DB テーブルを作成している場合は「データベースからのエンティティークラス」を選択して作成してください。NetBeans を使う上で、この機能は大変便利です。私も普段は先に DB のテーブルを作成して、Entity クラスは NetBeans で自動生成しますので一から Entity クラスを作成する事はあまりしません。是非お試しください。

今回、私は DB のテーブルが作成されていない状態で新規にエンティティークラスを生成しますので「エンティティークラス」を選択し「次へ>」ボタンを押下します。この方法では、エンティティークラスを先に作成した後、エンティティクラスに該当するテーブルを DB 上に後から構築します(Entity クラスを元にテーブルを自動生成することもできます)。

エンティティークラスの作成

ここで新しいエンティティークラス名「Person」、パッケージ名「ent」を入力します。「主キー型」はこのテーブルの主キーの型を選択します。Person を ID で管理しますので、そのまま、「Long」型を設定します。

エンティティクラスの作成

「完了(F)」ボタンを押下する前に1点注意してください。ワーニングで「プロジェクトに持続性ユニットがありません。エンティティークラスを持続さ…」というメッセージが表示されています。これはこのエンティティクラスに対する持続性ユニットが存在していない事を意味しています。そこで「持続性ユニットを作成…」ボタンを押下し、このエンティティクラスに紐づく持続性ユニットを作成します。ボタンを押下すると下記の画面が表示されます。

持続性ユニットの作成

持続性プロバイダとして JPA 2.0 の参照実装である「EclipseLink(JPA 2.0)(デフォルト)」と、データソースを選択します。また表生成の方針ですが、「作成」を選択すると自動的に DB にテーブルを作成します。全ての入力が完了した後、最後に「作成」ボタンを押下します。
この時、後のプログラミング時に使用しますので、入力した持続性ユニット名(PersonManagementPU)を覚えておいてください。

「作成」ボタンを押下すると、「新規エンティティ作成画面」に戻ってきますが、持続性ユニットに関するワーニングが消えたことを確認した後、最後に「完了(F)」ボタンを押下してください。ボタンを押下すると入力された情報を元に ID のみを持つ Person エンティティのひな形が自動生成されます。また同時に、構成ファイル配下に、持続性ユニットの設定ファイル persistence.xmlが自動生成されます。

作成された Entity クラス(Person)のひな形を編集していきます。

ソースコードを確認すると @Entity のアノテーションが自動的に付加されている事に気づきます。このアノテーションを付加することによりコンパイラや、EJB コンテナが本クラスをエンティティクラスと解釈してくれるようになります。

名前、住所、電話番号、年齢をあつかえるようにフィールドを追加し、それぞれに対するセッタ、ゲッタメソッドを記載してください。また、@NamedQuery で JPQL を記載し、DBに登録されている全ての Person を取得できるようにします。

package ent;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;&nbsp;

@Entity
@NamedQuery(name="findAllPerson", query="SELECT p FROM Person p")
public class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(nullable=false,length=256)
    private String name;

    @Column(nullable=false,length=256)
    private String address1;

    @Column(nullable=false,length=12)
    private String telephone;

    @Column(nullable=false)
    private Long age;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        if (!(object instanceof Person)) {
            return false;
        }
        Person other = (Person) object;
        if ((this.id == null &amp;&amp; other.id != null) || (this.id != null &amp;&amp; !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entity.Person[id=" + id + "]";
    }

    public String getName() {
        return name;
    }

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

    public String getAddress1() {
        return address1;
    }

    public void setAddress1(String address1) {
        this.address1 = address1;
    }

    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }

    public Long getAge() {
        return age;
    }

    public void setAge(Long age) {
        this.age = age;
    }
}

以上で、このサンプルアプリケーションに必要なエンティティクラスはできました。

3.EJB 3.1:ステートレスセッション Bean の作成

エンティティクラスを生成したので、次に EJB (ステートレス・セッション Bean) を作成します。「ファイル」→「新規ファイル(N)…」→「Java EE」→「セッション Bean」を選択し、「次へ>」ボタンを押下してください。

EJB セッション Bean の作成

ボタンを押下すると下記の画面が表示されます。ここで「EJB 名(N)」、「パッケージ(K)」を入力し「完了(F)」ボタンを押下します。

ステートレスセッション Bean の作成

補足:
上記画面を確認するとローカルインタフェース、リモートインタフェースが選択できるようになっています。
EJB 3.1 からローカルインタフェースがオプション化されインタフェースを作成する必要がなくなりました。EJB 3.0 では下記の例のようにインタフェースを定義し、それを実装しなければなりませんでしたが、EJB 3.1 からはアノテーションを付加するだけでコンテナが理解してくれるようになります。 

EJB 3.0 でのローカルインタフェースの実装例

EJB 3.0

実際にコードで書くと下記のようになります。

public interface Hello {
    public String sayHello();
}

@Stateless
public class HelloBean implements Hello {
    public String sayHello() { return "hello"; }
}

EJB の利用時

@EJB Hello helloRef;
    ...
    helloRef.sayHello();

これが、EJB 3.1 では下記のようにインタフェースを定義する必要はなくなります。

 

EJB 3.1

EJB 3.1 を利用する時のコードは下記となります。

EJB 3.1

 

それではコードを編集していきましょう。今回は、データの検索と追加を行いますので、それぞれの処理を行う2つのメソッドを実装しています。まず、@PersistenceContextのアノテーションで、(JPA Entity クラスを作成した時に作成した持続性ユニット名。persistence.xml に記載されている。)持続性ユニット名(“PersonManagementPU”)を記載します。これにより持続機能を持った EntityManager のオブジェクト(em)がセットされます。

package pejb;

import ent.Person;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@Stateless
public class PersonEJB {

    @PersistenceContext(unitName="PersonManagementPU")
    private EntityManager em;

    public List<Person> findAllPersons(){
    //Entity(Person)クラスの @NamedQuery の記載に基づき検索
        Query query = em.createNamedQuery("findAllPerson");
        return (List<Person>) query.getResultList();
    }

    public Person createPerson(Person person){
        em.persist(person);
        return person;
    }
}

4.JSF:Managed Bean の作成

EJBと、Entity を作成したので、JSF から利用する Managed Bean を作成しましょう。「ファイル」→「新規ファイル(N)…」→「JavaServer Faces」→「JSF 管理対象 Bean」を選択し「次へ>」ボタンを押下してください。

「クラス名(N)」、「パッケージ(K)」を入力し「完了(F)」ボタンを押下します。

補足:
JSF 2.0 からは下記のような faces-config.xml の設定ファイルがオプション化されました。そこで Managed Bean の設定や画面遷移を XML ファイルに記載する必要はなく、アノテーションを利用しプログラム上で実現することができるようになりました。 

JSF1.2 までの faces-confg.xml の設定例:

<managed-bean>
<managed-bean-name>PersonController</managed-bean-name>
<managed-bean-class>PersonController</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/foo.jsp</from-view-id>
<navigation-case>
<from-outcome>ok</from-outcome>
<to-view-id>/bar.jsp</to-view-id>
</navigation-case>
</navigation-rule>

 

 

コードを編集していきましょう。作成するクラスが Managed Bean であることをコンテナに理解させるため、@ManagedBean のアノテーションを利用します。アノテーションを指定する際、”name” 属性は必須で Managed Bean を識別する名前を入力します。

package mbean;

import ent.Person;
import pejb.PersonEJB;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.ejb.EJB;

@ManagedBean(name="PersonController")
@RequestScoped
public class PersonController {

    public PersonController() {
    }

    @EJB
    private PersonEJB personEJB;

    private Person person = new Person();
    private List<Person> personList = new ArrayList<Person>();

    //Facelets の action="#{PersonController.doNew} により画面遷移
    public String doNew(){
        return "createPerson.xhtml";
    }

    //Facelets の action="#{PersonController.doCreatePerson} により画面遷移
    public String doCreatePerson(){
        //画面から入力された Person を DB に登録
        setPerson(personEJB.createPerson(getPerson()));
        //DB に登録されている全 Person を personList に設定
        setPersonList(personEJB.findAllPersons());
        return "listPersons.xhtml";
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public List<Person> getPersonList() {
        return personList;
    }

    public void setPersonList(List<Person> personList) {
        this.personList = personList;
    }
}

5.JSF 2.0: ベージの作成

最後に、表示画面を作成します。JSF 2.0 から facelet を xhtml で記載できるようになりました。

「ファイル」→「新規ファイル(N)…」→「JavaServer Faces」を選択し「次へ>」ボタンを
押下してください。

JSF 表示画面の作成

ファイル名 (createPerson.xhtml) を入力すると自動的に .xhtml の拡張子が付加されます、最後に「完了(F)」ボタンを押下します。

JSF 表示画面の作成

自動生成されたひな形を編集して下記のコードを記載してください。Facelets で扱えるタグ等は別途紹介する予定ですが、みていただければわかるとおり、HTML も記載する事ができますし、スタイルシート等を記載することも可能です。また、JSF 2.0 から Ajax をサポートしていますので、Ajax のコードを利用してサーバと通信する事もできるようになります。

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
      <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <table>
                <tr>
                    <td>
                <h:outputLabel value="名前:"/>
                </td>
                <td>
                <h:inputText value="#{PersonController.person.name}"/>
                </td>
                </tr>
                <tr>
                    <td>
                <h:outputLabel value="住所"/>
                </td>
                <td>
                <h:inputText value="#{PersonController.person.address1}"/>
                </td>
                </tr>
                <tr>
                    <td>
                <h:outputLabel value="電話番号"/>
                </td>
                <td>
                <h:inputText value="#{PersonController.person.telephone}"/>
                </td>
                </tr>
                <tr>
                    <td>
                <h:outputLabel value="年齢"/>
                </td>
                <td>
                <h:inputText value="#{PersonController.person.age}"/>
                </td>
                </tr>
            </table>
            <h:commandButton value="作成" action="#{PersonController.doCreatePerson}"/>
        </h:form>
    </h:body>
</html>

最後に、登録された一覧を表示する画面を作成します。
「ファイル」→「新規ファイル(N)…」→「JavaServer Faces」を選択し「次へ>」ボタンを
押下してください。

JSF 表示画面の作成

ファイル名(listPersons)を入力し「完了(F)」ボタンを押下します。

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
      <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body> 

        <h:dataTable value="#{PersonController.personList}" var="psn" border="1">
            <h:column>
                <f:facet name="header">
                    <h:outputText value="名前"/>
                </f:facet>
                <h:outputText value="#{psn.name}"/>
            </h:column>

            <h:column>
                <f:facet name="header">
                    <h:outputText value="住所"/>
                </f:facet>
                <h:outputText value="#{psn.address1}"/>
            </h:column>

            <h:column>
                <f:facet name="header">
                    <h:outputText value="電話番号"/>
                </f:facet>
                <h:outputText value="#{psn.telephone}"/>
            </h:column>

            <h:column>
                <f:facet name="header">
                    <h:outputText value="年齢"/>
                </f:facet>
                <h:outputText value="#{psn.age}"/>
            </h:column>
        </h:dataTable>
        <h:form>
            <h:commandLink action="#{PersonController.doNew}">
                新規作成</h:commandLink>
        </h:form>
    </h:body>
</html>

以上で、このアプリケーションの実装は完了です。

NetBeans のメニューより「実行(R)」→「主プロジェクトを実行(R)」を選択してください。実行すると自動的にブラウザがオープンしアプリケーションのデフォルトのコンテンツが表示されます。

コンテキストルートでアクセスされた時のデフォルトページを変更したい場合は、web.xml ファイルを編集する必要があります。下記のように welcome-file-list を編集してください。

web.xml の編集

<welcome-file-list>
<welcome-file>faces/createPerson.xhtml</welcome-file>
</welcome-file-list>

設定を変更した後、もう一度プロジェクトを実行してください。すると下記のように自動的に登録画面が表示されるようになります。

データを入力して「作成」ボタンを押下してみましょう。下記のように一覧表示画面が表示されれば問題はありません。

最後に、エラーハンドリングについて紹介します。例外が発生した際に特定のエラーページにリダイレクトさせるようにweb.xml の<error-page> タグを記載する必要があります。<exception-type>で、ハンドリングした例外毎にエラーページを表示させる事が可能です。本番環境においては、少なくとも JSF で発生する例外の親である javax.servlet.ServletException を記載してください。

web.xml の編集

<error-page>
<exception-type>javax.servlet.ServletException</exception-type>
<location>/error.xhtml</location>
</error-page>

 

以上で、今回の Java EE 6 のアプリケーション作成は終了です。NetBeans を利用するとウィザードを使って、コードのひな形を作成してくれたり、また設定も極力 XML ファイルを手動で編集しなくても済むようになります。是非お試しください。今回紹介したサンプルは Java EE 6 を利用する上で最も基本的な構成と思います、上記の例を元に色々と修正を加え、DI/CDI や Bean Validation 等を加えて Java EE 6 の機能を是非色々と試してみてください。

最後に、私の環境で作成したNetBeans 6.8 のプロジェクトを下記から入手できるようにしました。
(※ Sun の mediacast.sun.com サイトにファイルをアップロードしていますので、
仮にこのサイトが閉鎖してしまった場合は申し訳ありませんがご了承ください。)

● NetBeans 6.8 のプロジェクト(ソース、設定ファイル等を含む)
● GlassFish v3 配備用 WARファイル

2010年2月26日 at 3:33 午後 2件のコメント

Newer Posts


Java Champion & Evangelist

Translate

ご注意

このエントリは個人の見解であり、所属する会社の公式見解ではありません

カレンダー

2026年2月
 1
2345678
9101112131415
16171819202122
232425262728  

カテゴリー

clustermap

ブログ統計情報

  • 1,313,925 hits

Feeds

アーカイブ