如何直接从视图调用服务?我正在尝试${my.domain.service.method}
,但它抱怨它无法找到该属性。
不,我不想使用控制器,因为视图是模板。
答案 0 :(得分:41)
最好使用标记库,因为通过类加载器直接在视图中创建服务实例不会自动发送可能存在于您尝试使用的服务中的其他已声明的服务。
使用标签库,您将自动连接这些服务。
在您的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"
}
}
您的MyService:
package com.something
class MyService {
def anotherService // This will be auto-wired
def method() {
anotherService.anotherMethod()
}
}
答案 1 :(得分:31)
试试这个 - 非常有用
%{--Use BlogService--}%
<g:set var="blog" bean="blogService"/>
<ul>
<g:each in="${blog.allTitles()}" var="title">
<li>${title}</li>
</g:each>
</ul>
这也不是一个推荐的东西,你可以随时使用taglib
答案 2 :(得分:22)
我认为最好的方法是:
<%
def myService = grailsApplication.mainContext.getBean("myService");
%>
这样,您可以在不丢失自动服务的情况下获得服务实例。
答案 3 :(得分:11)
<%@ page import="com.myproject.MyService" %>
<%
def myService = grailsApplication.classLoader.loadClass('com.myproject.MyService').newInstance()
%>
然后你可以在你的gsp视图中调用${myService.method()}
请注意,从视图调用事务性服务方法会影响性能。最好将所有事务性服务方法调用移动到控制器(如果可以的话)