1

コントローラー内の複数のメソッド間でオブジェクトを共有したい場合、インスタンス変数を作成するのは間違っていますか? 例えば

class MyController {
    def index() {
        def user = verifyUserLogin()
        [messages:getMessages(user)]
    }

    private verifyUserLogin() {
        ...
        return user
    }

    private getMessages(user) {
        ...do something with `user`...
        return messages
    }
}

になるだろう

class MyController {
    private user

    def index() {
        verifyUserLogin()
        [messages:getMessages()]
    }

    private void verifyUserLogin() {
        ...
        this.user = user
        return
    }

    private getMessages() {
        ...do something with `user`...
        return messages
    }
}
4

3 に答える 3

2

Grails コントローラーは、リクエストごとに作成されるシングルトンではないため、インスタンス レベルの変数を使用しても問題はありません。

ただし、コードが長くなり始めると、変数を初期化して使用するコードの流れを理解するのが難しくなるため、個人的にはインスタンス レベルの変数をできるだけ宣言しないことを好みます。

むしろ、それらをパラメーターとして渡すことを選択します。ただし、そのような経験則はなく、目前の問題に大きく依存します。

于 2013-07-24T11:57:00.137 に答える
0

少なくともサーブレットでは、コントローラ間で状態を保存する従来の方法、つまりリクエスト間で情報を渡す方法は、sessionオブジェクトを使用することです。

class MyController(){
   def index(){
       session.user = getUser()
   }

   def postex(){
       def user = session.user
   }
}
于 2013-07-24T23:24:29.587 に答える
0

grails 3.2.1 では、コントローラーのデフォルトのスコープが、リクエストごとのコントローラー インスタンスである「プロトタイプ」から、各コントローラーの 1 つのインスタンスである「シングルトン」に変更されました。

これにより、スコープを変更しない限り、コントローラーのインスタンス変数は安全ではなくなりました!

https://docs.grails.org/3.2.1/ref/Controllers/scope.htmlシングルトン https://docs.grails.org/3.2.0/ref/Controllers/scope.htmlプロトタイプ

コントローラでインスタンス変数を使用したい場合は、スコープを変更してstatic scope = "prototype"ください。

インスタンス変数を使用する代わりに、リクエストに (リクエスト属性として) 変数を設定できます。request.user = userこれらはリクエストの存続期間中存続することに注意してください (リクエストがトラバースするすべてのインターセプターとビューに表示されます)。

于 2018-04-06T17:51:29.680 に答える