Posts filed under ‘GlassFish’

WebLogic Server 12c Forum 2013 開催


「WebLogic Server 12c Forum 2013
       ~ Java EEの現在と未来、WebLogicが拓く新たな可能性 ~ 」

  日時 :2013年2月1日(金)13:30~17:30 (受付開始 13:00~)
  場所: オラクル青山センター
     〒107-0061 東京都港区北青山2-5-8
  お申し込み:コチラから

2013/02/01 にオラクル青山センターで WebLogic/Java EE 関連のイベントを開催します。本セミナーでは US 本社より Fusion Middleware の Product Management である、マイク・リーマンを招き、世界のJava EE 6活用状況や、昨年開催した Oracle OpenWorld における WebLogic Server の最新情報、さらには今後のWebLogic の姿に至るまで、様々なトピックをご紹介致します。


アジェンダ

13:30~13:35 開催のご挨拶
13:35~14:40 WebLogic Server12cの現在と未来、そして新たな取り組み  
14:50~15:35 Oracle RAC の性能を最大限に引き出す!:
       WebLogic 新機能 Active GridLink for RAC の詳細解説
15:35~15:50 コーヒーブレイク
15:50~16:20 Java EE 6 – 今注目すべきポイント
16:20~17:30 【Java EE Special Panel Discussion】【同時通訳】
       Java EE 6の現在とJava EE 7、そしてその先へ
17:30~ オラクル社員犬 キャンディ がお見送り

個人的には、中でも Oracle RAC の性能を最大限に引き出す Active GridLink for RAC の性能検証に興味があります。これは Oracle と NEC さんとで実際に検証を行なった内容の詳細を発表する予定ですが、とても興味深い内容です。

皆様のご参加を心よりお待ち申し上げます。

2013年1月17日 at 6:22 午後

はじめての Java Persistence API

今日は、Java Advent カレンダーの一貫で 12/19 分のエントリを記載します。昨日のなぎせさんに続き掲載します。また明日は私の盟友である岡崎さんです。

先日、なぎせさんより、「ProxyパターンとProxyクラスと黒魔術」と題してSQL の事を取り上げていただきました。また私自身、先日岡山のイベントで JPA について登壇したばかりなので、今日は DB つながりということで JPA (Java Persistence API) について岡山の資料を利用しながらご紹介します。

岡山の発表資料の全部はこちらです。

Java でデータベース (DB) 接続をする際、Java で一番最初に DB 接続をサポートした事から、ながく JDBC が利用されてきました。その後、J2EE に EJB の CMP Entity Bean が導入されましたが、これはとても重量級で扱いにくいフレームワークだったため、残念ながらあまり浸透しませんでした。それに変わって登場したのがオープンソースのフレームワークである JDO/Hibernate などです。

昨今、「もう Java EE 6 でいいんじゃない」、Java EE 6 はかんたんになりましたよ、などのブログ・エントリを書いたり、いろいろな所で登壇させて頂きましたが、JPA もまたかんたんに利用できるようになった、 Java EE の標準 O/R マッピング技術です。JPA は上記のようなオープンソースの O/R マッピング・フレームワークの良い部分を数多く取り入れ、かなり扱いやすくなっていますので、是非今一度標準の JPA のご使用を検討ください。また、JPA 2.0 は JPA 1.0 に比べ表現力がかなり豊かになっていますので、JPA 1.0 で物足りなさを感じられた方も今一度ご検討ください。JPA 2.0 になり、通常のビジネスアプリケーション開発のニーズをほぼ満たせると考えております。

また、ご存知の方もいらっしゃるかと思いますが、JPA は Java EE コンテナ以外の、通常の Java アプリケーションからも利用することができるようになっています。実際、JPA は GAE などでも利用できます。つまり今まで JPA はアプリケーションサーバ上でしか利用できないと思われていた方も、Java EE 環境がなくても JPA は利用できますので Java アプリケーション開発等コンテナの無い環境でも使用をご検討ください。

それでは、JDBC に比べて何が便利になっているかについて説明します。JDBC は低レベルの API しか提供していなかったため、自分で考慮、実装しなければならない事が数多くありました。例えば、JDBC をそのまま利用した場合、コネクションプールの実装はデフォルトでないため、DB にたいする問い合わせ(クエリ)を行う際に、毎回 DBに対してコネクションを張りにいかなければなりませんでした。またキャッシュも実装されていないため、毎回 DB にたいする操作を行わなければなりません。DB サーバにたいする問い合わせ(クエリ)数が少ない場合は、コネクションプールも、キャッシュもさほど重要ではないかもしれませんが、Web アプリケーションのように、クライアントからのリクエスト毎に DB の情報を参照するようなアプリケーションの場合、リクエスト毎に接続を張る、もしくはたとえ同じ情報を読むだけでも DB に接続するなど、必要以上に DB サーバに対して高負荷が掛かってしまいます。このような場合、コネクションプールを利用して DB 接続を再利用したり、キャッシュを利用する事で DB サーバにたいする負荷を軽減できます。さらに、JDBC を利用した場合トランザクション管理についても全て自身で実装、管理しなければならないため、JDBC を利用した場合、数多くの事を考慮しなければならない事がわかります。
JPA を利用すると、このような JDBC で開発者が考慮し実装しなければならない多くの機能を JPA のフレームワーク自身で既に実装していますので、開発者はそれらを再利用、もしくはコンテナに任せることがで、より安全にスケールするアプリケーションをコード量少なく短時間で開発できるようになります。つまり一言でいうならば、JPA を使用する場合、開発生産性が大幅に向上するという事です。たとえば、統合開発環境と連携する事で基本的な CRUD 操作のひな形まで自動生成してくれるためコード記述量も格段に減ります。

それでは実際に、 JPA の構成要素についてご紹介します。JPA は persistence.xml という XML 設定ファイル中に PersistenceUnit を(1つ以上)定義します。この PersistenceUnit 名は EntityManagerFactory のインスタンスを生成するために必要です。EntityManagerFactory から EntityManager のインスタンスを生成し、DB にたいする操作をおこないます。

永続化:EntityManager#persist()
削除:EntityManager#remove()
検索:EntityManager#find()

DB の操作を行う際、DB テーブルにたいして Java オブジェクトにマッピングした、Entity クラス(@Entity アノテーションを付加したクラス)を利用しておこないます。Java はオブジェクト指向型言語でクラスとして表現します、一方 DB はテーブルとして表現し、個々のデータを行(ロー)で表現します。JPA 2.0 は JPA 1.0 にくらべ Entity と DB テーブルのマッピング方法も数多く追加で提供されていますので、複雑な DB テーブルも Entity としてマッピング可能です。(本ページ下の参考資料をご参照)


繰り返しますが、Entityは @Entity のアノテーションを付加した単なる POJO です。この Entity クラスは JPA によって管理されていない状態では、単なる Java のオブジェクトとして扱います (例 new MyEntity() でインスタンスを生成した直後の状態)。Persistence Context による管理状態と管理されていない(デタッチ)状態でなにが違うかライフサイクルを用いて紹介します。管理状態とは、Persistence Context によって管理されている状態を指し、すべての Entity はPersistence Context によって管理されています。この状態の時に EntityManager を使って DB に永続化等を行う事ができます。

ライフサイクルの各状態を、実際のコードを用いて説明します。この例ではまず、Customer クラスが Entity で DB の CUSTOMER テーブルにマッピングしています。new Customer(); でインスタンスを作成します。この際、Java の Heap に Customer オブジェクトは含まれていますが、この時点では Persistence Context 内でまだ管理されていません。EntityManager#persist(customer) を実行する事により Persistence Context で管理状態となります。この状態で DB テーブルに対して操作を行うことができますが、たとえばトランザクションのコミット tx.commit() が呼び出されると、DB に対して永続化が行われ、この時に Customer の Entity は Persistence Context の管理状態から外れます(デタッチ状態)。ただし、この Persistence Context の管理状態から外れた際も、Customer は Java Heap 内に参照が残っているため、Java プログラムからは Customer オブジェクトに対しては操作する事ができます(例えば、Customer 電話番号の変更等)。管理状態から外れデタッチ状態の Customer に対して変更を加えた場合、対応する DB の行(ロー)と整合性がとれていません、そこでデタッチ状態の時に加えられた変更を EntityManager#merge() によって更新することができます。

上記までで、Entity, Entity のライフサイクル等を紹介しましたが、EntityManager の管理はアプリケーションサーバ等のコンテナ上で管理する方法と、アプリケーションで管理する方法の二種類があります。またそれぞれでできること、実装方法も異なります。下記にそれぞれにおける違いについてご紹介します。まず、コンテナ上で EntityManager を生成する方法は、@PersistenceContext のアノテーションを付加し persistence.xml に定義した PersistenceUnit 名(ここでは MYJPA_PU)を指定し、EntityManager にインジェクションします。ここでインジェクションされた EntityManager はコンテナ上で動作するため、トランザクション管理等もコンテナ側で行なってくれます。つまりトランザクション管理のコードを明示的に記載しなくても、EntityManager#persist() を実行した際に何らかの例外が発生した場合は、コンテナが自動的にロールバックします。

一方アプリケーションから管理する場合は、@PersistenceContext のアノテーションを付加する方法ではなく、Persistence.createEntityManagerFactory(“MYJPA_PU”)でファクトリを生成後、EntityManagerFactory#createEntityManager() にて EntityManager のインスタンスを生成します。アプリケーションから管理する場合は、コンテナによってトランザクション管理ができないため自身の手でトランザクション管理のコードを記述する必要があります。

最後に DB にたいする問い合わせ方法について紹介します。最もかんたんな方法として EntityManager の find(), getReferecnce() を利用して ID を指定し行う方法があります。しかし一般的には SQL に精通する開発者が問い合わせ(クエリー)を実装しやすいように、JPQL(Java Persistence Query Language) というSQL ライクなクエリ言語を使用して問い合わせをおこないます。通常の SQL はカラムを指定して問い合わせを実施しますが、JPQL では Entity を使用して問い合わせをおこないます。JPQL もまた JPA 2.0 は JPA 1.0 にくらべ表現力が高くなっており、さまざまな問い合わせを実現できますので是非 JPQL をご利用ください。

次に、DB へ問い合わせを行うために、JPQL よりもさらに型安全性を高める実装が可能な Criteria API について紹介します。Criteria API は Java プログラミングによる問い合わせが可能な API を提供します。具体的には、CriteriaBuilder, CriteriaQuery などのクラス、メソッドを使用して実装します、例えば下記のように JPQL クエリを、Java プログラミングで実装する事ができます。

ここで一番最後の行に記載する person.get(“name”) と記載している箇所に注目してください。ここでは、正しく “name” という文字列を使用して記述していますが、仮に “name” と入力すべき所を “nema” と入力ミスしてしまった場合を考えてください。このプログラムを実行するためコンパイルをおこないますが、文法上の間違いはないためコンパイルエラーは発生しません。結果として実行時にランタイムエラーが発生します。


つまり上記のように、Criteria API だけでは完全な型安全性が確保できていないことがわかります。型安全性をより高めるためには、Criteria API に加え Metamodel API を併用します。この Metamodel クラス(元の Entity に対して ”_” アンダーバーが付加)は統合開発環境によっては自動生成してくれるため、自分で作成しなくても良い場合もありますが、この Metamodel クラスを Criteria API と併用すると、person.get(“name”) の代わりに person.get(Person_.name)と記載でき、クラスのフィールドで指定可能となるため、コンパイル時に間違いを検知できるようになりランタイムエラーの発生を抑制できます。型安全をより求める場合は、Criterial API と Metamodel クラスを共にご使用ください。

最後に、繰り返しになりますが、
JDBC で実装する場合、自分で実装しなければならないコード、検討しなければならない箇所が多々ありますが、JPA を利用すると、そういった共通で必要な機能はすべてフレームワークが生成してくれています。全ての場合で JPA が有効とは申し上げませんが、JPA を使う事によりスケーラビリティを高める事が容易にできたり、また開発生産性が高まる事によって、よりビジネスロジックの開発に集中していただく事ができるようになります。また運用・保守時においても実装コードの可読性が大幅に高まるため、より保守しやすくなります。今まで標準以外の O/R マッパを使っていた方々も、標準でここまで簡単にできるようになっています。是非 JPA 2.0 を今一度ご検討ください。

JPA 2.0 の新機能はこちらもご参照ください。

私が参考にする Web Page
Java Persistence

おすすめ書籍

2011年12月19日 at 2:03 午後 2件のコメント

GlassFish 勉強会終了

先日は、GlassFish Japan Users Group 勉強会 2011 Summerに数多くの皆様にお越し頂きまして誠にありがとうございました。また発表して頂いた@ryoasai74さん、@btnrouge さんお二方とも初めての発表という事でさぞ緊張なさった事かと思いますが、とても有用な内容を提供して頂きまして誠にありがとうございました。

早速、お二方より発表時に使用したプレゼンを公開して頂きましたので、それぞれ紹介したいと思います。

また、当日参加できなかった方は下記 UStream に当日の発表内容の録画を公開していますので併せてコチラもご参照ください。

皆様、この度は誠にありがとうございました。

次回は 9/3 に関西で、関西 GlassFish 勉強会 が開催されます。関西地区の方はどうぞ楽しみにしてください。

2011年8月13日 at 12:54 午前 6件のコメント

NetBeans 7.0 とフリーの Java Magazine


NetBeansの7.0 FCSがもうすぐ利用できるようになります。
NetBeans 7.0は、JDK7 のプロジェクトコインに対応する他、エディタの強化、WebLogic のサポート、Glassfish v3.1 のサポート、Maven 3 のサポートJava EE のサポート、HTML5 コードの編集機能の改善、PHP の改善、C/C++ のサポート等数多くの改良が行われており、効率よく迅速な開発ができるようになっています。
詳細の機能を確認したい場合は、コチラをチェックして頂くか、FCSのリリースまでまてない方は、NetBeans 7.0 RC2 をダウンロードしてご確認ください。

英語に堪能な方は、NetBeans のエンジニアリングマネージャーが 4/12 に OTN で説明した、新機能の概要を下記より近い時期に参照できるようになる予定ですのでご確認ください。

iTune サイトから
TechCast Live Archive サイトから

今年の夏より新しく、”Java Magazine”(電子媒体) が発行されます。
Java Magazine はOracle のエンジニアが直接書く内容の他、コミュニティメンバーによって書かれた内容も含まれます。
含まれるコンテンツは “Java Community News and Events”, “Java in Action”(Java アプリケーションのストーリ), “Java アーキテクチャ”、”Java の新機能”、”エンタープライズ Java プログラミング”, “リッチクライアント”, “Web 開発”, “モバイル、組み込み開発” 等、様々なコンテンツが提供される予定です。

Java Magazine は7月末から隔月で Web版、モバイル版それぞれの提供を開始します。購読は無料ですので、Java に関する情報をいち早く入手したい方は是非登録のうえご購読ください。

登録はコチラから

2011年4月13日 at 6:27 午後

GlassFish v3.1 の新機能(詳細説明版)

GlassFish v3.1 が US 時間 2/28 にリリースされました。これに併せ本日、ダイレクトセミナーで特別セミナーを開催しました。本日説明時に使用した紹介資料(JJUG ナイトセミナー + α)を下記にアップロード致しました。是非ご参考ください。

GlassFish v3.1 はマルチリンガル版を入手すると日本語の管理機能が扱える他、zip 版インストーラを提供するため unzip するだけで簡単にインストールできます。アプリケーションサーバというと重い扱い辛いという概念を完全に払拭するこの新しいアプリケーションサーバを是非ご利用ください。

2011年3月1日 at 5:38 午後 2件のコメント

GlassFish v3.1 (2/28 リリース) 特別オンラインセミナー


3/1 (火) に GlassFish v3.1 に関する特別オンラインセミナーを開催する事になりました。GlassFish v3.1 は 2/28 にリリースされる事が先日正式発表され、リリース後初めてセミナーとなります。発表内容は 2/22 に開催した JJUG のナイトセミナーの内容をベースに2/25 に US で開催されたオンラインセミナーの内容も交えて発表する予定です。

対象:
● JJUG のナイトセミナーに都合が悪く参加できなかった方
● GlassFish って最近聞くけどどういう物なんだろうと概要を知りたい方
● オープンソース版と製品版の違いは何なのか知りたい方
● 実環境で使う為のノウハウを得たい方
● Oracle 統合後も GlassFish が提供されるか心配されている方

上記の方々を対象に幅広い内容を説明する予定です。

日時:2011年3月1日(火)15:00 – 16:00(接続受付開始 14:45~)
費用:無料
ご登録:
GlassFish v3.1 のご紹介

日中の時間帯ですが是非上記よりご登録の上御参照ください。

2011年2月27日 at 1:10 午前

JSF 2.0 で Facelets タグをコメントする方法

今日は、JSF 2.0 の Facelets でコンポーネントタグをコメントする方法をご紹介します。テスト用のコードを記載する際、デバッグ用のコード、もしくはダミーのコードを埋め込んだりする事があるかと思いますが、本番環境での表示には必要ないコンポーネントをコメントする方法を下記に紹介します。

まず、始めに、下記のようなサンプルページを作成してください。

<?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:commandButton action="#{user.login_dummy}" value="Submit-Dummy"/><br/>
        <h:commandButton action="#{user.login}" value="Submit"/>
    </h:body>
</html>

CDI の UserBean.java

package jp.co.oracle.cdi;
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import javax.inject.Named;

@Named("user")
@SessionScoped
public class UserBean implements Serializable{
    
    public void login(){
        ;
    }

    public void login_dummy(){
        ;
    }
}

今回は上記コード中の「Submit-Dummy」ボタンをコメントします。何も考えず、通常通り HTML/XML のコメント(<!–    –>)を使って下記のようにコメントをして実行してください。

<?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:commandButton action="#{user.login_dummy}" value="Submit-Dummy"/><br/> -->
        <h:commandButton action="#{user.login}" value="Submit"/>
    </h:body>
</html>

すると、下記のようなエラーが表示されます。

致命的: Error Rendering View[/comentSample.xhtml]
javax.el.PropertyNotFoundException: The class ‘jp.co.oracle.cdi.org$jboss$weld$bean-$Users$yt133043$NetBeansProjects$JSFSampleApplication$build$web$-ManagedBean-class_jp$co$oracle$cdi$UserBean_$$_WeldClientProxy’ does not have the property ‘login_dummy’.
警告: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception

これは、通常の XML/HTML のコメントのように、<!–    –> でコメントしても JSF 2.0 の実行環境では完全にコメントできていない事を表しています。内部的には、 #{user.login_dummy}の EL式が評価・処理されています。

そこで、JSF のコンポーネントタグをコメントする方法(EL式も含め)を2通り紹介します。


1. <ui:remove> </ui:remove> タグを使用する方法
2. facelets.SKIP_COMMENTS を web.xml に記載する方法

まず、始めの方法は
<ui:remove> タグを使用する方法です。下記の 10 行目〜12 行目のように、コメントしたいコンポーネントを <ui:remove> </ui:remove> でくくってください。

<?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:ui="http://java.sun.com/jsf/facelets">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <ui:remove>
            <h:commandButton action="#{user.login_dummy}" value="Submit-Dummy"/><br/>
        </ui:remove>
        <h:commandButton action="#{user.login}" value="Submit"/>
    </h:body>
</html>

コメントした後、画面を再描画すると「Submit-Dummy」のコマンドが非表示になっている事を確認できます。

この時の描画されたページの HTML ソースコードは下記のようになります。

<?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">
    <head>	
        <link rel="stylesheet" type="text/css" href="/JSFSampleApplication/primefaces_resource/2.1/skins/sam/skin.css" />
        <title>Facelet Title</title>
    </head>
    <body>
        <input type="submit" name="j_idt7" value="Submit" />
    </body>
</html>

次にもう一つの方法は、
web.xml 設定ファイルに facelets.SKIP_COMMENTS を記述する方法です。下記の7 行目〜10 行目のように web.xml に facelets.SKIP_COMMENTS を追加してください。すると<!–    –> でくくられた箇所が EL 式も評価されずコメントされる事が確認できます。

web.xml 設定ファイルの編集:

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Production</param-value>
    </context-param>
    <context-param>
        <param-name>facelets.SKIP_COMMENTS</param-name>
        <param-value>true</param-value>
    </context-param>
...


この時の HTML の出力結果は下記のようになります。

<?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">
    <head>	
        <link rel="stylesheet" type="text/css" href="/JSFSampleApplication/primefaces_resource/2.1/skins/sam/skin.css" />
        <title>Facelet Title</title>
    </head>
    <body>
        <input type="submit" name="j_idt7" value="Submit" />
    </body>
</html>

どちらの方法を使用してもコメントができるようになりますので、開発者の皆様の使い勝手の良い方法を選択してください。

2011年1月19日 at 5:34 午後

JSF 2.0 の新機能概要とFacelets テンプレートのご紹介


JavaServer Faces 2.0(JSF) は Java EE 6 含まれる標準 Web ユーザインタフェース技術です。これから数回に渡り、JSF 2.0 の新機能を紹介して行きたいと思います。

JSF 2.0 の新機能


  • Facelets/VDL による実装
  • Ajax 対応
  • カスタム複合コンポーネント
  • Behavior
  • Partial State
  • ページナビゲーションの改良
  • Resource Loading
  • ブックマーク可能なページ
  • New Event API
  • 例外ハンドリング
  • JSR-303 Bean Validation のサポート
  • faces-config.xml のオプション化

JSF 2.0 では JSF 1.2 に比べ上記のような新機能が含まれますが、今日は JSF 2.0 から標準仕様に含まれた Facelets について紹介します。
Facelets は JSF 1.2 まで View を記載する方法として使用されていた JavaServer Pages(JSP) で の代替え方法として開発されました。JSF 1.2 の頃は Facelets は標準仕様内に組み込まれていなかったため、別途利用するための設定等が必要でしたが、JSF 2.0 からは JSF の標準仕様内に組み込まれたため、今後は JSP の変わりに Facelets(XHTML) を記載して開発するようになります。
また、JSF 1.2 は Servlet 2.5 と組み合わせて動作させる必要がありましたが、JSF 2.0 では Servlet 3.0 との組み合わせは必須ではなく、Servlet 2.5 との組み合わせでも動作させる事ができるようになっています。つまり JSF 2.0 の実行環境(参照実装は Mojjara(モハラ)) は Java EE 6 の環境下だけでなく Java EE 5 の環境でも動作させる事ができるようになっています。WebLogic 10.3.3 等 Java EE 5 のアプリケーションサーバ上でも JSF 2.0 を動作させる事ができるようになっています。

● Facelets による開発の利点
JSF 1.2 までは JSP で JSF を開発していました。しかし JSP で開発する際には、コンパイル時にオーバヘッドが掛かっていました。例えば、JSP のコードを編集したり、保存、ページの再読み込みのような処理を行うたびに、JSP コンパイラは Java の Servlet コードを生成し、コンパイルをを行っていました。これは JSP の Translation プロセスと呼ばれ、約1~2秒程のオーバヘッドが掛かっていました(サーバの処理能力に依存)。
一方、JSP と異なり、Facelets ページは Servlet にコンパイルされず、XML として処理を行います。そして Facelets は表示を行うために高速な SAX ベースのコンパイラを使用しています。また Facelets はページの変更等を即座に検知する事ができるため、JSF における開発効率が向上します。

■テンプレート機能
多くの Web サイトではページ間のデザインを統一するため、共通の表示部分を持たせる事が多いかと思います

例えば、共通のヘッダやフッダ、サイドバー等はページ間で統一したいかと思います。上記の Web ページでは下記のように共通部分を5つ(ヘッダ、左ペイン、右ペイン、フッダ、自由記載のコンテンツ領域)に分割する事ができます。

この内、「自由記載のコンテンツ領域」以外は全ページで同一コンテンツを表示したいと考えます。このような場合、作成するページ毎に共通部分(ヘッダ、フッダ等)を記載すると、開発効率やメンテナンス性が非常に悪くなります。このような重複コンテンツを効率よく扱うために、Facelets では「テンプレート機能」を持ち共通部分をテンプレート内に記載し、必要な部分だけを編集する事ができるようになっています。

PrimeFaces について
上記の画面は全て NetBeans 7.0 Beta に含まれる PrimeFaces を使用して作成しています。Oracle のホームページの画面に似せて作成してみましたが、PrimeFaces は非常にリッチな JSF のコンポーネントを提供していますので、簡単にこのようなリッチな JSF Web アプリケーションを作成する事ができます。PrimeFaces が提供している各種 JSF コンポーネントの詳細は下記をご参照ください。

ご参考:PrimeFaces ShowCase (提供されるコンポーネント一覧)

NetBeans 7.0 Beta で PrimeFaces を利用するためには、新規プロジェクトを作成する際、フレームワークの選択時に、「JavaServer Faces 」をチェックし「コンポーネント」より「PrimeFaces 2.1」を選択してください。

● プロジェクトの進め方とディレクトリ構成
今回、NetBeans 7.0 のプロジェクトを作成しますが、下記のような手順で画面を作成していきます。

1. ヘッダの作成
2. 左ペインの作成
3. 右ペインの作成
4. フッダの作成
5. テンプレートの作成
6. 各種ページの作成

ちなみに、プロジェクトのディレクトリ構成は下記のように作成しています。
「Web ページ」配下に「templates」ディレクトリを作成し、JSF のテンプレートファイル (1〜5) はすべてこのディレクトリ配下に作成します。

1. ヘッダ部分の作成

まず、ヘッダ部分を作成します。ヘッダ部分は PrimeFaces で提供されている MenuBar を利用します。

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form id="menue">
            <h:graphicImage url="/resources/images/Oracle_ja.gif"/>
            <p:menubar>
                <p:submenu label="製品">
                    <p:menuitem value="Oracle DataBase" url="http://www.oracle.com/jp/products/database/index.html">
                    </p:menuitem>
                    <p:menuitem value="Oracle Fusion Middleware" url="http://www.oracle.com/jp/products/middleware/index.html">
                    </p:menuitem>
                </p:submenu>

                <p:submenu label="ダウンロード">
                    <p:menuitem value="DataBase"></p:menuitem>
                    <p:menuitem value="DataBase 11g" url="http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html">
                    </p:menuitem>
                </p:submenu>

                <p:submenu label="価格/ライセンス">
                    <p:menuitem value="価格表" url="http://www.oracle.com/jp/corporate/pricing/pricing-pricelists-079522-ja.html">
                    </p:menuitem>
                </p:submenu>

                <p:submenu label="サポート">
                    <p:menuitem value="価格表" url="http://www.oracle.com/jp/corporate/pricing/pricing-pricelists-079522-ja.html">
                    </p:menuitem>
                </p:submenu>            

                <p:submenu label="研修/資格">
                    <p:menuitem value="価格表" url="http://www.oracle.com/jp/corporate/pricing/pricing-pricelists-079522-ja.html">
                    </p:menuitem>
                </p:submenu>            

                <p:submenu label="パートナー">
                    <p:menuitem value="価格表" url="http://www.oracle.com/jp/corporate/pricing/pricing-pricelists-079522-ja.html">
                    </p:menuitem>
                </p:submenu>            

                <p:submenu label="日本オラクルについて">
                    <p:menuitem value="価格表" url="http://www.oracle.com/jp/corporate/pricing/pricing-pricelists-079522-ja.html">
                    </p:menuitem>
                </p:submenu>            
            </p:menubar>

        </h:form>
    </h:body>
</html>

2. 左ペイン部分の作成
次に左ペインの部分を作成します。

左ペインの部分は PrimeFaces で提供されている Menu を利用します。

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <div class="leftString">
                <p:menu>  
                    <p:submenu label="Oracle Fusion Middleware">  
                        <p:menuitem value="アプリケーション・グリッド"/>
                        <p:menuitem value="アプリケーション統合アーキテクチャ"/>
                        <p:menuitem value="WebLogic Server"/>
                        <p:menuitem value="ビジネス・インテリジェンス"/>
                        <p:menuitem value="ビジネスプロセス管理"/>
                        <p:menuitem value="コラボレーション"/>
                        <p:menuitem value="コンテンツ管理"/>
                        <p:menuitem value="データ統合"/>
                        <p:menuitem value="開発ツール"/>
                        <p:menuitem value="イベント駆動アーキテクチャ"/>
                        <p:menuitem value="Exalogic"/>
                        <p:menuitem value="ID管理"/>
                        <p:menuitem value="インメモリ・データグリッド"/>
                    </p:submenu>
                </p:menu>
            </div>
        </h:form>
    </h:body>
</html>

3. 右ペイン部分の作成
次に右ペインの部分を作成します。

右ペインの部分は PrimeFaces で提供されている Accordion Panel を利用します。

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <div class="leftString">
                <p:accordionPanel autoHeight="false">  
                    <p:tab title="ダウンロード">
                        <h:panelGrid columns="2" cellpadding="10">
                            <h:outputText value="Oracle Universal Content Management"/>
                        </h:panelGrid>
                    </p:tab>
                    <p:tab title="サポート">  
                        <h:panelGrid columns="2" cellpadding="10">  
                            <h:outputText value="Oracle Support"/>
                            <h:outputText value="Advanced Customer Services"/>
                        </h:panelGrid>
                    </p:tab>
                    <p:tab title="技術情報">  
                        <h:panelGrid columns="2" cellpadding="10">  
                            <h:outputText value="Oracle Content Management"/>
                        </h:panelGrid>
                    </p:tab>
                    <p:tab title="パートナー">  
                        <h:panelGrid columns="2" cellpadding="10">  
                            <h:outputText value="Find Specialized partner"/>
                        </h:panelGrid>
                    </p:tab>
                    <p:tab title="カタログ/データシート">  
                        <h:panelGrid columns="2" cellpadding="10">  
                            <h:outputText value="Brochure: Oracle Content Management (PDF)"/>
                            <h:outputText value="Data Sheet: Unversal Content Management (PDF)"/>
                        </h:panelGrid>
                    </p:tab>
                    <p:tab title="ホワイトペーパー">  
                        <h:panelGrid columns="2" cellpadding="10">  
                            <h:outputText value="Information Workplace Platform: Oracle vs Microsoft(PDF)"/>
                            <h:outputText value="Get More from Microsoft SharePoint with Oracle Fusion Middleware (PDF)"/>
                        </h:panelGrid>
                    </p:tab>
                </p:accordionPanel> 
            </div>
        </h:form>
    </h:body>
</html>

4.フッダ部分の作成
次にフッダ部を作成します。

フッダ部分はちょっと手抜きですが、下記のように記述します。

<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>
        <div class="greyBarBottom"><!--footer--></div>
        <h:graphicImage url="/resources/images/oracle-footer-tagline.gif"/>
        <div class="footerString">
        会社情報 | オラクルとサン | Oracle RSS Feeds | Subscribe | 採用情報 | お問い合わせ | サイトマップ | ウェブサイトのご使用条件 | 個人情報保護基本方針 | 情報保護基本方針
        </div>
    </h:body>
</html>

5. JSF テンプレートの作成
次に、上記で作成した各共通部分を含むテンプレートを作成します。NetBeans のプロジェクトから「新規」→「その他…」を選択してください。

すると下記の画面が表示されます。ここで「Facelets テンプレート」を選択します。

選択すると下記の画面が表示されますので、レイアウトのスタイルを選択して「完了(F)」ボタンを押下します。


ボタンを押下するとテンプレートの雛形が生成されますので、これを編集して Facelets テンプレートを完成させます。ここでは、 <ui:include src=”./top.xhtml”/>、<ui:include src=”./left.xhtml”/>、<ui:include src=”./right.xhtml”/>、<ui:include src=”./bottom.xhtml”/> のタグを使ってそれぞれをテンプレートの適切な箇所に記載します。
「レイアウトスタイル:」で「表」をチェックした際のテンプレートの記載内容を下記に示します。(画面構成は自由にカスタマイズができます。)

<?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:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html">

    <h:head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <link href="./../resources/css/default.css" rel="stylesheet" type="text/css" />
        <link href="./../resources/css/tableLayout.css" rel="stylesheet" type="text/css" />
        <title>Facelets Template</title>
    </h:head>
    <h:body>
        <table cellspacing="10px">
            <tr>
                <td id="top" colspan="3">
                    <ui:insert name="top">
                        <ui:include src="./top.xhtml"/>
                    </ui:insert>
                </td>
            </tr>
            <tr>
                <td id="left">
                    <ui:insert name="left">
                        <ui:include src="./left.xhtml"/>
                    </ui:insert>
                </td>
                <td id="content">
                    <ui:insert name="content">Content</ui:insert>
                </td>
                <td id="right">
                    <ui:insert name="right">
                        <ui:include src="./right.xhtml"/>
                    </ui:insert>
                </td>
            </tr>
            <tr>
                <td id="bottom" colspan="3">
                    <ui:insert name="bottom">
                        <ui:include src="./bottom.xhtml"/>
                    </ui:insert>
                </td>
            </tr>
        </table>
    </h:body>
</html>

6. JSF テンプレートクライアント(表示用のページ)の作成

次に、テンプレートを利用した表示用のページを作成します。NetBeans のプロジェクトから「新規」→「その他…」を選択してください。

すると下記の画面が表示されます。ここで「Facelets テンプレートクライアント」を選択します。

ここで「テンプレート:」の「参照…」ボタンを押下してください。すると下記のように、テンプレートを選択するウィンドウが表示されます。

作成したテンプレート(tableTemplate2.xhtml)を選択し「ファイルを選択」ボタンを押下します。最後に「完了(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:ui="http://java.sun.com/jsf/facelets">
    
    <body>
        
        <ui:composition template="./templates/tableTemplate2.xhtml">
            
            <ui:define name="top">
                top
            </ui:define>

            <ui:define name="left">
                left
            </ui:define>

            <ui:define name="content">
                content
            </ui:define>

            <ui:define name="right">
                right
            </ui:define>

            <ui:define name="bottom">
                bottom
            </ui:define>

        </ui:composition>
        
    </body>
</html>

ここで「Facelets テンプレート」と「テンプレートクライアント」の関係を説明します。「Facelets テンプレート」の中身を確認すると下記のタグが記載されている事が確認できます。(それぞれ、17行目, 24行目, 29行目, 32行目, 39行目)

                    <ui:insert name="top">
                    <ui:insert name="left">
                    <ui:insert name="right">
                    <ui:insert name="content">Content</ui:insert>
                    <ui:insert name="bottom">

一方で、「テンプレートクライアント」の中身を確認すると下記のタグが記載されている事が確認できます。(それぞれ10行目, 14行目, 18行目, 22行目, 26行目)

        <ui:composition template="./templates/tableTemplate2.xhtml">
            <ui:define name="top">
            <ui:define name="left">
            <ui:define name="content">
            <ui:define name="right">
            <ui:define name="bottom">
        </ui:composition>

Facelets ではテンプレート中に記載されている <ui:insert name=”NAME”> の箇所をテンプレートクライアントの <ui:define name=”NAME”> で更新する事ができます。テンプレートの全てを変更したい場合は全て上書きする事ができますが(NetBeans で自動的に作成される上記の雛形は全てを上書きします)、自由記載のコンテンツ領域だけを編集したい場合は、下記のように必要な部分のみ(<ui:define name=”content”> のタグの部分だけを残してその部分のみ)を編集します。

<?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:ui="http://java.sun.com/jsf/facelets">
    
    <body>
        <ui:composition template="./templates/tableTemplate2.xhtml">
            <ui:define name="content">
                ここに「自由記載 コンテンツ領域」の内容を書きます。
            </ui:define>
        </ui:composition>
    </body>
</html>

テンプレートを使用して作成したコンテンツへアクセスすると下記の画面が表示されます。

JSF 2.0 の Facelets のテンプレート機能を効果的に利用すると Web ページの開発が効率化され、本当に必要な部分の開発にのみ集中できるようになります。また、NetBeans 7.0 Beta に含まれる PrimeFaces も非常にリッチな JSF コンポーネントが用意されていますので、見栄えのよい Web ページをかんたんに作成する事ができるようになります。

是非、お試しください。

本ページで使用した NetBeans 7.0 Beta のプロジェクトは下記より入手可能です。JSFSampleApplication.jar (NB7 プロジェクトファイルのアーカイブ)の入手はコチラ

余談:
上記、プロジェクトですが、web.xml の設定を Development にすると画面中に下記のワーニングが表示されます。(すいません、原因がつかめていません。)

The button/link/text component needs to have a Form in its ancestry. Please add <h:form>.
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>

下記のように、Production に変更するとワーニングは表示されません。

<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Production</param-value>

原因がわかったら追記します。

2011年1月14日 at 6:26 午後 1件のコメント

GlassFish v3.1 の新機能概要

先日の JavaFX & GlassFish 合同勉強会で発表した資料とデモを公開します。

また、デモを行った際の手順も下記に記載します。

GlassFish v3.1の入手はコチラから

WebSocket サンプルアプリケーションの入手はコチラから


zip 版 GlassFish をインストールする為、unzip してください。

# unzip latest-web.zip


次にドメインを起動します。下記のコマンドを実行してください。

# asadmin start-domain

 


次にクラスタを作成します。下記のコマンドを実行してください。

# asadmin create-cluster cluster1

 


次に、SSH で操作ができるようログインパスワード(相手ノードのパスワード)
を “AS_ADMIN_SSHPASSWORD”に設定し、setup-ssh サブコマンドを実行してください。
※ setup-ssh サブコマンドは後に出てくるパスワードエイリアスが使用できないため、この時点では相手システムのパスワードを生のテキストファイルに記載し、設定完了後削除してください。

④ ノードへのログインパスワード設定

# echo “AS_ADMIN_SSHPASSWORD=password” > /tmp/password

 
⑤ SSH 公開鍵・秘密鍵の作成(ローカル)、authroized_keys の作成(リモート)

下記のコマンドを実行するとホームディレクトリの.sshディレクトリ配下にid_rsa、id_rsa.pubの2ファイルを作成します。また相手システムのホームディレクトリ .sshディレクトリ配下にauthroized_keysを無ければ作成し、公開鍵を追加します。これにより、SSH 経由で処理ができるようになります。

# asadmin –passwordfile=/tmp/password –interactive=false setup-ssh –sshuser root –generatekey=true glassfish-node1


下記のコマンドを実行すると、ドメイン管理サーバから相手システムに GlassFish のバイナリをインストールします。

# asadmin install-node –installdir /usr/local/glassfish3 –sshuser root –sshkeyfile ~/.ssh/id_rsa glassfish-node1

 

⑦ パスワード・エイリアスの作成
GlassFish v3.1 からパスワードのエイリアスを使用できるようになりました。管理パスワードの他、DB 設定においても生テキストのパスワードを入力する必要がなくパスワード・エイリアスを使用してセキュアな管理ができるようになります。

# asadmin create-password-alias ssh-password

 

⑧ パスワードファイルの作成 (bash の場合)

# echo “AS_ADMIN_SSHPASSWORD=${ALIAS=ssh-password}” > /tmp/p


パスワードエイリアスを設定後、パスワードエイリアスを指定したパスワードファイルを使用して GlassFish のノードを作成します。

# asadmin –passwordfile /tmp/p create-node-ssh –nodehost glassfish-node1 –sshuser root –sshkeyfile ~/.ssh/id_rsa –installdir /usr/local/glassfish3 node1


ノード作成後、クラスタ(cluster1)に含まれるインスタンスを作成します。

# asadmin create-instance –node node1 –cluster cluster1 instance1

 

⑩’ JDK のインストールパスを設定
システムに応じては JDK のインストールパスが異なるため 必要な場合 JDK のインストールパスを設定します。

# asadmin set “configs.config.cluster1-config.java-config.java-home=/usr/jdk/jdk1.6.0_23”


インスタンスを作成しましたので、インスタンスを起動します。

# asadmin start-instance instance1

 

⑫ GlassFish インスタンスの一覧表示
list-instances サブコマンドでインスタンスの一覧を表示する事ができます。

# asadmin list-instances

 

⑬ Cluster に対する WebSocket の有効化
GlassFish v3.1 から WebSocket を利用できるようになりました。GlassFish v3.1 で WebSocket を有効化するためには下記のコマンドを実行してください。

# asadmin set configs.config.cluster1-config.network-config.protocols.protocol.http-listener-1.http.websockets-support-enabled=true

 

⑭ WebSocket サンプルアプリケーションの配備
冒頭で示した URL よりサンプルアプリケーションを入手しデプロイしてください。

# asadmin deploy –target cluster1 grizzly-websockets-chat-1.9.26.war

2010年12月21日 at 9:24 午前 1件のコメント

EJB 3.1 の Singleton はインスタンス単位で有効

皆様、本件につきまして皆様に誤解を与え大変申し訳ございませんでした。
過去、私が Java EE 6 の EJB 3.1 で Singleton クラスについて説明した際、Singleton クラスは異なるJavaVM(クラスタ環境)で1インスタンスを保証すると説明しておりました。このページで説明する資料の P30 など。しかしながら、EJB 3.1 の仕様を改めて確認した所、下記の記載がございました。

JSR 318: Enterprise JavaBeansTM,Version 3.1
4.8 Singleton Session Beans
A Singleton session bean is a session bean component that is instantiated once per application. In cases where the container is distributed over many virtual machines, each application will have one bean instance of the Singleton for each JVM.

当初、GlassFish v3.1 でクラスタを跨ぐ Singleton をサポートする計画で開発が進められていた事を知っていた事もあって上記解釈を間違えてしまいました。
上記の事実は GlassFish v3.1 の EJB の拡張部分について確認していた際、クラスタ環境での Singleton をサポートしないという下記の記載があり気付き、再度上記仕様を確認致しました。

EJB 3.1 Singleton support
No new work is needed to support the EJB 3.1 spec behavior of per-JVM singleton instance creation. We evaluated using the EJB Singleton component as the basis of a new per-cluster Singleton, but the programming model is not a good fit.

GlassFish Issue Tracker
上記 Issue Tracker にも Singleton はクラスタ単位で作成されるのではなくそれぞれのインスタンス(JVM)単位で作成される事が明記されております。
また、この情報は高可用性管理ガイド、アプリケーション開発ガイド、アプリケーション配備ガイドに記載する旨記載されておりました。

本件につきまして私の誤解から間違えた内容を伝えてしまった事を心よりお詫び申し上げます。

2010年12月15日 at 12:57 午前

過去の投稿 新しい投稿


Java Champion & Evangelist

Translate

ご注意

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

カレンダー

2022年11月
 123456
78910111213
14151617181920
21222324252627
282930  

カテゴリー

Twitter

clustermap

ブログ統計情報

  • 1,256,318 hits

RSSフィード

アーカイブ