服务中的方法在 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…"/></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"/>
我有一个包含两个按钮的列表,我希望每次按下一个按钮时,都运行与该按钮关联的代码。这段代码在一个服务里,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…"/></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"/>