ビューからサービスを直接呼び出すにはどうすればよいですか? ${my.domain.service.method}
、しかしそれは特性を見つけることができないと不平を言う。
ビューはテンプレートなので、いいえ、コントローラーを使いたくありません。
_<%@ page import="com.myproject.MyService" %>
<%
def myService = grailsApplication.classLoader.loadClass('com.myproject.MyService').newInstance()
%>
_
そして、あなたはあなたのgspビューで${myService.method()}
を呼び出すことができます
ビューからtransactionalサービスメソッドを呼び出すと、パフォーマンスが低下することに注意してください。すべてのトランザクションサービスメソッド呼び出しをコントローラーに移動することをお勧めします(可能な場合)。
クラスローダーを介してビューに直接サービスインスタンスを作成すると、使用しようとしているサービスに存在する可能性がある宣言された他のサービスが自動配線されないため、タグライブラリを使用するのが最適です。
タグライブラリを使用すると、これらのサービスの自動配線が行われます。
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()
}
}
これを試してください-非常に役立ちます
%{--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");
%>
これにより、自動接続されたサービスを失うことなく、サービスインスタンスを取得できます。