Как позвонить в службу Grails из gsp? - PullRequest
29 голосов
/ 24 марта 2010

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

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

Ответы [ 4 ]

41 голосов
/ 10 августа 2011

Лучше всего использовать библиотеку тегов, поскольку создание экземпляра службы непосредственно в представлении через загрузчик классов НЕ БУДЕТ автоматически связывать другие объявленные службы, которые могут жить в службе, которую вы пытаетесь использовать.

Используя библиотеку тегов, вы будете автоматически подключать эти службы.

В вашем представлении 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()
}

}
31 голосов
/ 15 октября 2013

Попробуйте - очень полезно

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

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

См. Это

Также это не рекомендуемая вещь, вы всегда можете использовать taglib

22 голосов
/ 10 октября 2012

Я думаю, что лучший способ сделать это:

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

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

11 голосов
/ 24 марта 2010
<%@ page import="com.myproject.MyService" %>
<%
    def myService = grailsApplication.classLoader.loadClass('com.myproject.MyService').newInstance()
%>

И тогда вы можете позвонить ${myService.method()} в вашем представлении GSP

Имейте в виду, что вызов транзакционных методов обслуживания из представлений снижает производительность. Лучше перенести все вызовы методов транзакционного обслуживания на контроллер (если вы можете)

...