jboss seam学習2


9.優れたツールサポート
開発者の生産性に焦点を当てたアプリケーションフレームワークでは、開発ツールのサポートが重要です.Seamは、SeamGenと呼ばれるコマンドラインベースのジェネレータを発表した.SeamGenはRuby-On-Railsのジェネレータと似ており、データベースから完全なCRUDアプリケーションを生成するなどの機能をサポートしており、賢い開発者は「編集/保存/ブラウザでの再ロード」などのステップ、テストサポートのある特性を通じて、webアプリケーションを改善します.
しかし、さらに重要なのは、SeamGen生成プロジェクトは、EclipseやNetBeansなどの主流のJava統合開発環境に依存しないことです.SeamGenがあれば、開発者はいつでも入門することができます.
10.コードを始めましょう
要するに、SeamはJavaEEアプリケーションの開発費用を削減するとともに、Java EE 5.0が持たない強力な新機能を追加した.次のセクション(本書の第2章から選択)では、Seamがどのように動作しているかを説明するための実際のコード例を示します.この本のすべての例のソースコードは、ウェブサイトhttp://www.michaelyuan.com/seam/を通じてダウンロードできます.
Seam Hello World
JBoss SeamはEJB 3とJSFの間の接着剤であり、これはJboss Seamの最も基本的で最も広範な応用である.Seamによって管理されるコンポーネントによって、Seamはこの2つのフレームワーク間のシームレスな(意図的に二重関係ではない)統合を可能にする.Webアプリケーション全体に注釈ベースのEJB 3 POJOプログラミングモデルを拡張した.層と層の間で、必要な手動JNDI検索がなくて、冗長なJSFがbeanの声明を支持することがなくて、facadeの方法が多すぎなくて、苦労した対象の伝達がなくて、速いです!
SeamでのJavaEEモードの使用を続行
従来のjava EEアプリケーションでは、JNDI検索、XML宣言コンポーネント、値オブジェクト、facadeなどの設計モードが強制的に使用されています.Seamは注釈ベースのPOJOでこれらの人為的なニーズを解消した.しかし,Seamアプリケーションで本当にそれらが必要とされる場合,これらのモードは自由に使用できる.
Seam webアプリケーションを作成するのは概念的に簡単です.次のコンポーネントをエンコードするだけです.
  • エンティティオブジェクトはデータモデルを表します.エンティティオブジェクトは、JPAまたはHibernateのPOJOオブジェクトである可能性があります.リレーショナル・データベース・テーブルに自動的にマッピングされます.
  • SFウェブページにはユーザインタフェースが示されている.ページはフォームを使用してユーザーの入力をキャプチャし、結果を表示します.フォームフィールドとそのデータは、エンティティbeanまたはエンティティbeanのセットにマッピングされたデータベーステーブルを表示します.
  • EJB 3セッションbeanまたは注釈されたSeam POJOは、JSF WebページのUIイベントプロセッサとして機能することができる.エンティティbeanにカプセル化されたユーザー入力を処理し、次のステップ(またはページ)に表示されるデータオブジェクトを生成します.

  • 以上のすべてのコンポーネントは、実行時に自動的に正しいページまたはオブジェクトに注入されるSeamによって管理されます.たとえば、ユーザーがボタンをクリックしてJSFフォームを発行すると、Seamはフォームドメインを自動的に解析し、エンティティbeanを構築します.そして、Seamは、同じSeamによって構築されたイベントプロセッサセッションbeanにエンティティbeanを転送して処理する.開発者は、コンポーネントのライフサイクルとコンポーネント間の相互関係をコードで管理する必要はありません.依存処理中は、テンプレートコードとXMLファイルがありません.
    この章では,hello worldの一例を用いて,Seamがウェブアプリケーションにどのように結合するかを明確に示す.この例では,ユーザがウェブフォームに名前を入力してSeamを「あいさつ」することができる.フォームを送信すると、アプリケーションはリレーショナル・データベースに名前を保存し、Seamに「挨拶」したすべてのユーザーを表示します.このアイテムの例は、本がダウンロードしたソースコードのHelloWorldフォルダにあります.それを確立するには、Apache ANT 1.6以上をインストールする必要があります(http://ant.apache.org/).HelloWorldディレクトリに入り、コマンドantを実行するとbuild/jars/helloworldが生成されます.earファイルは、Jboss ASインスタンスのserver/default/deployディレクトリに直接コピーできます.JBoss ASを起動し、Webサイトを開きます.http://localhost:8080/helloworld/.
    本書の例を実行するには、JEMS GUIインストーラを使用してSeamと互換性のあるJBoss ASをインストールすることをお勧めします.http://labs.jboss.com/portal/jemsinstaller/downloadsからJEMSインストーラをダウンロードできます.JBoss ASのインストールと導入のサポートが必要な場合は、付録A、「JBoss ASのインストールと導入」を参照してください.
    テンプレートとしてサンプルを使用することを歓迎し、自分のSeamプロジェクトをすばやく開始します(付録B「テンプレートとしてサンプルを適用する」を参照).あるいは、コマンドラインツールSeam Gen(4章「クイックアプリケーション開発ツール」を参照)を使用して、すべてのプロファイルを含むプロジェクトテンプレートを自動的に生成できます.この章では、ソースコードプロジェクトのディレクトリ構造を説明するのにわずかな時間を費やします.逆に,開発者がSeamアプリケーションを構築するために必要なコードと構成について集中的に議論する.これにより、テンプレートに制限されることなく、知識を任意のプロジェクト構造に適用できます.
    ソースディレクトリ
    SeamアプリケーションはjavaクラスとXMLまたはテキストプロファイルから構成されます.本書のプロジェクト例では、javaソースファイルはsrcディレクトリにあり、ページはviewディレクトリにあり、すべてのプロファイルはresourcesディレクトリにあります.詳細は添付ファイルBを参照し、テンプレートとして適用例を使用してください.
    1.データ・モデルの作成
    Helloworldアプリケーションのデータモデルは、nameとidのプロパティを持つpersonクラスにすぎません.注記@Entityは、コンテナにクラスをリレーショナル・データベース・テーブルにマッピングするように伝えます.各プロパティは、テーブル内のフィールドに対応し、各personインスタンスはテーブル内のレコードに相当します.Seamは非常に一般的な構成を採用しているため、コンテナはテーブル名とフィールドにクラス名と属性名のみが使用されます.属性idの@Idと@GeneratedValue注記は、idフィールドがプライマリ・キーであることを示し、アプリケーション・サーバがデータベースに保存されたperonオブジェクトごとに自動的に生成する値です.
    @Entity
    @Name("person")
    public class Person implements Serializable {
    
      private long id;
      private String name;
    
      @Id @GeneratedValue
      public long getId() { return id;}
      public void setId(long id) { this.id = id; }
    
      public String getName() { return name; }
      public void setName(String name) {this.name = name;}
    }

    Personクラスで最も重要な注記は@Nameで、Seamに登録するPerson beanの名前を指定します.他のSeamコンポーネント(例えば、ページおよびセッションbean)では、開発者は、管理されているPerson beanを参照するために「person」を直接使用することを指すことができる.
    2.データモデルをwebフォームにマッピングする
    JSFページでは、Person beanを使用してフォーム入力テキストフィールドをサポートします.#{person.name}記号は、Personエンティティbeanの一例である「person」というSeamコンポーネントのname属性を指す.
    <h:form>
    Please enter your name:<br/>
    <h:inputText value="#{person.name}" size="15"/><br/>
    <h:commandButton type="submit" value="Say Hello"
                     action="#{manager.sayHello}"/>
    </h:form>

    次のエンティティ・フォームを使用して、JSFページには、Seamに「hello」と言ったデータベース内のすべてのユーザーが表示されます.ユーザリストリストは、リストオブジェクトである「ファン」というSeamコンポーネントに格納されます.JSFdataTableはリストを巡回し、各行にPersonオブジェクトを表示します.ファンタグはファンリストの反復子です.
    <h:dataTable value="#{fans}" var="fan">
      <h:column>
        <h:outputText value="#{fan.name}"/>
      </h:column>
    </h:dataTable>
        

    図2.1ハローワールドのページを示す
    ユーザーが「Say Hello」ボタンをクリックしてフォームを提出すると、Seamは入力データでこのpersonコンポーネントを構築した.その後、「manager」というSeamコンポーネントのsayhello()というメソッド(このように、#{manager.sayHello}はフォーム送信ボタンのUIイベントプロセッサ)を呼び出し、データベースにpersonオブジェクトを保存し、ファンリストをリフレッシュします.managerという名前のコンポーネントはEJB 3のセッションbeanで、次の節でこの話題について説明します.
    2.Webイベントの処理
    Seamのmanagerという名前のコンポーネントは、クラス@Name注記で指定されているように、セッションbean ManagerActionです.ManagerActionクラスにはpersonとファンの2つの属性があり、この2つの属性は@Inと@Outによって注釈されている.
    @Stateless
    @Name("manager")
    public class ManagerAction implements Manager {
    
      @In @Out
      private Person person;
    
      @Out
      private List <Person> fans; 

    注記@Inおよび@OutはSeamプログラミングモデルにおいてコアとなっている.そこで、ここで何をしているのか見てみましょう.
    注記@Inは、セッションbeanにおいて、いずれかのメソッドを実行する前に、SeamがJSFフォームによって構築されたpersonコンポーネントという名前のpersonフィールドに割り当てられることをSeamに伝える(依存注入によって).開発者は@Inの注入コンポーネントに任意の名前を指定できますが、ここに示すように、Seamは同じタイプのコンポーネントと同じ名前のコンポーネントをこのフィールドに注入します.注記@Outは、任意の方法を実行すると、SeamがSeamによって管理されている同じ名前のコンポーネントに属性ファン値と属性personの値を割り当てることをSeamに伝えます.Seamでは,この操作を「依存放出」と呼ぶ.これにより、ManagerAction.sayHello()メソッドでは、属性ファンと属性personの値を更新するだけで、自動的にページに表示されます.
    双方向マッピングとは
    Seamファイルでは、「双方向マッピング」という用語が表示されることがあります.Seamによって管理されるコンポーネントとSeamによって管理される上下の間の注入と放出を指す.
    Person属性はすでに注入によってフォームデータを保持しているため、sayHello()メソッドはJPA Entity Managerのみでデータベースに保存され、JPA Entity Managerも@PersistenceContextによって注入されます.メソッドが戻ると、ファンとpersonオブジェクトが更新され、この2つのオブジェクトが投げ出されます.メソッドsayHello()は一般にnullを返し、呼び出し後に更新されたデータモデルが現在のJSFページに表示されることを示します.
      @PersistenceContext
      private EntityManager em;
    
      public String sayHello () {
        em.persist (person);
        person = new Person ();
        fans = em.createQuery("select p from Person p")
              .getResultList();
    
        return null;
      }

    いくつかの細部を除いて、私たちは基本的に完成しました.ManagerActionbeanクラスがマネージャインタフェースを実装していることに気づいたかもしれません.EJB 3セッションbean仕様を満たすために、bean内のすべてのビジネス・メソッドをリストできる方法が必要です.以下にインタフェースマネージャコードを示します.幸いなことに、どの高度なIDEツールでも簡単にこのインタフェースを自動的に生成できます.
    @Local
    public interface Manager {
      public String sayHello ();
    }

    これがHello Worldの例で必要なすべてのコードです.次の2章のセクションでは、Seamアプリケーションの他の方法と構成について説明します.開発者が自分の小型データベースアプリケーションのためにhelloworldプロジェクトをすぐに符号化およびカスタマイズしたい場合は、この章の残りの部分をスキップできます.