【问题标题】:How to call a Grails service in a view?如何在视图中调用 Grails 服务?
【发布时间】:2009-10-22 13:27:18
【问题描述】:

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

有什么想法吗?

【问题讨论】:

标签: grails service view gsp


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    我发现,这个 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>
    

    【讨论】:

    • 我在通用标题视图中使用了它,因为每个页面都需要它
    • 从代码中可以明显看出这不是一个好的模式。
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

      您可以轻松地做到这一点,而无需使用 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-09
        • 1970-01-01
        相关资源
        最近更新 更多