服务方法在gsp文件中无法正常工作

时间:2015-12-01 13:01:23

标签: grails gsp

我有一个带有两个按钮的列表,我希望每次按下按钮时,都可以使用与此按钮关联的代码。此代码在服务中,gsp文件是默认的list.gsp

从gsp调用服务。我接受了这篇文章:(How do I call a Grails service from a gsp?)来做这件事。

问题是我在服务中有两种方法,我不知道为什么,但总是我输入list.gsp并且总是我按下按钮我可以看到在控制台中显示的grails两种方法同时工作。

每次按下按钮A或B时,我都可以在控制台中看到:

2015-12-01 12:51:47,565 [http-bio-8090-exec-5] 
hello
world

我想要的是,如果我按下按钮A显示:

2015-12-01 12:51:47,565 [http-bio-8090-exec-5] 
    hello

如果我按下按钮B显示:

2015-12-01 12:51:47,565 [http-bio-8090-exec-5] 
    world

这就是我每次运行时都可以在控制台中看到并输入gsp.file并且我希望不运行代码,除非我按下按钮:

2015-12-01 12:51:47,565 [http-bio-8090-exec-5] 
hello
world

提前致谢

这是我在gsp中的代码:

<%@ page import="com.app.test" %>
<%@ page import="mypackage.myService" %>
<!DOCTYPE html>
<html>
    <head>
        <meta name="layout" content="main">
        <g:set var="entityName" value="${message(code: 'licenseType.label', default: 'LicenceType')}" />
        <title><g:message code="default.list.label" args="[entityName]" /></title>
    </head>
    <body>
        <a href="#list-licenseType" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content&hellip;"/></a>
        <div class="nav" role="navigation">
            <ul>
                <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li>

                <% def LicenceTypeService = 
                grailsApplication.classLoader.loadClass('mypackage.myService').newInstance()%>

                <li><g:link action="list"><g:message code="Calculate Licence Type" args="[entityName]" /><span>${myService.calculate()}</span></g:link></li>
                <li><g:link action="list"><g:message code="Re-Calculate Licence Type" args="[entityName]" /><span>${myService.recalculate()}</span></g:link></li>       
            </ul>
        </div>

在服务中:

class MyService {

    def calculate(){
        println "hello"
    }

    def recalculate(VoiceUser vUser){
        println "world"
    }

}

1 个答案:

答案 0 :(得分:1)

我很确定这是不可能的;您要问的是直接向Grails服务发送Ajax调用。如果您考虑一下,一旦客户端收到生成的HTML,浏览器和后端(grails应用程序)之间就没有直接连接,因此不会有任何grails魔法允许这种情况发生。< / p>

有一个grails标记g:remoteLink允许Ajax调用控制器操作,此时控制器是必需的,因为生成的html到位后所有新的交互都必须通过标准HTTP请求和请求通过grails控制器处理。

最好的办法是创建一个包含2个服务方法的控制器,并将操作与g:remoteLink或其他Ajax请求一起使用。

<小时/> 至于在gsp中使用服务,而不是实例化新服务,我会主张使用现有的spring bean。

替换:

<%@ page import="mypackage.myService" %>
...
<% def LicenceTypeService = grailsApplication.classLoader.loadClass('mypackage.myService').newInstance()%>

使用:

<g:set var="myService" bean="myService"/>