如何从 gsp 调用 Grails 服务?

Posted

技术标签:

【中文标题】如何从 gsp 调用 Grails 服务?【英文标题】:How do I call a Grails service from a gsp? 【发布时间】:2011-01-31 10:35:46 【问题描述】:

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

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

【问题讨论】:

另见***.com/questions/1607186/… 【参考方案1】:

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

使用标签库,您可以自动连接这些服务。

在您的 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"
    

您的我的服务:

package com.something

class MyService 

def anotherService // This will be auto-wired

def method() 
    anotherService.anotherMethod()



【讨论】:

【参考方案2】:

试试这个 - 很有帮助

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

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

Refer this

另外这不是推荐的东西,你可以随时使用 taglib

【讨论】:

绝对是最好的方法 我得到 org.springframework.beans.factory.NoSuchBeanDefinitionException @spartacus 这不是一个普通的 Grails 类,我认为这只适用于服务类 (grails.org/doc/2.3.x/guide/services.html)【参考方案3】:

我认为最好的方法是:

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

这样,您可以在不丢失自动装配服务的情况下获得服务实例。

【讨论】:

你能告诉我这个电话和@fabien7474 的回答有什么区别吗? @spartacus 在他的回答中,他创建了一个新的服务实例,因此,他得到的只是一个 Service 类的普通对象,其所有依赖项都未得到满足。在我的回答中,我从框架使用的容器中获取服务 bean,已经注入了它需要的 bean。 @Spartacus Suganthan 的回答比我的要好。【参考方案4】:
<%@ page import="com.myproject.MyService" %>
<%
    def myService = grailsApplication.classLoader.loadClass('com.myproject.MyService').newInstance()
%>

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

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

【讨论】:

感谢您的回复。我设置了 transactional = false,这应该会提高性能。 虽然这可行,但通过模型将服务注入视图或为服务创建标签库并从视图中使用它会更加优雅。 @Urs 是的,但这不是问题的范围:“如何直接从视图调用服务?”。注意“直接”这个词 @Urs 将服务调用包装到 taglib 或模型中并不总是更优雅。假设您有一个服务,其中包含视图、控制器使用的许多计算方法(例如 100 种),那么这意味着您需要将所有 100 种方法封装到标签中!这不是真正的干燥。关于通过模型注入服务的第二个建议,它看起来不像是一个优雅的解决方案。与往常一样,没有子弹银,但许多情况都有许多解决方案 请注意,似乎即使服务的范围是默认的(单例),以这种方式创建的服务实例也不会与注入到项目其余部分的服务实例相同。 (考虑到“.newInstance()”,这并不奇怪。)

以上是关于如何从 gsp 调用 Grails 服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 grails 默认 gsp 编码中排除插件?

在 grails gsp 中调用标签不起作用

如何从 grails 视图文件夹中的 create.gsp 表单中隐藏几个字段?

Grails - 如何从表单调用控制器方法

如何在 Grails 中显示异常?

在 grails gsp 模板中,如何使用服务器端注释而不使站点网格抛出错误?