Posts filed under ‘Java’
「GlassFish v3 で実感!! エンタープライズ Java の進化」資料公開
Java Hot Topic セミナーのプレゼン資料とデモを公開します。
今回の発表のポイントは、Java EE 6 になり開発が如何に楽になったか、アプリケーションサーバのインストールも起動も如何にかんたんで高速になったのかという点に集中して説明を致しました。原稿は合計 120ページ程ありますが、全てを発表したわけではなく、抜粋して説明しました。特に JPA 2.0 については日本でまだあまり資料がないので参考にして頂けるのではないかと思います。
「GlassFish v3 で実感!! エンタープライズ Java の進化」プレゼン資料 (PDFの入手)
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 製品に関する話題については申し上げる事ができませんので、どうぞご了承ください。
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 を見直し利用をご検討ください。



























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” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd” 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” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd” metadata-complete=”false”> |
また、複数の外部フレームを利用する場合、フレームワーク毎にそれぞれの 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 に含める事ができるようになるかもしれません。 実装部分: |
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 機能」 のエントリをご参照ください。



ここから始める 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;
@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 && other.id != null) || (this.id != null && !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 名(N)」、「パッケージ(K)」を入力し「完了(F)」ボタンを押下します。
| 補足: 上記画面を確認するとローカルインタフェース、リモートインタフェースが選択できるようになっています。 EJB 3.1 からローカルインタフェースがオプション化されインタフェースを作成する必要がなくなりました。EJB 3.0 では下記の例のようにインタフェースを定義し、それを実装しなければなりませんでしたが、EJB 3.1 からはアノテーションを付加するだけでコンテナが理解してくれるようになります。 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 を利用する時のコードは下記となります。
|
それではコードを編集していきましょう。今回は、データの検索と追加を行いますので、それぞれの処理を行う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 であることをコンテナに理解させるため、@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」を選択し「次へ>」ボタンを
押下してください。
ファイル名 (createPerson.xhtml) を入力すると自動的に .xhtml の拡張子が付加されます、最後に「完了(F)」ボタンを押下します。
自動生成されたひな形を編集して下記のコードを記載してください。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」を選択し「次へ>」ボタンを
押下してください。
ファイル名(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ファイル
Java Champion による Java パフォーマンスチューニングのトレーニング開催予定
今年の2月と3月に、Java Champion による Java パフォーマンス
チューニングに関するトレーニングが開催されます。
日頃、Java のパフォーマンスチューニングでお悩みの方は、
是非、この機会に受講されてみては如何でしょうか?
ちなみに、余談ですが、
Java Champion はJava におけるリーダシップの役割を持つ方々で、
Java の技術に関する啓蒙活動等を行う、世界中から厳選された(約 90 名) Java のスペシャリストです。
日本からは唯一櫻庭 祐一さんが選ばれています。
今回は、この Java Champion のメンバーの中からパフォーマンスチューニングに強い方を日本サンのエデュケーション部が招待し開催する運びとなった貴重なトレーニングです。
ちょっと値段は高いですが、海外からまた社外から招待していることもぜひご考慮頂き、ぜひご検討ください。
以下、トレーニングの案内文
この度サンは、世界的に有名な Java エキスパートを講師にお迎えし、
「Java エキスパートトレーニング」を開催致します。
本トレーニングは米国において、連日満員の人気コースとなっており、
Java トップエンジニアの育成に大きな成果を上げています。
また、Java の最前線で活躍する世界的に著名なエキスパートから、
直接技術を習得できる貴重な機会として、中・上級エンジニアから、
ご好評を頂いております。
東京品川にといての、日本語通訳付きでのコース開催は、
日本のエンジニアの方にとって大変貴重な機会となります。
◇開催コース◇
——————————————————
「プロフェッショナルによる真の Java プログラミングとは?」
日 程:2010年2月23日(火)- 26日(金)
コース:Java Specialist Master Course (JP-EXL-3500)
講 師:Maurice Naftalin
——————————————————-
「究極の Java パフォーマンスチューニングとは?」
日 程:2010年3月2日(火)- 5日(金)
コース:Java Performance Tuning Workshop (JP-EXL-2025)
講 師:Kirk Pepperdine
—————————————————
※コースの詳細、講師のプロフィールは以下をご参照下さい
http://jp.sun.com/training/news/2009/exl/
本コースの受講により、彼らの持つスキル、経験、洞察力を学び取り、
一回り、二回りの成長へとつなげて頂くことを期待しております。
上を目指すエンジニアの方は、この絶好の機会をお見逃し無く!
Java EE 6 について JavaOne 2009 Technical General Session での発表
Java EE 6 のスペックリードである Robert Chinnici が
Java One 2009 の Technical General Session で Java EE 6について
話をしています。
実際の発表内容:27分30秒あたり
Java EE 6 については 2年程仕様策定等の処理を行ってきましたが、
やっとリリースが近づいてきました。リリース予定は今年の秋(9 月予定)
今回の Robert からの発表内容の概要は下記の通りです。
各ポイントについての詳細は別途記載する予定です。
ー Java EE 6 のポイント:
●柔軟性
開発環境、本番環境共に柔軟性を持たせる
●かんたん開発
Java EE 5 に引き続き
●プロファイル
用途に応じた機能を抽出しプロファイルとして利用
●プルーニング
不必要な仕様の段階的削除
●拡張性
3rd パーティのライブラリを最小限の設定で利用可能
ー 技術詳細説明:
● Self Register
WEB-INF/lib 配下のライブラリを自動的に自己登録可能
(3rd Party,OSSライブラリの再利用がかんたんに)
● web.xml のフラグメント化(オプション化)
Servlet, Servlet Filter, ContextListener等の記載は不要に
● JAX-RS (RESTful Web サービスの追加)
Web サービス以外でも利用可能
● JSF 2.0
Ajax 対応のコンポーネントライブラリが利用可能に
かんたんに Web ページの作成が可能に
● Asynchronus Servlet
クライアントからの長時間接続が必要なアプリ
サーバ側からの Push/通知が必要なアプリに有用
ハイスケーラビリティ
● Bean Validation
Bean のバリデーションをあのテーションでかんたんに条件指定が可能
● EJB 3.1
EJB 3.0 からのアップデート
シングルトンオブジェクトやタイマーオブジェクトの利用が可能に
ー デモ:
● GlassFish Tools Bundle for Eclipse
● アプリケーションの再デプロイ時に既存のセッション情報を引き継ぎ
● Web アプリケーション中で OSGi バンドルの利用
詳細は、別途報告できればと思いますが、概要としては上記のような内容でした。
Roberto の発表内容を今すぐ確認されたい方は上記の動画をご確認ください。
基本的には、今まで得られていた情報が多かったのですが、
GlassFish v3 から追加された機能である、アプリケーションの
再デプロイ時に既存のセッション情報を引き継ぐデモや、
独自の OSGi バンドルを作成し利用するデモは今まで情報が
少なかったので、是非自分の目でご覧頂ければと思います。
Java SE 5 Update 19 リリース
Java エバンジェリストの戸島さんから教えて頂いたのですが、
Java SE 5 Update 19 がリリースされたようです。
このバージョンから IE8, Windows Server 2008 がサポートされるように
なったとようです。configuration の page には vista もリストされているので
vista も対応されたようです。
http://java.sun.com/j2se/1.5.0/ReleaseNotes.html#150_19
http://java.sun.com/j2se/1.5.0/system-configurations.html
IE8, Windows Server 2008, Vista ユーザの皆様
お待たせいたしました。
2009年JavaOneのDuke’s Choice Awardのノミネーション開始
2009年 JavaOneのDuke Choice Awardのノミネーションを開始しました。
昨年は、Hudsonで川口さんが受賞しましたが、今年はどのような技術で
どなたが受賞するのでしょうか?
日本人もすばらしい技術をたくさん生み出していると思います。
我こそはと思うかたは是非応募フォームよりノミネートしてください。
2008年の Duke Choice Award Winners 一覧






















