如何从gsp调用Grails服务?

xai*_*ain 29 service grails view gsp

如何直接从视图调用服务?我正在尝试${my.domain.service.method},但它抱怨它找不到属性.

不,我不想使用控制器,因为视图是模板.

car*_*tor 42

最好使用标记库,因为通过类加载器直接在视图中创建服务实例不会自动发送可能存在于您尝试使用的服务中的其他声明的服务.

使用标记库,您将自动连接这些服务.

在你的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"
    }
}
Run Code Online (Sandbox Code Playgroud)

你的MyService:

package com.something

class MyService {

def anotherService // This will be auto-wired

def method() {
    anotherService.anotherMethod()
}

}
Run Code Online (Sandbox Code Playgroud)


Sug*_*lai 31

试试这个 - 非常有帮助

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

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

请参阅此

这也不是一个推荐的东西,你总是可以使用taglib

  • 最好的答案 (5认同)
  • 绝对是最好的方式 (5认同)

Dav*_*ulo 22

我认为最好的方法是:

<%
    def myService = grailsApplication.mainContext.getBean("myService");
%>
Run Code Online (Sandbox Code Playgroud)

这样,您可以获得服务实例而不会丢失自动服务的服务.


fab*_*474 12

<%@ page import="com.myproject.MyService" %>
<%
    def myService = grailsApplication.classLoader.loadClass('com.myproject.MyService').newInstance()
%>
Run Code Online (Sandbox Code Playgroud)

然后你可以调用${myService.method()}你的gsp视图

请注意,从视图调用事务服务方法会损害性能.最好将所有事务性服务方法调用移动到控制器(如果可以)

  • 虽然这有效,但通过模型将服务注入视图或为服务创建taglib并从视图中使用它会更加优雅. (9认同)
  • 只是注意,似乎即使服务的作用域是默认的(单例),以这种方式创建的服务实例也不会与注入项目其余部分的服务实例相同.(考虑到'.newInstance()',这并不奇怪.) (3认同)