6

简单的问题:我有一个服务类(比如说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 

有任何想法吗?

4

5 回答 5

20

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

于 2009-10-22T14:12:13.197 回答
7

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

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

然后可以按照您在视图中的期望使用它。对于视图渲染的模板,显然您还需要将引用传递给模板。不过要明确一点,S. Puchbauer 是对的。服务实际上不应该在视图中使用,并且您可能会遇到难以诊断的问题,尤其是与事务和 Hibernate 会话相关的问题。

于 2009-10-30T21:26:10.170 回答
2

我发现,这个 groovy 内联代码有效:

<% 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>
于 2009-12-19T09:25:18.250 回答
1

好吧,我找到了使用以下代码的解决方法:

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

但是最好通过依赖注入来使用 Service,所以我会尝试 Siegfried 的建议。

于 2009-10-22T14:43:00.200 回答
1

您可以轻松地做到这一点,而无需使用 set 标签创建标签库:

<g:set var="versionService" bean="versionService"/>
...
<p>version ${versionService.clientVersion}</p>

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

于 2015-09-01T09:32:40.327 回答