6

私には1つのドメインがあり、そのドメインには25人以上のメンバーがいます。このメンバーの価値は、1つの形式からもたらされます。しかし、それらのあまりにも多くのフィールドを埋めるのは気分が悪いです。そこで、入力フォームをさまざまな段階に分割することを考えました。

必要なすべての入力のフィールドを持つFormObjectというクラスを作成しました。問題は、このオブジェクトをページ間で渡す方法がないことです。

セッションのスコープを持つサービスを使用すると、FormObjectへの参照を保持し、サービスからメソッドを呼び出して再度取得できるのではないかと考えていました。

<g:set var="formService" value="${new FormService()}" /> 

class FormService{
    static transactional = false
    static scope = "session"

    FormObject myObject = new FormObject()

    def resetForm(){
        myObject=new FormObject()
    }

    def getForm(){
        return myObject
    }
}

それをGSPに使用しました

<g:set var="myForm" value="${formService.getForm()}" />

ただし、データはページ間で保持されません。

myObjectプロパティを静的として定義した場合、それは持続しますが、これが本番環境に到達すると、myObjectがすべてのユーザー間で共有されるのではないかと心配しています。

静的にした場合にどうなるかを誰かが確認できますか?各セッションには静的フォームオブジェクトがありますか、それとも静的フォームオブジェクトは1つだけですか?

4

2 に答える 2

2

私は解決策を得ました...

最初のアプローチは近いですが、Spring Beanとして取得するのではなく、新しいインスタンスを作成しているため、セッションスコープであるという事実は機能しません。一般に、2ページを超えるワークフローがある場合は、WebFlowを確認する必要がありますが、それは必要以上に大きなソリューションになる可能性があります。

サービスラッパーをスキップして、オブジェクトをセッションに保存します。ここでのリスクは、何かが発生した場合にセッションをオブジェクトで汚染する可能性があり、オブジェクトを削除しないため、それを処理する必要があることです。

最初のコントローラーアクションで、オブジェクトがそこにあることを確認します。

def action1 = {
   ... regular work
   session.formObject = new FormObject()
   // return model, e.g.
   [foo: bar]
}

GSPではそれを参照できます

${session.formObject}
于 2013-02-01T18:10:58.563 に答える
1

私はおそらく別のアプローチを取り、コントローラーを介してモデルを介してフォームオブジェクトを提供します-すべての永続性の問題もコントローラーを介して行われるため、最初のアプローチは期待どおりに機能します...

function showForm() {
  render[view: 'view', model: [serviceForm: formService.form]]
}

function persistForm(MyCommand cmd) {
  // check cmd for errors
  if(cmd.hasErrors()) {
    // return the MyCommand object for error yielding
    render(view: 'view', model: [cmd: cmd]]
  }
  // persist cmd fields to formService.form object
  formService.form.field = cmd.field
}

これは期待どおりに機能するはずです

于 2013-02-05T10:41:18.713 に答える