SAFluteの二つのきっかけ

SAFluteの基本となる特徴について。

SAFluteが生まれたきっかけ

SAFluteには、様々な最適化が施されていますが、実装を始めた最初の二つのきっかけがあります。

Action, JSP Name Identity
ActionクラスやJSPファイルの名前を識別しやすく
Action TypeSafe Return
Actionの@Executeメソッドの戻り値をタイプセーフに

Action/JSP Name Identity

アクションクラス名に一工夫

いわゆる IndexAction だらけ問題に対応しています。(ListActionだらけ、AddActionだらけ)

ぱっと見たいActionクラスがあっても、ctrl + shift + R (リソースの検索) をしたときに、大量の IndexAction や ListAction の前に立ち尽くしてしまう問題です。通常のSAStrutsにおけるクラス名とURLのマッピングルールは以下の通りです。

member.ListAction
/member/list/
login.IndexAction
/login/

できれば、MemberListAction でも /member/list/ にマッピングしたいと。そうすればクラス名による検索がしやすくなります。ただそのままでは /member/memberList/ というURLになってしまいます。

SAFluteでは、パッケージ名をクラス名のプレフィックスとして付与して識別性を高められます。

member.MemberListAction
/member/list/
login.LoginIndexAction
/login/

※例えば、/member/purchase/list/ であば MemberPurchaseListAction となる

JSPファイル名でも同じように

これは、JSPでも同じような拡張がされています。

s:form や s:link でaction属性やhref属性を省略した場合のマッピングは以下の通りです。

member.MemberListAction
/view/member/member_list.jsp
login.LoginIndexAction
/view/login/login_index.jsp (or login.jsp)

※例えば、/view/member/purchase/member_purchase_list.jsp であば MemberPurchaseListAction となる

通常のやり方と互換性があり

もちろん、以前のようなシンプルなクラス名やファイル名でも動きます。 単にマッピングの対象となるクラスが増えただけであり、既に通常のSAStruts構成のアプリにも適用しやすくなっています。

Action TypeSafe Return

タイプセーフな戻り値指定

Actionクラスの@Executeのメソッドの戻り値をタイプセーフに実装できます。

通常のSAStrutsにおける return の実装は以下の通りです。

e.g. 通常のSAStrutsにおける return の実装 @Java

// JSPファイル名を指定してフォワード
return "list.jsp";

// URL (Actionクラス) を指定してリダイレクト
return "/edit/" + listForm.memberId + "/?redirect=true";

これが、SAFluteでは以下のように実装できます。

e.g. SAFluteにおける return の実装 @Java

// "pa" で補完すればJSPの候補が出てくるので選ぶだけ
return path_Member_MemberListJsp;

// "redi" で補完して redirect メソッドにClassクラスでアクション指定
return redirectById(MemberEditAction.class, listForm.memberId);

FreeGenでJSPのパス定義を自動生成

JSPの path_Xxx の定義は、DBFlute の FreeGen と言われる機能で自動生成されます。JSPファイルを作成したら(作り途中でもOK)、manage.bat(sh)を叩いて 12 番を選びます。すると、Actionクラスの return 部分で pa で ctrl + space で補完すれば選択できます。

redirectメソッドでClassクラス指定

redirectXxx()メソッドは、Actionのスーパークラスに用意されています。redirectById() だけでなく、GETパラメーターを追加できるメソッドなど色々用意されています。XxxActon.class で指定できるので、リンク切れはありませんし、ctrl + クリック (F3) で遷移先のActionのプログラムをすぐに見ることができます。

間違えにくく、変更に強く、追跡しやすい

タイプセーフにすることで打ち間違えなく実装できるのと同時に、画面構造の変更などが発生したときに影響範囲を検知しやすくなります。 また、ctrl + クリック (F3) や ctrl + shift + G (呼び出し側の検索) と組み合わせることで、処理の追跡がしやすくなります。

実は、この改善は、アクションクラス名の識別性の向上が前提となっています。例えば、いくらタイプセーフでも、ListAction.class では、どの ListAction にリダイレクトするのかどうかがさっぱりわかりませんので。