JSF+Spring+JPA

次のプロジェクトは、JSF+Spring+JPAで行ってみようと、ハラをくくりました。「XMLファイル=設計書」な構成を目指します。

NetBeansのVisual Web PackJSF from Entity自動生成機能を使ったラクラク開発を試みましたが、やっぱりやめました。前者は、リッチクライアントには向いてるかもしれませんが、単純なWebフレームワークとしては煩雑すぎます。
後者は悪くはないのですが、JSPとEntityの密結合感が気持ちわるい。カラムの変更程度には簡単に対応できそうですが、さほど柔軟な作りとは言えません。そこで、SpringFrameworkを入れて、次のような構成をとってみることにしました。



テストのやりやすさなどDIの利点はもちろんありますが、NetBeansの機能を捨ててもコレを採用した理由は2つあります。
1つ目は、設定ファイルに設計書としての役割を持たせて、情報を集約したかったから。もう一つは、NetBeansの入力支援です。

設定ファイル=設計書

上のポンチ絵に、ちょっと具体的なインスタンスを当てはめてみます。



この絵の内容を設定した faces-config.xml と applicationContext.xmlは、次のようになります。
(JSFとSpringのインテグレーション方法は、本家マニュアルを参照。)

■faces-config.xml
<faces-config>
 <!-- コントロール一覧サービスの関係 -->
 <managed-bean>
  <managed-bean-name>salary</managed-bean-name>
  <managed-bean-class>SalaryManagedBean</managed-bean-class>
  <managed-property>
   <property-name>salaryService</property-name>
   <value>#{salaryService}</value>
  </managed-property>
 </managed-bean>
 <!-- 画面一覧画面遷移 -->
 <navigation-rule>
  <from-view-id>/salary/index.jsp</from-view-id>
  <navigation-case>
   <from-outcome>show_person</from-outcome>
   <to-view-id>/salary/showperson.jsp</to-view-id>
  </navigation-case>
 </navigation-rule>
</faces-config>

■applicationContext.xml
<beans>
 <!-- サービス一覧エンティティの関係 -->
 <bean id="salaryService" class="service.SalaryServiceMock">
  <property name="person"><ref bean="person"/></property>
 </bean>
 <!-- エンティティ一覧 -->
 <bean id="person" class="entity.Person"/>
</beans>

もうこれさえ書けば、設計書いらず。むしろ、何十ページの文章や絵を描くよりも、このXMLの方が雄弁ではないでしょうか。もし(文化的に)許されるなら、このXMLに文章や絵を書き込みたいくらいですw
設計として足りないものは、項目とリファレンスくらいなので、あとはJSPソースやJavadocが語ってくれるはず。

JSF+Springは、自分の中では見事にハマりました。設計書の量を減らすことも確実なEoDですよね。このXMLを生成&ビジュアル化してくれると、なお良しですが・・。

NetBeansの !!ハンパじゃない!! 入力支援

結局 NetBeansの機能つかわねーのかよ!
との、ツッコミがとんできそうですが、この方法を選んだのは、NetBeansだからこそ。JSPエディタの入力支援が完璧だからです。標準のUIコンポーネント h:とかf:なら、WYSIWYGよりも、手でコーディングした方が早いでしょう。

タグライブラリはもちろん、faces-config.xml上のインスタンスから辿って、末端のBeanのプロパティまで、サジェスチョンしてくれます。
↓こんな風に。


この方法なら、こんな感じの入力とアクションになります。

 <h:inputText value="#{salary.service.person.firstName}"/>
 <h:inputText value="#{salary.service.person.lastName}"/>

 public String persist(){
   service.persistPerson();
   return "next_page";
 }

もしVisual Web Packを使うなら、ボタンのリスナーには、こんな気の滅入るコードを書かなければならないはずです。

 public String btn1_action(){
   person.setFirstName( getTextField1().getText() );
   person.setLastName( getTextField2().getText() );
   getRequestBean1().setPerson( person );
   return "next_page";
 }

画面項目が一つ増えた場合を想像してみると・・・
雲泥の差かと、思います。

というわけで、次のプロジェクトはこのやり方に決めました。
よしっ、年末モードへ、ふらいあうぇ~い。


コメント
匿名さん
2006/12/21
最近私もJSFだとかHibernateとかJPAだとか勉強し始めたので、この連載(?)すごく参考になってますm(__)m
(Javaから離れてた間にJPAなどというものが(;´Д`A ```)

VisualWebPack使ってみましたが、JPAの自動生成機能が使えなくて惜しい感じですね。値結合もエンティティに直接出来ないのかな。次期バージョンに期待でしょうか。
くりちゃん
2006/12/21
すいません。上のコメント名前書き忘れました;;
武田ソフト
2006/12/21
くりちゃん、いつもどーも。
私も最近あわてて情報かき集めてるところでして、
文章も支離滅裂です。読んでくれてるだけでありがたい。

#値結合もエンティティに直接出来ないのかな。

DataProviderっていうBeanにバインドするみたいですね。
SQLにバインドしたりできるみたいです。使いたくねぇ~

コメントしてください

closed.