2010-03-24 14 views
27

Bir hizmeti doğrudan bir görünümden nasıl çağırabilirim? Ben ${my.domain.service.method} ile çalışıyorum, ancak bu özelliği bulamazsınız şikayet ediyor.Bir gsp'den Grails servisini nasıl ararım?

Ve hayır, görünüm bir şablon olduğu için denetleyici kullanmak istemiyorum.

+0

da bkz http://stackoverflow.com/questions/ 1607186/nasıl yapılır çağrıları için bir bakışta hizmet-in-a-view – Gregor

cevap

9
<%@ page import="com.myproject.MyService" %> 
<% 
    def myService = grailsApplication.classLoader.loadClass('com.myproject.MyService').newInstance() 
%> 

Ve sonra

görünümlerinden işlem hizmet yöntemleri çağırmadan performansını acıyor unutmayın sizin gsp görünümde ${myService.method()} çağırabilir. Tüm işlemsel hizmet yöntem çağrılarınızı denetleyiciye taşımak daha iyi (eğer yapabilirseniz)

+0

Cevabınız için teşekkür ederiz. İşlemi = false ayarlıyorum, bu da performansı artırmalı. – xain

+0

Evet kesinlikle. – fabien7474

+8

Bu işe yaramakla birlikte, hizmetin model yoluyla görünümüne enjekte edilmesi veya hizmet için bir taglib oluşturması ve bunu görünümden kullanması çok daha şık olurdu. –

40

Etiket yükleyiciyi kullanmak için en iyisi, sınıf yükleyicisi aracılığıyla doğrudan görünümde bir hizmet örneği oluşturmamaya neden olabilir. Kullanmaya çalıştığınız hizmet.

Etiket kitaplığını kullanarak, bu hizmetlerin otomatik olarak kablolanmasını sağlayabilirsiniz. senin gsp görünüm sizin Taglib klasöründe <g:customTag param1="$modelObjec" param2="someString" />

(yourApp/grails-app/taglib/com/something/MyAppTagLib) olarak

:

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" 
    } 
} 

Sizin MyService:

package com.something 

class MyService { 

def anotherService // This will be auto-wired 

def method() { 
    anotherService.anotherMethod() 
} 

} 
+0

'u düşünerek çok da şaşırtıcı değil, bu en iyi cevaptır – iberck

20

Bunu yapmanın en iyi yolu olduğunu düşünüyorum:

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

Bu şekilde, otomatik olarak gönderilen hizmetleri kaybetmeden hizmet örneğini alırsınız.

+0

Bu aramanın farkının @ fabien7474'ün yanıtından hangisinde olduğunu söyleyebilir misiniz? –

+1

Spartacus'un cevabında, hizmetin yeni bir örneğini yaratır ve bu nedenle, tüm bağımlılıkları tatminsiz bir şekilde Hizmet'in sınıfının sade bir nesnesini alır. Benim cevabımda, servis çekirdeğini, daha önce ihtiyaç duyduğu fasulye ile enjekte edilmiş olan Çerçeve tarafından kullanılan kapsayıcıdan aldım. –

+1

@Spartacus Suganthan'ın cevabı benimkinden daha iyidir. –

29

bu deneyin - çok yararlı

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

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

Refer this

Ayrıca, bu recommened şey değil, her zaman Taglib kullanabilirsiniz

+4

en iyi yanıt –

+4

Kesinlikle en iyi yol –

+0

Alıştığım org.springframework.beans.factory.NoSuchBeanDefinitionException –