如何在视图中调用Grails服务?

时间:2009-10-22 13:27:19

标签: grails service view gsp

简单问题: 我有一个服务类(比方说helpersService)和方法def constructURI(params)。 如何从模板视图中调用此方法。

我尝试了以下代码但没有成功

<% def helpersService  = new HelpersService() // or def helpersService
%>
<img src="${helpersService. constructURI(params)}"/>

但我得到以下结果:

No signature of method: com.HelpersService. constructURI() is applicable for argument types...

或(如果我使用def helpersService

Cannot invoke method constructURI() on null object 

有什么想法吗?

5 个答案:

答案 0 :(得分:19)

服务不适合在视图中使用。您可以创建一个TagLib,您可以通过依赖注入获取对服务的引用。

答案 1 :(得分:7)

假设您的视图由Controller呈现,一种更简单的方法是将操作的引用从操作传递到模型中的视图,即:

class someController {
  def someService
  def someAction = {
    render(view: 'someView', model: ['someService': someService])
  }
}

然后可以在视图中使用它。对于由视图呈现的模板,显然您还需要将引用传递给模板。但是要清楚,S。Puchbauer是对的;服务实际上不应该在视图中使用,并且您可能会遇到难以诊断的问题,尤其是与事务和Hibernate会话相关的问题。

答案 2 :(得分:2)

我发现,这个常规的内联代码可以工作:

<% def xxxService = application.getAttribute("org.codehaus.groovy.grails.APPLICATION_CONTEXT").getBean("xxxService") %>

您可以像这样调用服务的功能:

<g:select optionKey="key" from="${xxxService.getWhateverList()}" name="tarif" value="${accountInstance?.tarif}" ></g:select>

答案 3 :(得分:1)

我找到了一个使用以下代码的解决方法:

def helpersService = grailsApplication.classLoader.loadClass('HelpersService').newInstance()

然而,最好通过依赖注入使用Service,所以我将尝试Siegfried的建议。

答案 4 :(得分:1)

您可以使用set tag:

轻松完成此操作,而无需创建标记库
<g:set var="versionService" bean="versionService"/>
...
<p>version ${versionService.clientVersion}</p>

我在这里找到了这个解决方案:http://mrhaki.blogspot.com/2013/08/grails-goodness-use-services-in-gsp.html