タグのついた投稿Java EE

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”>
(例: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”);

Add comment 2010年3月14日

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 機能」 のエントリをご参照ください。

Add comment 2010年3月14日

ここから始める 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 セッション Bean の作成

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

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

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

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

EJB 3.0

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

1: public interface Hello {
2:   public String sayHello();
3: }
4:
5: @Stateless
6: public class HelloBean implements Hello {
7:   public String sayHello() { return “hello”; }
8: }

EJB の利用時
1: @EJB Hello helloRef;
2: …
3: 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ファイル

2 comments 2010年2月26日

Java EE 6 / GlassFish v3 の仮想カンファレンス開催







Java EE 6 / GlassFish v3 に関連した仮想カンファレンス開催が

2009年12月15日 (日本時間:12/16 夜中 AM1:00 から)されます。

各セッションは30分〜1時間で開催される予定です。

日本の方は、真夜中から明け方までになるのでその時間帯で、

見ることはできないと思うのですが、今海外のエンジニアに

録画して後から見れるようにして欲しいと要望をだしていますので、

もし、録画されたらそちらを見てみてください。




詳細はコチラ




● Java EE: The Foundation for Your Business (Keynote)

● Java EE 6: An Overview (Keynote)

● GlassFish v3 – Java EE 6 Reference Implementation & Beyond (Keynote)

● Enterprise Java Beans (EJB) 3.1 Features

● Jersey, JAX-RS and REST with GlassFish v3

● Servlet 3.0

● Java Persistence API (JPA) 2.0

● Java Server Faces (JSF) 2.0

● Web Services in GlassFish

● Context Dependency and Injection (JSR 299)

● OSGi in GlassFish v3

● Dynamic Languages with GlassFish v3

● Tools for GlassFish v3: NetBeans and Eclipse

● Grizzly: NIO & Web Framework. Comet using GlassFish

● Monitoring, Management in GlassFish v3



日本時間では明日には、GlassFish の FCS(First Customer Shipment) 版がいよいよリリースされます。

また、GA(General Availability) 版はクリスマス前にはリリースされるかと思います。

年末まで各種イベントが目白押しですが、Sun の GlassFish ブロガー達が数多くの情報を

発信します。



是非、下記のタグもご参照ください。



http://blogs.sun.com/main/tags/glassfish

Add comment 2009年12月9日

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 バンドルを作成し利用するデモは今まで情報が

少なかったので、是非自分の目でご覧頂ければと思います。


Add comment 2009年6月5日

Java EE 6 チュートリアル







Java EE 6 のチュートリアルが下記の URL で公開されています。



http://java.sun.com/javaee/6/docs/tutorial/doc/index.html



JAX-RS 等まだ記載されていない箇所もありますが、

Java EE 6 を試したい方は是非ご利用ください。


Add comment 2009年6月3日

Java EE 6のパブリックレビューが承認



Java EE 6の承認がおりたみたいですね。



JavaOne 2009まで残り4ヶ月ですが、

JavaOne 2009の目玉になりそうですね。




JSR #316 JavaTM Platform, Enterprise Edition 6 (Java EE 6) Specification

Public Review Ballot




PS.

時期的に、残り4ヶ月で GlassFish v3(Java EE 6のRI) が

完成するかどうかは微妙ですが、是非開発者の皆様

頑張ってほしいです。


Add comment 2009年2月25日


カレンダー

2010年9月
« 8月    
 12345
6789101112
13141516171819
20212223242526
27282930  

カテゴリー

タグクラウド

Administration Atmosphere Comet Crypto Framework Eclipse Enterprise Manager GlassFish GlassFish ESB GlassFish Portfolio GlassFish v3 Prelude Grizzly Hudson ICEfaces Java JavaEE Java EE Java New I/O JavaOne Java Werehouse JPA Kenai Load Balancer MySQL Non Blocking I/O OpenSSL Oracle OSGi Performance Advisor RESTful SailFin Servlet Sun Terracotta Tomcat v3 Web Server WebSpace Server WebStack WebSynergy Web サービス ここから始める インスタンス クライアント認証 プレゼン一覧 採用事例

最近の投稿

Twitter

過去の人気記事

ブログ統計情報

RSSフィード

アーカイブ

ブログ管理