Java:MVCでのフォーム送信:ベストプラクティスは何ですか?
-
06-07-2019 - |
質問
Strutsに少し似たMVCフレームワークを使用しています。 したがって、「編集ストア」があるとしましょう。私のアプリケーションのリンクは、これはURLがどのように見えるかです:
http:// localhost:9080 / test?action = editStore& storeNum = 10
今、アクションは、実行する私のアクション(Strutsアクションに類似)を決定します。ここで対応するアクションは、EditStoreActionです。これをクリックすると、編集用のストアのさまざまな属性を含むポップアップが開きます。
ここでの私の質問は: アクションを記述する方法このコンテキストで2つのアクションを記述できますか?
- レンダリングするEditStoreAction edit.jsp
- StoreSaveAction which ユーザーが押すと呼び出されます のレンダリングされた応答を受け入れる edit.jsp。
ORアクションを1つ書くだけですか? EditStoreActionとフォームを同じアクションに送信すると、ユーザーが送信時の変更のために[承認]ボタンを押したことがわかります。そのため、アクションの別のフローを実行し、更新をデータベースに保存して差分ページにリダイレクトします。
ここで最高の練習は何ですか?コードをモジュール化したまま、可能な限り多くのアクションを作成しますか?または、jspのすべてを処理するアクションを1つだけ作成しますか?
この質問は少し些細なことのように聞こえますが、すべてを正しくしたい場合があります。したがって、質問。ヘルプに感謝します。
解決
アイデアは、Spring MVCと同様に、アクションを特定のクラス(コントローラーなど)のメソッドにマッピングすることです。
したがって、あなたの場合、これらの2つのアクションは、同じクラスの2つの異なるメソッドにマッピングされます。クラス StoreFormController
と2つのメソッド editStore()
および saveStore()
を呼び出すことができます。
エンティティごとに2つのコントローラーを作成する場合は、さらに改善されます。 1つはすべてのGETリクエスト用で、もう1つはPOSTリクエスト用です。したがって、あなたの場合、他のすべてのリクエストには2つのコントローラー StoreController
があり、すべてのフォーム送信、つまりリクエストの送信には StoreFormController
があります。これで、GETである最初のアクションは StoreController
の editStore()
メソッドに移動し、2番目のPOSTリクエストは saveStore()
に移動します StoreFormController
のメソッド。リクエストタイプに基づいて、これら2つのクラスのいずれかで必要な数のメソッドを定義できます。
Spring MVC APIを知っていれば、私の出身地を簡単に確認できます。
他のヒント
アクションクラスで複数のメソッド(" execute")メソッドを定義できるため、Struts DispatchActionクラスを使用したいと思います。裏では、実行するメソッド(フォームで送信またはURLで渡す)を見つけ、リフレクションを使用してメソッドを見つけ、正しい引数セットで呼び出します(メソッドは同じである必要があります) " execute"メソッドの署名)、結果を取得して渡す。 DispatchActionは、単に「実行」をオーバーライドします。その動作を実装するActionクラスのメソッド。
つまり、あなたの場合、「DispatchStoreAction」というクラスを1つだけ定義し、「prepare」という2つのメソッドを定義します。および「保存」。私はまだ良いクラスの抽象化を持っているので、そのようにするのが好きです(そしてクラス名に実行している「アクション」を入れない)、あなたのメソッドは彼らが何をすべきかを明確に識別することができるのでまた、定義により、アクションクラスは小さくなる傾向があるためです。おそらく" StoreLogic"があるでしょう。または" StoreBusiness"どこかで定義され、このクラスは、作業中のエンティティに関連するビジネスロジックを処理します。個人的には" StoreAction"があればいいと思います。そして1つの" StoreLogic"と1つの" UserAction"および1つの" UserLogic"など-関係は1対1である必要はありませんが、コードの維持に役立つと思います。
これを行う方法については、DispatchActionクラスのソースコードを確認してください。ただし、実装は簡単なはずです。