Подтвердить что ты не робот

Как я могу назвать услугу Grails из gsp?

Как я могу вызвать службу непосредственно из представления? Я пытаюсь с ${my.domain.service.method}, но он жалуется, что не может найти свойство.

И нет, я не хочу использовать контроллер, потому что представление является шаблоном.

4b9b3361

Ответ 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");
%>

Таким образом, вы получаете экземпляр службы, не теряя при этом службы, поддерживаемые автоматически.