Как я могу назвать услугу Grails из gsp?
Как я могу вызвать службу непосредственно из представления? Я пытаюсь с ${my.domain.service.method}
, но он жалуется, что не может найти свойство.
И нет, я не хочу использовать контроллер, потому что представление является шаблоном.
Ответы
Ответ 1
<%@ page import="com.myproject.MyService" %>
<%
def myService = grailsApplication.classLoader.loadClass('com.myproject.MyService').newInstance()
%>
И затем вы можете вызвать ${myService.method()}
в представлении gsp
Помните, что вызов методов транзакционных из представлений ухудшает производительность. Лучше всего переместить все вызовы метода транзакционной службы на контроллер (если можно)
Ответ 2
Лучше всего использовать библиотеку тегов, потому что создание экземпляра службы непосредственно в представлении через загрузчик классов НЕ позволяет автоувеличивать другие объявленные службы, которые могут жить в службе, которую вы пытаетесь использовать.
Используя библиотеку тегов, у вас будет автоматическая проводка этих служб.
В представлении 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()
}
}
Ответ 3
Попробуйте это - очень полезно
%{--Use BlogService--}%
<g:set var="blog" bean="blogService"/>
<ul>
<g:each in="${blog.allTitles()}" var="title">
<li>${title}</li>
</g:each>
</ul>
Обратитесь к этому вопросу
Также это не рекомендация, вы всегда можете использовать taglib
Ответ 4
Я думаю, что лучший способ сделать это:
<%
def myService = grailsApplication.mainContext.getBean("myService");
%>
Таким образом, вы получаете экземпляр службы, не теряя при этом службы, поддерживаемые автоматически.