Как я могу вызвать службу непосредственно из представления? Я пытаюсь с ${my.domain.service.method}
, но он жалуется, что не может найти свойство.
И нет, я не хочу использовать контроллер, потому что представление является шаблоном.
Как я могу вызвать службу непосредственно из представления? Я пытаюсь с ${my.domain.service.method}
, но он жалуется, что не может найти свойство.
И нет, я не хочу использовать контроллер, потому что представление является шаблоном.
<%@ page import="com.myproject.MyService" %>
<%
def myService = grailsApplication.classLoader.loadClass('com.myproject.MyService').newInstance()
%>
И затем вы можете вызвать ${myService.method()}
в представлении gsp
Помните, что вызов методов транзакционных из представлений ухудшает производительность. Лучше всего переместить все вызовы метода транзакционной службы на контроллер (если можно)
Лучше всего использовать библиотеку тегов, потому что создание экземпляра службы непосредственно в представлении через загрузчик классов НЕ позволяет автоувеличивать другие объявленные службы, которые могут жить в службе, которую вы пытаетесь использовать.
Используя библиотеку тегов, у вас будет автоматическая проводка этих служб.
В представлении 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");
%>
Таким образом, вы получаете экземпляр службы, не теряя при этом службы, поддерживаемые автоматически.