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

Methods in service doesn't work ok in the gsp file

我有一个包含两个按钮的列表,我希望每次按下一个按钮时,都运行与该按钮关联的代码。这段代码在一个服务里,gsp文件是默认的list.gsp

从 gsp 调用服务。我把这个 post:(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"
    }

}

我很确定这是不可能的;您要的是直接向 grails 服务发送 Ajax 调用。如果您考虑一下,一旦生成的 HTML 被客户端接收到,浏览器和后端(grails 应用程序)之间就没有直接连接,所以不可能有任何 grails 魔法允许这样做发生。

有一个 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"/>