NetBeansのVisual Web PackやJSF 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";
}
画面項目が一つ増えた場合を想像してみると・・・
雲泥の差かと、思います。
というわけで、次のプロジェクトはこのやり方に決めました。
よしっ、年末モードへ、ふらいあうぇ~い。