- ベストアンサー
JSPでBeanにセット
お世話になります。 JSPでフォームの各値に入るものをBeanにつめたいと思います。 strutsなどは特にコーディングしなくてもBeanに勝手にはいっていくとおもうのですが、 あれはいったいどうやって実現しているのでしょうか? リフレクションとかをつかって変数名からメソッド名をひっぱりだしてそれでsetPropertyとかをよんでいるのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
その通りです。 実際には、jakarta commons プロジェクト内の サブプロジェクト「BeanUtils」が、リフレクションを 扱いやすくするためのメソッド群を提供しており、 Strutsはそちらを利用しています。
その他の回答 (1)
- lawson
- ベストアンサー率44% (29/65)
私は、strutsを知らないので、 逆にそちらを教えていただきたいくらいです、 あくまで、1例ですが、 1) ServletのdoGet(または、doPost)メソッドの中の ローカル変数として、Beanクラスのオブジェクト をnew する。 なお、Beanクラスは implements Serializable しているものであれば なんでも良い。 private なフィールドに対する getアクセッサーをJSPのために定義する 2) (1)のBeanクラスのコンストラクタの中、または、 コンストラクタから呼び出されるオーバーライド 不可能なメソッド(privateなメソッド、または finalなメソッド)で、 ある一連の問い合わせ結果、たとえば、 JDBCを通じて、SELECTした結果の ResultSetオブジェクト(または、ResultSetから VectorやHashMapにデータを取得したオブジェクト) などをprivateなフィールド として保有する。 制御はServletが中心なので、 Beanクラスはたとえば、SELECT文の構成要素の一部を Servlet側から引数で受け取って、主に、自分 自身にデータを格納することを主眼においている。 Servlet側からnewされるだけで、自分自身の 中に、値を格納したり、 new された後、setXXXをした後、なんらかの メソッドが呼ばれることをきっかけにして自分自身に 値を格納するなど。 また、後述のhogehoge.jspのために、 getRowCount() getColCount() getValueAt(int, int) をアクセッサとして定義しているものとする。 3) Beanオブジェクトの生成および、業務ロジックの 結果の格納が完了したら、 ServletのdoGetまたは、doPostの中で、 request.setAttribute("beanID", beanオブジェクト); を実行して、リクエストの属性に、beanオブジェクト を格納する。 RequestDispatcher disp = getServletContext().getRequestDispatcher("/hogehoge.jsp"); として、hogehoge.jspにリクエストをリダイレクトする 4) hogehoge.jspの中で、 Beanクラスのオブジェクトを使用する時は、 <jsp:useBean id="beanID" type="パッケージ名.Beanクラス名" scope="request" /> とすると、 <%= beanID.getRowCount() %> <%= beanID.getColCount() %> <%= beanID.getValueAt(rowIndex, colIndex) %> out.println(beanID.getRowCount()); out.println(beanID.getColCount()); out.println(beanID.getValueAt(rowIndex, colIndex)); を必要な個所で用いるような 記述が可能になる。 このようにすることで、 jspはUIの見た目の部分のみに特化した ものになる。 以上 あくまで、一例。 私勘違いしているかもしれないので・・。 あまり、間に受けないようにご参考程度にしてください。
補足
早速のご回答ありがとうございます。 これはたとえていうと下り(表示)に関してですよね? 上り(フォームの値の吸い上げ)の場合はどのようにすればよいでしょうか? JSPで(最終的にはHTML)で使用されるフォームの名前に対応するBean中のフィールドにフォームの値を格納していです。 <input type="text" name="text1">であれば Bean中の public void setText1()メソッドが呼ばれて フィールドにセットされる感じです。 このsetText1部分をコーディングしなくても自動でセットされるイメージです。
お礼
ご回答ありがとうございます。 そうでしたか。 専門家の方の確認が取れましたので安心いたしました。 自分でも似たような実装をしたことがあったのですが、 実はもっとうまい方法があるのではと思っていたのですが、 着眼点はよかったのですね。 BeanUtilsというツールがあるのであれば、 車輪を改めて発明するのではなく 積極的に利用していきたいと思います。 ありがとうございました。