<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>寺田　佳央 - Yoshio Terada &#187; NetBeans</title>
	<atom:link href="http://yoshio3.com/tag/netbeans/feed/" rel="self" type="application/rss+xml" />
	<link>http://yoshio3.com</link>
	<description>GlassFish Web Server Java</description>
	<lastBuildDate>Fri, 25 May 2012 05:58:43 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='yoshio3.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/759d6ca62cbc626125def86454247b76?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>寺田　佳央 - Yoshio Terada &#187; NetBeans</title>
		<link>http://yoshio3.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://yoshio3.com/osd.xml" title="寺田　佳央 - Yoshio Terada" />
	<atom:link rel='hub' href='http://yoshio3.com/?pushpress=hub'/>
		<item>
		<title>ここから始める Java EE 6</title>
		<link>http://yoshio3.com/2010/02/26/%e3%81%93%e3%81%93%e3%81%8b%e3%82%89%e5%a7%8b%e3%82%81%e3%82%8b-java-ee-6-2/</link>
		<comments>http://yoshio3.com/2010/02/26/%e3%81%93%e3%81%93%e3%81%8b%e3%82%89%e5%a7%8b%e3%82%81%e3%82%8b-java-ee-6-2/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 06:33:12 +0000</pubDate>
		<dc:creator>Yoshio Terada</dc:creator>
				<category><![CDATA[Application Server/GlassFish]]></category>
		<category><![CDATA[GlassFish]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Java EE]]></category>
		<category><![CDATA[NetBeans]]></category>

		<guid isPermaLink="false">http://yoshio3.com/?p=713</guid>
		<description><![CDATA[2009年12月に Java EE 6 がリリースされて、約３ヶ月経ちました。Java EE 6 にはかなり多 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoshio3.com&#038;blog=11776107&#038;post=713&#038;subd=yoshioterada&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>2009年12月に Java EE 6 がリリースされて、約３ヶ月経ちました。Java EE 6 にはかなり多くの改善がみられますが、どこから始めればいいのかわからない方に、JSF2,JPA2,EJB 3.1を使ったかんたんな Java EE 6 アプリケーションの書き方を紹介します。</p>
<p>Java EE 6 には非常にたくさんの技術が含まれているので一度に全てを理解することは大変だと思いますが、まずはこのサンプルを通じて、JSF,JPA,EJB にどのような変更が加わったのか、またどのような点が楽になったのか等を理解して頂ければと思います。</p>
<table border="1">
<tbody>
<tr>
<td>開発／実行環境：<br />
開発環境：NetBeans 6.8<br />
実行環境：Oracle GlassFish Server v3</td>
</tr>
</tbody>
</table>
<p>（上記は別途インストールしておいてください。）</p>
<h2>サンプルアプリケーションの概要：</h2>
<p>コードを書く前にこれから作成するサンプルアプリケーションの概要について説明します。このアプリケーションはとても簡単なアプリケーションでユーザ（データ）を登録して参照するだけという、いたってかんたんなアプリケーションです。また処理フローもとてもシンプルです。</p>
<p><a href="http://farm3.static.flickr.com/2716/4387372234_59d91e8709_o.png"><img title="サンプルアプリケーションの処理フロー" src="http://farm3.static.flickr.com/2716/4387372234_99c6ec3a79.jpg" alt="サンプルアプリケーションの処理フロー" width="375" height="196" /></a></p>
<p>アプリケーションの完成予想イメージは下記です。ユーザ登録画面で「作成」ボタンを押下しデータを登録した後、一覧表示画面が表示されます。また一覧表示画面中の「新規作成」のリンクを押下すると登録画面に遷移します。</p>
<p><img title="サンプルアプリケーションの完成イメージ" src="http://farm5.static.flickr.com/4043/4386609853_50e184f4bb_o.png" alt="サンプルアプリケーションの完成イメージ" width="436" height="208" /></p>
<h2>１．新規プロジェクトの作成</h2>
<p>それでは早速プロジェクトを作成していきます。今回作成するアプリケーションは、EJBを含んでいますが新規プロジェクトの作成時「Web アプリケーション」を選択して作成することにします。</p>
<table border="1" bgcolor="GRAY">
<tbody>
<tr>
<td><span style="color:white;">補足：<br />
Java EE 6 におけるパッケージ構成の変更点を紹介します。過去の Java EE のバージョンでは下記のように EJB を ear にまとめたり、JSF/Servlet 等を war にまとめたりといったようにパッケージ構成が面倒でした。Java EE 6 からはこのようなパッケージ化の必要はなくなり、EJB も war に含めてデプロイできるようになりました。&nbsp;</p>
<p><a href="http://farm5.static.flickr.com/4055/4386609663_1b3c881cd6_o.png"><img title="パッケージの簡略化" src="http://farm5.static.flickr.com/4055/4386609663_8de10a5c23.jpg" alt="パッケージの簡略化" width="375" height="280" /></a></p>
<p></span></td>
</tr>
</tbody>
</table>
<p>それでは、メニューから「ファイル」→「新規プロジェクト(W)…」→「Java Web」→「Web アプリケーション」を選択し、「次へ＞」ボタンを押下してください。</p>
<p><a href="http://farm5.static.flickr.com/4061/4387371496_8635dda665_o.png"><img title="新規プロジェクトの作成" src="http://farm5.static.flickr.com/4061/4387371496_939e506cef.jpg" alt="新規プロジェクトの作成" width="500" height="345" /></a></p>
<p>プロジェクト名に「PersonManagement」を入力し「次へ＞」ボタンを押下します。</p>
<p><a href="http://farm5.static.flickr.com/4018/4386609217_280471ee85_o.png"><img title="新規プロジェクト作成" src="http://farm5.static.flickr.com/4018/4386609217_d95e3abdbd.jpg" alt="新規プロジェクト作成" width="500" height="280" /></a></p>
<p>次に、「サーバと設定」で配備するアプリケーションサーバとJava EE のバージョンを選択します。ここでは、「GlassFish v3 ドメイン」と「Java EE 6 Web」を選択し「次へ＞」ボタンを押下します。</p>
<p><a href="http://farm3.static.flickr.com/2801/4387371578_d881500f9e_o.png"><img title="稼働サーバとフレームワークの選択" src="http://farm3.static.flickr.com/2801/4387371578_fa4474d953.jpg" alt="稼働サーバとフレームワークの選択" width="500" height="280" /></a></p>
<p>次に、使用するフレームワークを選択します。今回は、「JavaServer Fcaces」を使用しますのでこれにチェックを付け「完了(F)」ボタンを押下します。</p>
<p><a href="http://farm3.static.flickr.com/2792/4386609291_6cf11359ca_o.png"><img title="フレームワークの選択" src="http://farm3.static.flickr.com/2792/4386609291_cca7d30341.jpg" alt="フレームワークの選択" width="500" height="280" /></a></p>
<p>プロジェクトを作成すると下記のような画面が表示されます。</p>
<p><a href="http://farm5.static.flickr.com/4033/4387371682_2b76c4570a_o.png"><img title="プロジェクト作成完了" src="http://farm5.static.flickr.com/4033/4387371682_243467ab86.jpg" alt="プロジェクト作成完了" width="500" height="332" /></a></p>
<h2>２． JPA 2.0：Entity Bean の作成</h2>
<p>新規プロジェクトを作成後、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と同等レベルの記述内容）</p>
<p>それでは、実際に Entity Bean を作成してみましょう。メニューから「ファイル」→「新規ファイル(N)…」→「持続性」を選択してください。</p>
<p>NetBeans を利用すると既存のデータベースのテーブルから Entity クラスを自動的に生成する事ができます。既に DB テーブルを作成している場合は「データベースからのエンティティークラス」を選択して作成してください。NetBeans を使う上で、この機能は大変便利です。私も普段は先に DB のテーブルを作成して、Entity クラスは NetBeans で自動生成しますので一から Entity クラスを作成する事はあまりしません。是非お試しください。</p>
<p>今回、私は DB のテーブルが作成されていない状態で新規にエンティティークラスを生成しますので「エンティティークラス」を選択し「次へ＞」ボタンを押下します。この方法では、エンティティークラスを先に作成した後、エンティティクラスに該当するテーブルを DB 上に後から構築します（Entity クラスを元にテーブルを自動生成することもできます）。</p>
<p><a href="http://farm5.static.flickr.com/4051/4387371716_03dab5379c_o.png"><img title="エンティティークラスの作成" src="http://farm5.static.flickr.com/4051/4387371716_070ef86ef8.jpg" alt="エンティティークラスの作成" width="500" height="345" /></a></p>
<p>ここで新しいエンティティークラス名「Person」、パッケージ名「ent」を入力します。「主キー型」はこのテーブルの主キーの型を選択します。Person を ID で管理しますので、そのまま、「Long」型を設定します。</p>
<p><a href="http://farm5.static.flickr.com/4042/4386609403_ebb3d06991_o.png"><img title="エンティティクラスの作成" src="http://farm5.static.flickr.com/4042/4386609403_f35a2c9768.jpg" alt="エンティティクラスの作成" width="500" height="345" /></a></p>
<p>「完了(F)」ボタンを押下する前に１点注意してください。ワーニングで「プロジェクトに持続性ユニットがありません。エンティティークラスを持続さ…」というメッセージが表示されています。これはこのエンティティクラスに対する持続性ユニットが存在していない事を意味しています。そこで「持続性ユニットを作成…」ボタンを押下し、このエンティティクラスに紐づく持続性ユニットを作成します。ボタンを押下すると下記の画面が表示されます。</p>
<p><a href="http://farm5.static.flickr.com/4034/4386609437_dca07c0f69_o.png"><img title="持続性ユニットの作成" src="http://farm5.static.flickr.com/4034/4386609437_3ca1fc865b.jpg" alt="持続性ユニットの作成" width="500" height="317" /></a></p>
<p>持続性プロバイダとして JPA 2.0 の参照実装である「EclipseLink(JPA 2.0)(デフォルト)」と、データソースを選択します。また表生成の方針ですが、「作成」を選択すると自動的に DB にテーブルを作成します。全ての入力が完了した後、最後に「作成」ボタンを押下します。<br />
この時、後のプログラミング時に使用しますので、入力した持続性ユニット名（PersonManagementPU）を覚えておいてください。</p>
<p>「作成」ボタンを押下すると、「新規エンティティ作成画面」に戻ってきますが、持続性ユニットに関するワーニングが消えたことを確認した後、最後に「完了(F)」ボタンを押下してください。ボタンを押下すると入力された情報を元に ID のみを持つ Person エンティティのひな形が自動生成されます。また同時に、構成ファイル配下に、持続性ユニットの設定ファイル persistence.xmlが自動生成されます。</p>
<p>作成された Entity クラス(Person)のひな形を編集していきます。</p>
<p>ソースコードを確認すると @Entity のアノテーションが自動的に付加されている事に気づきます。このアノテーションを付加することによりコンパイラや、EJB コンテナが本クラスをエンティティクラスと解釈してくれるようになります。</p>
<p>名前、住所、電話番号、年齢をあつかえるようにフィールドを追加し、それぞれに対するセッタ、ゲッタメソッドを記載してください。また、@NamedQuery で JPQL を記載し、DBに登録されている全ての Person を取得できるようにします。</p>
<p><pre class="brush: java;">
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;&amp;nbsp;

@Entity
@NamedQuery(name=&quot;findAllPerson&quot;, query=&quot;SELECT p FROM Person p&quot;)
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;&amp;amp; other.id != null) || (this.id != null &amp;amp;&amp;amp; !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return &quot;entity.Person[id=&quot; + id + &quot;]&quot;;
    }

    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;
    }
}
</pre></p>
<p>以上で、このサンプルアプリケーションに必要なエンティティクラスはできました。</p>
<h2>３．EJB 3.1：ステートレスセッション Bean の作成</h2>
<p>エンティティクラスを生成したので、次に EJB (ステートレス・セッション Bean) を作成します。「ファイル」→「新規ファイル(N)…」→「Java EE」→「セッション Bean」を選択し、「次へ＞」ボタンを押下してください。</p>
<p><a href="http://farm5.static.flickr.com/4014/4386609481_fdee49cab3_o.png"><img title="EJB セッション Bean の作成" src="http://farm5.static.flickr.com/4014/4386609481_d265ee31c9.jpg" alt="EJB セッション Bean の作成" width="500" height="345" /></a></p>
<p>ボタンを押下すると下記の画面が表示されます。ここで「EJB 名(N)」、「パッケージ(K)」を入力し「完了(F)」ボタンを押下します。</p>
<p><a href="http://farm5.static.flickr.com/4015/4386609511_72bed28a52_o.png"><img title="ステートレスセッション Bean の作成" src="http://farm5.static.flickr.com/4015/4386609511_c83e412d8e.jpg" alt="ステートレスセッション Bean の作成" width="500" height="345" /></a></p>
<table border="1" bgcolor="GRAY">
<tbody>
<tr>
<td><span style="color:white;">補足：<br />
上記画面を確認するとローカルインタフェース、リモートインタフェースが選択できるようになっています。<br />
EJB 3.1 からローカルインタフェースがオプション化されインタフェースを作成する必要がなくなりました。EJB 3.0 では下記の例のようにインタフェースを定義し、それを実装しなければなりませんでしたが、EJB 3.1 からはアノテーションを付加するだけでコンテナが理解してくれるようになります。&nbsp;</p>
<p>EJB 3.0 でのローカルインタフェースの実装例</p>
<p><img title="EJB 3.0" src="http://farm5.static.flickr.com/4069/4387372066_d7bb3f0d1b.jpg" alt="EJB 3.0" width="375" height="280" /></p>
<p>実際にコードで書くと下記のようになります。<br />
<pre class="brush: java;">
public interface Hello {
    public String sayHello();
}

@Stateless
public class HelloBean implements Hello {
    public String sayHello() { return &quot;hello&quot;; }
}

EJB の利用時

@EJB Hello helloRef;
    ...
    helloRef.sayHello();
</pre></p>
<p>これが、EJB 3.1 では下記のようにインタフェースを定義する必要はなくなります。</p>
<p style="text-align:center;">&nbsp;</p>
<p><img title="EJB 3.1" src="http://farm5.static.flickr.com/4003/4387372112_465d84a623.jpg" alt="EJB 3.1" width="375" height="280" /></p>
<p>EJB 3.1 を利用する時のコードは下記となります。</p>
<p><img title="EJB 3.1" src="http://farm5.static.flickr.com/4018/4387372136_dafbfa7429.jpg" alt="EJB 3.1" width="375" height="280" /></p>
<p></span></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>それではコードを編集していきましょう。今回は、データの検索と追加を行いますので、それぞれの処理を行う２つのメソッドを実装しています。まず、@PersistenceContextのアノテーションで、（JPA Entity クラスを作成した時に作成した持続性ユニット名。persistence.xml に記載されている。）持続性ユニット名(&#8220;PersonManagementPU&#8221;)を記載します。これにより持続機能を持った EntityManager のオブジェクト(em)がセットされます。<br />
<pre class="brush: java;">
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=&quot;PersonManagementPU&quot;)
    private EntityManager em;

    public List&lt;Person&gt; findAllPersons(){
    //Entity(Person)クラスの @NamedQuery の記載に基づき検索
        Query query = em.createNamedQuery(&quot;findAllPerson&quot;);
        return (List&lt;Person&gt;) query.getResultList();
    }

    public Person createPerson(Person person){
        em.persist(person);
        return person;
    }
}
</pre></p>
<h2>４．JSF：Managed Bean の作成</h2>
<p>EJBと、Entity を作成したので、JSF から利用する Managed Bean を作成しましょう。「ファイル」→「新規ファイル(N)…」→「JavaServer Faces」→「JSF 管理対象 Bean」を選択し「次へ＞」ボタンを押下してください。</p>
<p><a href="http://farm5.static.flickr.com/4024/4389244246_afaffca9c6_o.png"><img class="aligncenter" title="Managed Bean の作成" src="http://farm5.static.flickr.com/4024/4389244246_68eac73ca5.jpg" alt="" width="500" height="424" /></a></p>
<p>「クラス名(N)」、「パッケージ(K)」を入力し「完了(F)」ボタンを押下します。</p>
<table border="1" bgcolor="GRAY">
<tbody>
<tr>
<td><span style="color:white;">補足：<br />
JSF 2.0 からは下記のような faces-config.xml の設定ファイルがオプション化されました。そこで Managed Bean の設定や画面遷移を XML ファイルに記載する必要はなく、アノテーションを利用しプログラム上で実現することができるようになりました。&nbsp;</p>
<p>JSF1.2 までの faces-confg.xml の設定例：</p>
<table border="1">
<tbody>
<tr>
<td><span style="color:white;"> &lt;managed-bean&gt;<br />
&lt;managed-bean-name&gt;PersonController&lt;/managed-bean-name&gt;<br />
&lt;managed-bean-class&gt;PersonController&lt;/managed-bean-class&gt;<br />
&lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;<br />
&lt;/managed-bean&gt;<br />
&lt;navigation-rule&gt;<br />
&lt;from-view-id&gt;/foo.jsp&lt;/from-view-id&gt;<br />
&lt;navigation-case&gt;<br />
&lt;from-outcome&gt;ok&lt;/from-outcome&gt;<br />
&lt;to-view-id&gt;/bar.jsp&lt;/to-view-id&gt;<br />
&lt;/navigation-case&gt;<br />
&lt;/navigation-rule&gt;</span></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p></span></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>コードを編集していきましょう。作成するクラスが Managed Bean であることをコンテナに理解させるため、@ManagedBean のアノテーションを利用します。アノテーションを指定する際、&#8221;name&#8221; 属性は必須で Managed Bean を識別する名前を入力します。</p>
<p><pre class="brush: java;">
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=&quot;PersonController&quot;)
@RequestScoped
public class PersonController {

    public PersonController() {
    }

    @EJB
    private PersonEJB personEJB;

    private Person person = new Person();
    private List&lt;Person&gt; personList = new ArrayList&lt;Person&gt;();

    //Facelets の action=&quot;#{PersonController.doNew} により画面遷移
    public String doNew(){
        return &quot;createPerson.xhtml&quot;;
    }

    //Facelets の action=&quot;#{PersonController.doCreatePerson} により画面遷移
    public String doCreatePerson(){
        //画面から入力された Person を DB に登録
        setPerson(personEJB.createPerson(getPerson()));
        //DB に登録されている全 Person を personList に設定
        setPersonList(personEJB.findAllPersons());
        return &quot;listPersons.xhtml&quot;;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public List&lt;Person&gt; getPersonList() {
        return personList;
    }

    public void setPersonList(List&lt;Person&gt; personList) {
        this.personList = personList;
    }
}
</pre></p>
<h2>５．JSF 2.0: ベージの作成</h2>
<p>最後に、表示画面を作成します。JSF 2.0 から facelet を xhtml で記載できるようになりました。</p>
<p>「ファイル」→「新規ファイル(N)…」→「JavaServer Faces」を選択し「次へ＞」ボタンを<br />
押下してください。</p>
<p><a href="http://farm5.static.flickr.com/4059/4386609553_06f663cb7f_o.png"><img title="JSF 表示画面の作成" src="http://farm5.static.flickr.com/4059/4386609553_bd22b79bcc.jpg" alt="JSF 表示画面の作成" width="500" height="345" /></a></p>
<p>ファイル名 (createPerson.xhtml) を入力すると自動的に .xhtml の拡張子が付加されます、最後に「完了(F)」ボタンを押下します。</p>
<p><a href="http://farm5.static.flickr.com/4028/4387371960_aea70110bb_o.png"><img title="JSF 表示画面の作成" src="http://farm5.static.flickr.com/4028/4387371960_5e6b798339.jpg" alt="JSF 表示画面の作成" width="500" height="297" /></a></p>
<p>自動生成されたひな形を編集して下記のコードを記載してください。Facelets で扱えるタグ等は別途紹介する予定ですが、みていただければわかるとおり、HTML も記載する事ができますし、スタイルシート等を記載することも可能です。また、JSF 2.0 から Ajax をサポートしていますので、Ajax のコードを利用してサーバと通信する事もできるようになります。<br />
<pre class="brush: xml;">
&lt;?xml version='1.0' encoding='UTF-8' ?&gt;
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;
      xmlns:h=&quot;http://java.sun.com/jsf/html&quot;&gt;
      &lt;h:head&gt;
        &lt;title&gt;Facelet Title&lt;/title&gt;
    &lt;/h:head&gt;
    &lt;h:body&gt;
        &lt;h:form&gt;
            &lt;table&gt;
                &lt;tr&gt;
                    &lt;td&gt;
                &lt;h:outputLabel value=&quot;名前：&quot;/&gt;
                &lt;/td&gt;
                &lt;td&gt;
                &lt;h:inputText value=&quot;#{PersonController.person.name}&quot;/&gt;
                &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td&gt;
                &lt;h:outputLabel value=&quot;住所&quot;/&gt;
                &lt;/td&gt;
                &lt;td&gt;
                &lt;h:inputText value=&quot;#{PersonController.person.address1}&quot;/&gt;
                &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td&gt;
                &lt;h:outputLabel value=&quot;電話番号&quot;/&gt;
                &lt;/td&gt;
                &lt;td&gt;
                &lt;h:inputText value=&quot;#{PersonController.person.telephone}&quot;/&gt;
                &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td&gt;
                &lt;h:outputLabel value=&quot;年齢&quot;/&gt;
                &lt;/td&gt;
                &lt;td&gt;
                &lt;h:inputText value=&quot;#{PersonController.person.age}&quot;/&gt;
                &lt;/td&gt;
                &lt;/tr&gt;
            &lt;/table&gt;
            &lt;h:commandButton value=&quot;作成&quot; action=&quot;#{PersonController.doCreatePerson}&quot;/&gt;
        &lt;/h:form&gt;
    &lt;/h:body&gt;
&lt;/html&gt;
</pre></p>
<p>最後に、登録された一覧を表示する画面を作成します。<br />
「ファイル」→「新規ファイル(N)…」→「JavaServer Faces」を選択し「次へ＞」ボタンを<br />
押下してください。</p>
<p><a href="http://farm5.static.flickr.com/4059/4386609553_06f663cb7f_o.png"><img title="JSF 表示画面の作成" src="http://farm5.static.flickr.com/4059/4386609553_bd22b79bcc.jpg" alt="JSF 表示画面の作成" width="500" height="345" /></a></p>
<p>ファイル名(listPersons)を入力し「完了(F)」ボタンを押下します。</p>
<p><pre class="brush: xml;">
&lt;?xml version='1.0' encoding='UTF-8' ?&gt;
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;
      xmlns:h=&quot;http://java.sun.com/jsf/html&quot;
      xmlns:f=&quot;http://java.sun.com/jsf/core&quot;&gt;
      &lt;h:head&gt;
        &lt;title&gt;Facelet Title&lt;/title&gt;
    &lt;/h:head&gt;
    &lt;h:body&gt; 

        &lt;h:dataTable value=&quot;#{PersonController.personList}&quot; var=&quot;psn&quot; border=&quot;1&quot;&gt;
            &lt;h:column&gt;
                &lt;f:facet name=&quot;header&quot;&gt;
                    &lt;h:outputText value=&quot;名前&quot;/&gt;
                &lt;/f:facet&gt;
                &lt;h:outputText value=&quot;#{psn.name}&quot;/&gt;
            &lt;/h:column&gt;

            &lt;h:column&gt;
                &lt;f:facet name=&quot;header&quot;&gt;
                    &lt;h:outputText value=&quot;住所&quot;/&gt;
                &lt;/f:facet&gt;
                &lt;h:outputText value=&quot;#{psn.address1}&quot;/&gt;
            &lt;/h:column&gt;

            &lt;h:column&gt;
                &lt;f:facet name=&quot;header&quot;&gt;
                    &lt;h:outputText value=&quot;電話番号&quot;/&gt;
                &lt;/f:facet&gt;
                &lt;h:outputText value=&quot;#{psn.telephone}&quot;/&gt;
            &lt;/h:column&gt;

            &lt;h:column&gt;
                &lt;f:facet name=&quot;header&quot;&gt;
                    &lt;h:outputText value=&quot;年齢&quot;/&gt;
                &lt;/f:facet&gt;
                &lt;h:outputText value=&quot;#{psn.age}&quot;/&gt;
            &lt;/h:column&gt;
        &lt;/h:dataTable&gt;
        &lt;h:form&gt;
            &lt;h:commandLink action=&quot;#{PersonController.doNew}&quot;&gt;
                新規作成&lt;/h:commandLink&gt;
        &lt;/h:form&gt;
    &lt;/h:body&gt;
&lt;/html&gt;
</pre></p>
<p>以上で、このアプリケーションの実装は完了です。</p>
<p>NetBeans のメニューより「実行(R)」→「主プロジェクトを実行(R)」を選択してください。実行すると自動的にブラウザがオープンしアプリケーションのデフォルトのコンテンツが表示されます。</p>
<p><a href="http://farm5.static.flickr.com/4070/4389319682_013e0fd31a_o.png"><img class="aligncenter" title="デフォルトページ" src="http://farm5.static.flickr.com/4070/4389319682_c7d13bfbac.jpg" alt="" width="500" height="488" /></a></p>
<p>コンテキストルートでアクセスされた時のデフォルトページを変更したい場合は、web.xml ファイルを編集する必要があります。下記のように welcome-file-list を編集してください。</p>
<p><span style="text-decoration:underline;">web.xml の編集</span></p>
<table border="1">
<tbody>
<tr>
<td>&lt;welcome-file-list&gt;<br />
&lt;welcome-file&gt;faces/createPerson.xhtml&lt;/welcome-file&gt;<br />
&lt;/welcome-file-list&gt;</td>
</tr>
</tbody>
</table>
<p>設定を変更した後、もう一度プロジェクトを実行してください。すると下記のように自動的に登録画面が表示されるようになります。</p>
<p><a href="http://farm5.static.flickr.com/4052/4389309630_f8b14d0cf0_o.png"><img class="aligncenter" title="登録画面" src="http://farm5.static.flickr.com/4052/4389309630_1074f55616.jpg" alt="" width="500" height="488" /></a></p>
<p>データを入力して「作成」ボタンを押下してみましょう。下記のように一覧表示画面が表示されれば問題はありません。</p>
<p><a href="http://farm3.static.flickr.com/2743/4388541601_90f8db122b_o.png"><img class="aligncenter" title="一覧表示画面" src="http://farm3.static.flickr.com/2743/4388541601_c5712bdabe.jpg" alt="" width="500" height="488" /></a></p>
<p>最後に、エラーハンドリングについて紹介します。例外が発生した際に特定のエラーページにリダイレクトさせるようにweb.xml の&lt;error-page&gt; タグを記載する必要があります。&lt;exception-type&gt;で、ハンドリングした例外毎にエラーページを表示させる事が可能です。本番環境においては、少なくとも JSF で発生する例外の親である javax.servlet.ServletException を記載してください。</p>
<p><span style="text-decoration:underline;">web.xml の編集</span></p>
<table border="1">
<tbody>
<tr>
<td>&lt;error-page&gt;<br />
&lt;exception-type&gt;javax.servlet.ServletException&lt;/exception-type&gt;<br />
&lt;location&gt;/error.xhtml&lt;/location&gt;<br />
&lt;/error-page&gt;</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>以上で、今回の Java EE 6 のアプリケーション作成は終了です。NetBeans を利用するとウィザードを使って、コードのひな形を作成してくれたり、また設定も極力 XML ファイルを手動で編集しなくても済むようになります。是非お試しください。今回紹介したサンプルは Java EE 6 を利用する上で最も基本的な構成と思います、上記の例を元に色々と修正を加え、DI/CDI や Bean Validation 等を加えて Java EE 6 の機能を是非色々と試してみてください。</p>
<p>最後に、私の環境で作成したNetBeans 6.8 のプロジェクトを下記から入手できるようにしました。<br />
(※ Sun の mediacast.sun.com サイトにファイルをアップロードしていますので、<br />
仮にこのサイトが閉鎖してしまった場合は申し訳ありませんがご了承ください。)</p>
<p>●　<a href="http://mediacast.sun.com/users/yosshi/media/PersonManageNBProject.jar">NetBeans 6.8 のプロジェクト(ソース、設定ファイル等を含む)</a><br />
●　<a href="http://mediacast.sun.com/users/yosshi/media/PersonManagement.war">GlassFish v3 配備用 WARファイル</a></p>
<br />カテゴリー:<a href='http://yoshio3.com/category/application-serverglassfish/'>Application Server/GlassFish</a>, <a href='http://yoshio3.com/category/glassfish/'>GlassFish</a>, <a href='http://yoshio3.com/category/java/'>Java</a> Tagged: <a href='http://yoshio3.com/tag/glassfish/'>GlassFish</a>, <a href='http://yoshio3.com/tag/java-ee/'>Java EE</a>, <a href='http://yoshio3.com/tag/netbeans/'>NetBeans</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yoshioterada.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yoshioterada.wordpress.com/713/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yoshioterada.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yoshioterada.wordpress.com/713/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yoshioterada.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yoshioterada.wordpress.com/713/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yoshioterada.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yoshioterada.wordpress.com/713/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yoshioterada.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yoshioterada.wordpress.com/713/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yoshioterada.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yoshioterada.wordpress.com/713/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yoshioterada.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yoshioterada.wordpress.com/713/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoshio3.com&#038;blog=11776107&#038;post=713&#038;subd=yoshioterada&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yoshio3.com/2010/02/26/%e3%81%93%e3%81%93%e3%81%8b%e3%82%89%e5%a7%8b%e3%82%81%e3%82%8b-java-ee-6-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f5b5cf8e8e2343a2915d94e1ca6f26e2?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">yosshi</media:title>
		</media:content>

		<media:content url="http://farm3.static.flickr.com/2716/4387372234_99c6ec3a79.jpg" medium="image">
			<media:title type="html">サンプルアプリケーションの処理フロー</media:title>
		</media:content>

		<media:content url="http://farm5.static.flickr.com/4043/4386609853_50e184f4bb_o.png" medium="image">
			<media:title type="html">サンプルアプリケーションの完成イメージ</media:title>
		</media:content>

		<media:content url="http://farm5.static.flickr.com/4055/4386609663_8de10a5c23.jpg" medium="image">
			<media:title type="html">パッケージの簡略化</media:title>
		</media:content>

		<media:content url="http://farm5.static.flickr.com/4061/4387371496_939e506cef.jpg" medium="image">
			<media:title type="html">新規プロジェクトの作成</media:title>
		</media:content>

		<media:content url="http://farm5.static.flickr.com/4018/4386609217_d95e3abdbd.jpg" medium="image">
			<media:title type="html">新規プロジェクト作成</media:title>
		</media:content>

		<media:content url="http://farm3.static.flickr.com/2801/4387371578_fa4474d953.jpg" medium="image">
			<media:title type="html">稼働サーバとフレームワークの選択</media:title>
		</media:content>

		<media:content url="http://farm3.static.flickr.com/2792/4386609291_cca7d30341.jpg" medium="image">
			<media:title type="html">フレームワークの選択</media:title>
		</media:content>

		<media:content url="http://farm5.static.flickr.com/4033/4387371682_243467ab86.jpg" medium="image">
			<media:title type="html">プロジェクト作成完了</media:title>
		</media:content>

		<media:content url="http://farm5.static.flickr.com/4051/4387371716_070ef86ef8.jpg" medium="image">
			<media:title type="html">エンティティークラスの作成</media:title>
		</media:content>

		<media:content url="http://farm5.static.flickr.com/4042/4386609403_f35a2c9768.jpg" medium="image">
			<media:title type="html">エンティティクラスの作成</media:title>
		</media:content>

		<media:content url="http://farm5.static.flickr.com/4034/4386609437_3ca1fc865b.jpg" medium="image">
			<media:title type="html">持続性ユニットの作成</media:title>
		</media:content>

		<media:content url="http://farm5.static.flickr.com/4014/4386609481_d265ee31c9.jpg" medium="image">
			<media:title type="html">EJB セッション Bean の作成</media:title>
		</media:content>

		<media:content url="http://farm5.static.flickr.com/4015/4386609511_c83e412d8e.jpg" medium="image">
			<media:title type="html">ステートレスセッション Bean の作成</media:title>
		</media:content>

		<media:content url="http://farm5.static.flickr.com/4069/4387372066_d7bb3f0d1b.jpg" medium="image">
			<media:title type="html">EJB 3.0</media:title>
		</media:content>

		<media:content url="http://farm5.static.flickr.com/4003/4387372112_465d84a623.jpg" medium="image">
			<media:title type="html">EJB 3.1</media:title>
		</media:content>

		<media:content url="http://farm5.static.flickr.com/4018/4387372136_dafbfa7429.jpg" medium="image">
			<media:title type="html">EJB 3.1</media:title>
		</media:content>

		<media:content url="http://farm5.static.flickr.com/4024/4389244246_68eac73ca5.jpg" medium="image">
			<media:title type="html">Managed Bean の作成</media:title>
		</media:content>

		<media:content url="http://farm5.static.flickr.com/4059/4386609553_bd22b79bcc.jpg" medium="image">
			<media:title type="html">JSF 表示画面の作成</media:title>
		</media:content>

		<media:content url="http://farm5.static.flickr.com/4028/4387371960_5e6b798339.jpg" medium="image">
			<media:title type="html">JSF 表示画面の作成</media:title>
		</media:content>

		<media:content url="http://farm5.static.flickr.com/4059/4386609553_bd22b79bcc.jpg" medium="image">
			<media:title type="html">JSF 表示画面の作成</media:title>
		</media:content>

		<media:content url="http://farm5.static.flickr.com/4070/4389319682_c7d13bfbac.jpg" medium="image">
			<media:title type="html">デフォルトページ</media:title>
		</media:content>

		<media:content url="http://farm5.static.flickr.com/4052/4389309630_1074f55616.jpg" medium="image">
			<media:title type="html">登録画面</media:title>
		</media:content>

		<media:content url="http://farm3.static.flickr.com/2743/4388541601_c5712bdabe.jpg" medium="image">
			<media:title type="html">一覧表示画面</media:title>
		</media:content>
	</item>
	</channel>
</rss>
