web-dev-qa-db-ja.com

gspからGrailsサービスを呼び出すにはどうすればよいですか?

ビューからサービスを直接呼び出すにはどうすればよいですか? ${my.domain.service.method}、しかしそれは特性を見つけることができないと不平を言う。

ビューはテンプレートなので、いいえ、コントローラーを使いたくありません。

29
xain
_<%@ page import="com.myproject.MyService" %>
<%
    def myService = grailsApplication.classLoader.loadClass('com.myproject.MyService').newInstance()
%>
_

そして、あなたはあなたのgspビューで${myService.method()}を呼び出すことができます

ビューからtransactionalサービスメソッドを呼び出すと、パフォーマンスが低下することに注意してください。すべてのトランザクションサービスメソッド呼び出しをコントローラーに移動することをお勧めします(可能な場合)。

12
fabien7474

クラスローダーを介してビューに直接サービスインスタンスを作成すると、使用しようとしているサービスに存在する可能性がある宣言された他のサービスが自動配線されないため、タグライブラリを使用するのが最適です。

タグライブラリを使用すると、これらのサービスの自動配線が行われます。

Gspビューで<g:customTag param1="$modelObjec" param2="someString" />

Taglibフォルダー(yourApp/grails-app/taglib/com/something/MyAppTagLib):

package com.something

class MyAppTagLib {

    def myService  // This will be auto-wired

    def customTag = { attribs ->
        def modelObj = attribs['param1']
        def someString = attribs['param2']

        // Do something with the params

        myService.method()

        out << "I just used method of MyService class"
    }
}

MyService:

package com.something

class MyService {

def anotherService // This will be auto-wired

def method() {
    anotherService.anotherMethod()
}

}
42
carnator

これを試してください-非常に役立ちます

%{--Use BlogService--}%
<g:set var="blog" bean="blogService"/>

<ul>
    <g:each in="${blog.allTitles()}" var="title">
        <li>${title}</li>
    </g:each>
</ul>

これを参照

また、これはお勧めできません。いつでもtaglibを使用できます

私はそれを行う最良の方法は次のとおりだと思います:

<%
    def myService = grailsApplication.mainContext.getBean("myService");
%>

これにより、自動接続されたサービスを失うことなく、サービスインスタンスを取得できます。

22
David Paulo