ここでの記事は、StrutsとSpringJDBCをうまく連携させる工夫です。
やろうとしていることは以下のことです。
検索の入力画面があって、いくつか検索キーがあります。
それらのキーを受け取ってDaoの呼び出し、画面に結果を表示します。
プログラム的には以下のことをしないといけません。
①パラメタの妥当性チェック(StrtusのValidatorが行います)
②パラメタをActionFormから一つずつ受け取って、Daoのメソッドの引数に1つずつ設定していきます。
③Daoでは、パラメタを一つずつ受け取って、SQL文に一つずつセットします。
意外と面倒だと思いません?
しかも、検索キーが増えると様々な箇所に影響がありそうです。
①はStrutsが行ってくれるので、②と③についてもう少し拡張性が高く、
簡単で見通しがよい方法を見てみましょう。
【前提】
基本思想は、以下のDaoの記事にありますので、まずこちらをお読みください。
・NamedParameterJdbcTemplateをうまく使うには?
上の記事では、検索キーをクラスにすることで、型を分かりやすくし、
SpringJDBCとの連携もスムーズにする工夫を書いています。
この工夫を行っていることが前提で話を進めていきます。
【HTML画面のサンプル】
検索条件を入力してください。<br>
<html:form action="search.do" method="post">
ID:<html:text property="id" /><br>
名前:<html:text property="name" /><br>
カナ:<html:text property="kana" /><br>
<html:submit value="検索" />
</html:form>
【Struts設定ファイルのform-beanタグのサンプル】
<form-bean name="schMemberKey" type="org.apache.struts.validator.DynaValidatorForm" >
<form-property name="id" type="java.lang.Integer"/>
<form-property name="name" type="java.lang.String"/>
<form-property name="kana" type="java.lang.String"/>
</form-bean>
【StrutsのActionのサンプル】
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) throws Exception {
// MemberSearchKey key = new MemberSearchKey();
//コピー PropertyUtils.copyProperties(key, form); List<Member> memberList = this.memberService.findMember(key); req.setAttribute("memberList", memberList);
return mapping.findForward("search");
}
Daoは以下の記事を参照。
・NamedParameterJdbcTemplateをうまく使うには?
【説明】
使用したいDaoのメソッドは、引数がMemberSearchKeyクラスになっています。
ですので、Actionのexecuteメソッドではそのクラスを作成して値を設定すれば処理終了です!
Apache Commonsでは、PropertyUtils.copyPropertiesというメソッドが用意されています。
これは、ActionFormから値をコピーするのです。
このとき、ActionFormのプロパティ名とコピー先のプロパティ名が一致するものをコピーします。
ここでは、key にActionForm の値をコピーしています。
PropertyUtils.copyProperties(key, form);
ですので簡単に言うと、html画面の中のパラメタをMemberSearchKeyへコピーしてくれます。
なんとこれだけで終了です。
あとはDaoでkeyを受け取って、よきに計らってくれます!
ね。簡単になりましたよね。
【MemberSearchKeyを使用するやり方の補足】
上記の方法のよいところは、あとで検索キーが増えたときも変更が容易ということはもちろん。
型の安全性も保持しているところです。
Daoのメソッドは、Strutsだけでなくバッチ系の処理でも使用する可能性があります。
Strutsだけなら、上記の方法で型が分からなくても困りません。
でも、他で使用するときは、ピリオドを押したときにeclipseがsetterを補完してくれるので
分かりやすいです。
これは地味に見えますが、システムが大きくなって機能が増えるほど威力を発揮します。
開発効率が上がるのと、間違いが減るので有用な方法だと思います。
参考:
・NamedParameterJdbcTemplateをうまく使うには?