【问题标题】:Methods in service doesn't work ok in the gsp file服务中的方法在 gsp 文件中无法正常工作
【发布时间】:2015-12-01 13:01:22
【问题描述】:

我有一个包含两个按钮的列表,我希望每次按下按钮时,都可以使用与该按钮关联的代码。这段代码在服务中,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"
    }

}

【问题讨论】:

    标签: grails gsp


    【解决方案1】:

    我相当肯定这是不可能的;您所要求的是将 Ajax 调用直接发送到 grails 服务。如果您考虑一下,一旦客户端接收到生成的 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"/>
    

    【讨论】:

    • 不要使用remoteLink 或任何remote 标签。它们很旧,不再受支持,它们在现代版本的 Grails 中消失了。这是一种不好的做法,您应该停止使用它们。
    • 我补充说你告诉我的:
    • 但是我还是有同样的问题
  • @JoshuaMoore,感谢您提供的信息。是否有用于进行 Ajax 调用的现代标签?我使用 angular 及其 $http 提供程序,所以我不熟悉严格的 grails 做事方式。
  • @DO,如果您指的是远程调用服务方法的初始问题,那么是的,&lt;g:set var="myService" bean="myService"/&gt; 语法无济于事,它只是获取服务引用的更好方法.
  • @tylerwal 任何现代 javascript 框架(例如 jQuery)都有自己的方法来标准化 AJAX 调用。据我所知,没有任何 Grails 标记库试图重现 remote 标记的相同功能。因为这个想法是有缺陷的。
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签