• ベストアンサー

ActionとActionFormの記述

strutsを使用してデータベース接続を行っています。 ActionFormにはgetter、setterのみを記述、 Actionにはデータベース接続の確立、SQL文の取得、などを記述、 ActionFormにはgetter、setter、データベース接続の確立などを記述、 ActionにはfindForwardのみを記述、 現在、上記2通りの記述方法を使用しています。 そこで疑問なのですが、このまま2通りの記述方法を 使用するか、一つにするかを考えています。 特に、使用感に問題も無いのですが少々気になりました。 好みの問題等もあるのでしょうか。 よろしくお願い致します

  • Java
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • sire
  • ベストアンサー率62% (22/35)
回答No.2

ご指摘のように好みの問題かもしれませんが、 私は前者です。 ActionFormはあくまでFormとしてgetter、setterのみを定義して、 ロジックはロジックとして、Actionに持たせたほうがよいと思います。 もちろんアクションクラスにベタには書きませんが、 ロジッククラスを作っておいて、 アクションはロジッククラスを呼び出し、 ロジッククラスが、DB接続、SQL文発行しフォームに取得した値を設定し、 最後にアクションがフォワードする といった形でしょうか。 このあたりは、No1さんもおっしゃるとおり Strutsの各クラスの役割を理解して 明確にコーディング規約を作っておいたほうがよさそうですね。

green64
質問者

お礼

回答ありがとうございます。 アクションとフォームの役割をはっきりさせます。 その中でルールを定めます。

その他の回答 (2)

noname#45950
noname#45950
回答No.3

こんにちは。 私も前者の方です。 もっともgetter/setter以外に、formに関するflag等の設定処理が若干入っていたりもしますが。 でも、現状一番問題なのは「2つが混在していること」じゃないでしょうか? 特に「データベース接続の確立」の処理が記述されている場所がばらばらっていうのは、リファクタリング最優先事項だと思います。

green64
質問者

お礼

回答ありがとうございます。 やはり、統一させるべきなのですね。 皆様の言うとおり、ルール作りをはっきりとさせます。 この場を借りて、再び皆様にお礼を言わさせてもらいます。 どうも、ありがとうございました。

noname#19197
noname#19197
回答No.1

で、結局何が聞きたいんでしょうか? どっちがいいかアドバイスが欲しいということでしょうか? それなら、どちらか一方に決めた方がいいと思います。 ある程度のルールがないと煩雑になりメンテナンス性が悪くなります。 もうひとつ言うと、ActionFormはパターンでいうところのValuObjectです。 なので、ActionFormにビジネスロジックは含めるべきではないですね。 何の為にStrutsを使っているのか、MVCモデルとは何かを調べてみてください。

green64
質問者

お礼

こちらの言葉足らずで申し訳ありません。 StrutsやMVCモデルについて調べなおし、 ルールを定めようと思います。 まだまだ勉強不足だと痛感しました。 回答ありがとうございました。

関連するQ&A

  • ActionForm form にnullが入ってくる原因

    import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; public ActionForward execute( ActionMapping map , ActionForm form , HttpServletRequest request , HttpServletResponse response ) throws ServletException, IOException, ClassNotFoundException, SQLException { という記述をして このソースで落ちる原因を調べたら、ActionForm form の "form" でnullが入ってきていました。 なにか定義し忘れているのでしょうか?

    • ベストアンサー
    • Java
  • Strutsで「setterメソッドが見つかりません」

    Eclipse+TOMCAT環境でStrutsアプリを作っています。 とりあえずの勉強として、参考書に載ってあるサンプルを作っているのですが、会社では動いたそのサンプルを自宅で同じ手順で実行すると、「index.jsp(24,2) 属性 name のsetterメソッドが見つかりません」と表示されます。最初に表示されるはずのindex.jspファイル内に<html:form action="Lookup" name="lookupForm" type="wiley.LookupForm">と記述しており、ここの解析で出たエラーだと思われるのですが、ActionFormであるLookupFormクラスにはEclipseによるSetter/Getterメソッドの自動生成を行って記述しており、なぜエラーになるのかが分からない状態です。原因となりそうな点をお教えください。宜しくお願いします。

  • 【struts】 ActionFormで別のActionFormの配列を定義時

    皆様お疲れ様です。 現在strutsのコーディングをしているのですが躓いている箇所がございましてお力をお借りしたいと思い、質問させていただきます。 ActionForm_Aの中にActionForm_Bの配列型を宣言しています。 //その他変数色々あってその下 private ActionForm_B[] af_b; getter/setterとしては public ActionForm_B[] getActionForm_B() { return af_b; } public void setActionForm_B(final ActionForm_B[] setAfb) { this.af_b = setAfb; } です。jspで表示するのは出来ますが、取得する際に 「javax.servlet.ServletException:BeanUtils.populate」 が表示されてActionForm_Bの配列型が取得出来ません。 indexedもやっていますし、IterateのindexIdも指定しています。 <logic:iterate id ="af_b" name="af_a" property="af_b" scope="request" indexId="index"> <html:hidden name="af_b" property="name1" indexed="true"/> <html:hidden name="af_b" property="name2" indexed="true"/> </logic:iterate> 表示されているhidden部のhtmlは <input type="hidden" name="af_b[0].name1" value="鬼瓦権座武朗"> となっています。 これを表示している画面からsubmitしますと javax.servlet.ServletException: BeanUtils.populate と表示され落ちてしまいます。 これらの情報からなにか気付いた事、ご指摘等がありましたら是非ご意見を頂きたいと思います。 よろしくお願いします。

    • ベストアンサー
    • Java
  • struts:ActionFormの扱いについて

    いつもお世話になっております。 只今strutsの勉強中なのですが、 A.jspで入力させたものをB.jspで確認させ、 B.jsp画面でボタンが押されたらDBへ登録し完了画面C.jspを出す。 と言うようなものを作っております。 ActionFormはすべて同じものを使用しています。 遷移とDB登録は動きましたが、 問題なのはB.jspからDB登録処理を行うActionでFormがクリアーされてしまいます。 DB登録が完了するまでの間A.jspで入力された値を保持するような方法はないでしょうか? ご教授よろしくお願い致します。

    • ベストアンサー
    • Java
  • Strutsでoptionタグの作り方

    例えばActionFormのメンバにBeanのリストがあるとして、 JSPではStrutsのhtmlタグを使ってselectボックスのoptionに ActionForm内のBeanリストをセットする方法を教えて下さい。 具体的に実現したいことは以下のような事です。 例> // アクションフォーム public sampleForm extends ActionForm {  private List<sampleBean> sampleBeanList; // getter、setterは省略 } // JSPでStrutsタグ(<html:select>とか<html:options>)を使って以下のようなセレクトボックスを作成したい! // 実現方法をご存知のかた、どうかご教示ください。 <select> <option value="sampleBeanのプロパティ">sampleBeanのプロパティ</option> <option value="sampleBeanのプロパティ">sampleBeanのプロパティ</option> <option value="sampleBeanのプロパティ">sampleBeanのプロパティ</option> <option value="sampleBeanのプロパティ">sampleBeanのプロパティ</option> </select> ちなみに環境は以下の通りです。 Java 1.6 Struts 1.3.8 Tomcat 6 以上、宜しくお願い致します。

  • エラーページ遷移後に入力値を残す

    いつも参考にさせて頂いています。 strutsでアプリを作っています。 入力チェックをして不備があるとstrutsの<html:erros />タグにてエラーメッセージを表示しているのですが、その際に入力した値を残す処理ができなくて困っています。 私が思っていたのはrequestスコープにActionFormの値を設定すればいいのかな?と思っていたのですがうまくいきません。 (画面遷移、エラーメッセージ表示はできていますが、入力された値は消えてしまいます) 以下にソースの載せますのでご教授宜しくお願いします。 ■postでリクエストを投げるjsp <form action…> <input type="text" name="requestDto.nameKanji"> </form> ■値を取得したサーブレット //パラメータをアクションフォームから取得 TestActionForm actionForm = (TestActionForm)form; ActionMessages messages = new ActionMessages(); // 入力チェック inputCheck(actionForm, messages); // エラー処理 if(messages.size() != 0) { saveErrors(request, messages); ActionForm form = new ActionForm(); form.setRequestDto(actionForm.getRequestDto) // ここでアクションフォームをリクエストスコープに設定 request.setAttribute("ActionForm ", form); return ( mapping.findForward("error") ); } リクエストスコープに入れる名前、もしくは値が間違っているのでしょうか? どうか宜しくお願いします。 開発環境 jdk1.4_12 tomcat5.0 struts1.2

  • struts-config.xmlの記述方法について

    アクションがなく、 jspからjspをよびだしたいのですが、 struts-config.xmlへの記述方法がわかりません。 特例だとは思いますが、ご存知の方 教えてください。

    • ベストアンサー
    • Java
  • list<クラス名> とは何でしょうか?

    JAVA初心者のものです。 新規プロジェクトに向けてJAVAの習得に励んでおり、現在は「プロになるためのWeb技術入門」という本でフレームワークについて勉強しています。 ところでその本の中で次のコードがありますが、ここで List<ProductItem> は何を意味するものでしょうか? ご存知の方は教えてください。 なお、ProductItem は別の箇所で定義されたクラス名です。 public class ItemListShowAction extends Action { /* (non-Javadoc) * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { ProductLogic productLogic = new IbatisProductLogic(); List<ProductItem> productList = productLogic.getProductList(); request.setAttribute("productList", productList); return mapping.findForward("show"); } }

    • ベストアンサー
    • Java
  • 3層構造アーキテクチャ

    プレゼンテーション層、ファンクション層、データベース層と機能を分けて開発したときについてです。 (1)クライアントからAPサーバを介してSQLを発行する方式の場合、SQLを発行しているクラスはデータベース層に含まれるか?ファンクション層に含まれるか? (2)クライアントからSQLを発行する方式の場合、SQLを発行しているクラスはデータベース層に含まれるか?ファンクション層に含まれるか? (2)画面からローカルのcsvファイルを読み込む際、 データを保持しておくクラスや、そのメンバーのgetter/setterを実行するクラスはデータベース層に含まれるか? どこまでをデータベース層として呼んでいますか? ※開発チーム内の文化に依るとは思いますが、 一般的にはどうなのでしょうか? .

  • strutsのactionクラスで遷移先のBeanを取得する方法

    現在strutsを使用しているのですが,どうしても遷移先のBeanを取得出来ません。 状況としまして、JSP画面が2つあり(仮に画面A,Bとします)、画面Aから画面Bに遷移をしようとしています。 そして画面Aに使用しているプロパティ値を、画面Bにあるプロパティにセットした状態で表示したいのです。 現在actionクラスで画面Aのプロパティ値は、struts-configでnameを画面Aのbean名にすることで、取得できています。 しかし画面Bのbeanのプロパティにセットする際には、actionクラスの引数であるActionFormは画面Aのbeanを指定しているため、使用できず、新たに画面Bのbeanを呼ぶ必要があるのですが、その取得方法がわからないのです。 説明がわかりにくいかもしれませんが、その際は御指摘下さい。 宜しくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう