私は grails (2.2) を見ていますが、それはすべて美しく、魔法のようにさえ機能します。私はgrails create-controller
、render()、redirect()、params、request など、多くのメソッドとプロパティを使用できる、箱から出して作成された Controller クラスを見ています。これはどこに配線されていますか?コード/プロジェクト/フレームワークのどこで render() がメソッドとして利用可能になっていることがわかりますか? そして、それはどのように実装されていますか?Java 開発者として、私は継承とコード インジェクションとリフレクションに慣れています。また、javascript プロトタイプでは、いくつかのブラック マジックを実行できます。しかし、XXController.groovy は単なるスタンドアロン オブジェクトです。名前 (XXController) または場所 (grails-app/controllers?) ですか、それとも IDE が検出できるインジェクションが発生していますか?
2 に答える
Grails の素晴らしい世界へようこそ。ここに役立つリンクがいくつかあります。
- Web レイヤー ドキュメントのコントローラーのセクション。
- そしてrenderメソッドのドキュメント。コントローラで利用可能なその他のメソッドについては、右側の「クイック リファレンス」列を確認してください。
その魔法がどのように行われるのか疑問に思っている場合は、Grails はオープン ソース プロジェクトなので、いつものように Github にアクセスしてください (警告、これはかなり大きなプロジェクトです)。
Grails は、メタ プログラミングを強力にサポートする動的言語である Groovy の上で動作します。これは基本的に、Grails のすべての魔法のトリックです。
最後に、Grails は CoC (Convection over configuration) に基づくフレームワークであるため、コントローラーはディレクトリ "grails-app/controllers" の下にあり、接尾辞 "Controller" を持つ任意のクラスになります。(コントローラーのフォルダーには「commandObjects」もある場合があります)。
よく知られているアイデアとの統合も非常に強力です。ぜひチェックしてください。
編集 レンダリング メソッドがどのように動作するかについては、こちらの github を参照してください。そして、Controllers metaClass パッケージでより多くの inyected もの
Grails 2.0以降では、AST変換を使用して実装されています。以前は、GroovyMetaClassにメソッドを追加することで実装されていました。新しいアプローチの利点は、物事が少し速くなり、使用するメモリが少なくなることです。
GORMドメインクラスメソッドもこのアプローチを使用するようになり(メタクラスに動的に追加する必要があるfindByFooAndBarなどの動的メソッドを除く)、ASTがメソッドをバイトコードに追加するため、Javaから呼び出すことができるという利点があります。ただし、Webリクエストの結果としてGrails自体からのみ呼び出されるため、これはコントローラーには役立ちません。
厄介な詳細については、ControllersApiがメソッドの場所であり、 ControllerTransformerとControllersGrailsPlugindoWithDynamicMethods
のクロージャー内のコードの組み合わせによって各コントローラークラスに混合されます。